INTRODUCTION TO RIGIDBODIES The rigidbodies in Aerofly are box-shaped with a mass and a certain dimension, the InertiaLength. That length is used to calculate the inertia of the rigidbody. The higher the values the more torque required to rotate the object (principle of angular momentum). We use a solid cuboid to easily modify the inertia around the each of the three main axes of inertia: https://en.wikipedia.org/wiki/List_of_moments_of_inertia We get these values either from bounding box dimensions from the modelling tools or by estimation. The precise value is not that important, I wouldn't be able to tell a difference in behavior even if its 5% increased or decreased. For a landing gear: just estimate the physical size (e.g. 0.4m long, 1.1m wide and only 0.2m thick... that would give you: 0.4 1.1 0.2 Note: the inertia length represents the dimensions of the object in the local coordinate system. So if you rotate the rigidbody with the B0 matrix the inertia axes rotate with it, so you need to work out at which angle the gear is attached to the fuselage, say 30 degrees, then just plug that into my handy rotation matrix generator: https://www.aerofly-sim.de/dow…rotation-matrix-generator and out you get the B0 matrix for your gear: (I hand drew it in) Code <[rigidbody][LeftGear][] <[float64][Mass][100.0]> <[tmvector3d][InertiaLength][ 0.4 1.1 0.2 ]> <[tmvector3d][R0][ -0.5 1.5 -1.0 ]> <[tmmatrix3d][B0][ 1.0 0.0 0.0 0.0 0.866025 0.5 0.0 -0.5 0.866025 ]> > <[rigidbody][RightGear][] <[float64][Mass][100.0]> <[tmvector3d][InertiaLength][ 0.4 1.1 0.2 ]> <[tmvector3d][R0][ -0.5 -1.5 -1.0 ]> <[tmmatrix3d][B0][ 1.0 0.0 0.0 0.0 0.866025 -0.5 0.0 0.5 0.866025 ]> > VERY VERY BASIC TMD FILE (KAI503) <[file][][] <[modelmanager][][] <[pointer_list_tmuniverse][DynamicObjects][] // telemetry <[telemetry][Telemetry][] <[string8][Body][Fuselage]> > <[event_value][DEV0][] > // cameras start <[camera_head][CameraFollow][] <[string8][Body][Fuselage]> <[tmvector3d][R0][-9.0 0.0 2.0]> <[tmvector3d][Direction][1.0 0.0 0.0]> > <[camera_head][CameraPilot][] <[string8][Body][Fuselage]> <[tmvector3d][R0][-0.104 0.27 0.95]> <[tmvector3d][Direction][1.0 0.0 -0.1]> <[bool][InCockpit][true]> <[string8][Tags][cockpit pilot left]> > <[camera][CameraCoPilot][] <[string8][Body][Fuselage]> <[tmvector3d][R0][-0.104 -0.27 0.95]> <[tmvector3d][Direction][1.0 0.0 -0.1]> <[bool][InCockpit][true]> <[string8][Tags][cockpit copilot right]> > <[camera][CameraLeftWing][] <[string8][Body][LeftWing]> <[tmvector3d][R0][ -0.2 6.0 0.7 ]> <[tmvector3d][Direction][ 0.0 -0.999 0.0 ]> <[bool][InCockpit][false]> <[string8][Tags][left wing]> > // cameras end // rigidbody systems start // airframe <[rigidbody][Fuselage][] <[float64][Mass][387.0]> <[tmvector3d][InertiaLength][4.0 1.116 1.08]> <[tmvector3d][R0][0.612 0.0 0.396]> <[tmmatrix3d][B0][1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0]> > <[rigidbody][LeftWing][] <[float64][Mass][80.0]> <[tmvector3d][InertiaLength][1.53 3.5 0.3132]> <[tmvector3d][R0][-0.1 2.1 0.1116]> <[tmmatrix3d][B0][1.0 -0.0 0.0 -0.0 0.999800 0.019000 -0.0 -0.019000 0.999800]> > <[multibody_joint][JointFuselageLeftWing][] <[string8][Body0][Fuselage]> <[string8][Body1][LeftWing]> <[tmvector3d][X0][1.0 0.0 0.0]> <[tmvector3d][R0][-0.27 0.558 0.018]> <[float64][Kp][1000000.0]> <[float64][Kd][10000.0]> <[uint32][Type][0]> > <[rigidbody][RightWing][] <[float64][Mass][80.0]> <[tmvector3d][InertiaLength][1.53 3.5 0.3132]> <[tmvector3d][R0][-0.1 -2.1 0.1116]> <[tmmatrix3d][B0][1.0 -0.0 0.0 -0.0 0.999800 0.019000 -0.0 -0.019000 0.999800]> > <[multibody_joint][JointFuselageRightWing][] <[string8][Body0][Fuselage]> <[string8][Body1][RightWing]> <[tmvector3d][X0][1.0 0.0 0.0]> <[tmvector3d][R0][-0.27 -0.558 0.018]> <[float64][Kp][1000000.0]> <[float64][Kd][10000.0]> <[uint32][Type][0]> > // rigidbody systems end > <[pointer_list_tmuniverse][GraphicObjects][] <[rigidbodygraphics][Fuselage][] <[uint32][PositionID][Fuselage.R]> <[uint32][OrientationID][Fuselage.Q]> <[string8][GeometryList][ Fuselage Leftwing Rightwing ]> > <[pointer_list_tmuniverse][SoundObjects][] > > > THE INFAMOUS BUTTON EXPLAINED The input_button has no physics output, just an automatic output to the graphics section. And it can trigger sounds but that is it. If the button should toggle something (on/off), then add the button and add a second thing: an input_binary -> output can be used in dynamics if the button should step through something: add a separate input_discrete -> output can be used in dynamics if the button should light up a lamp while it is depressed: use a separate input_active -> output can be used in dynamics if the button should perform some form of event: use a separate input_event -> calls other events, has no output either but can beform some one time action to change a state We do this to keep the logical function of the button away from the button itself. The button itself should be stupid, just moving into the panel when pushed and moving back out when released. The function it performs is not actually created by the button itself. In the real aircraft there is some computer chip that registers that an electric connection was made and that chip then performs a digital function. So yeah. Our input_button doesn't actually do much. All the effects of the button push are covered by logic elements like the input_binary, input_discrete, etc. LATCHED BUTTON Instead of using an input_button just use an input_binary with an output to the graphics and a toggle qualifier in the controls. Click it and it stays in. The lever can be locked using the InputEnable. Sending 1.0 into that input makes it move, sending it 0.0 locks it. So you could do sth like: InputEnable <- logic_or ThrottleAboveIdle (logic_greater) || ButtonPressed (your input_binary) LATCHED BUTTON RESET AT A VALUE (0.3 NH value) Dynamics code <[input_switch][StarterNo1ButtonPressed][] <[string8][Input][Controls.Engine1Start]> <[float64][Value][0.0]> <[string8][Events] [ ButtonSoundConsole.Trigger ]> <[string8][EventsRelease][ ButtonSoundConsole.Trigger ]> > <[event_edge][StarterNo1ButtonReset][] <[string8][Input][LeftEngineNH.Output]> <[string8][Events][ StarterNo1ButtonPressed.Reset]> <[bool][Rising][true]> <[float64][Threshold][0.3]> > <[output_free][StarterNo1ButtonPressedOutput][] <[string8][Input][StarterNo1ButtonPressed.Output]> > Graphics code (attached to throttle handle via [Graphics] line <[movinggraphics][StarterNo1ButtonGraphics][] <[string8][Graphics][Throttle1Lever]> <[string8][GeometryList][ StarterNo1]> <[tmvector3d][Axis][ 0.9578 0.0000 0.2874 ]> <[string8][AngleID][StarterNo1ButtonPressed.Output]> <[float64][Pos0][-0.001]> <[float64][Pos1][0.002]> > MAPPING EXPLANATION <[graphics_mapping][RadarAltimeterPilotMapping][] <[string8][Input][RadarAltimeterPilot.Output]> <[tmvector2d][Map][(0.0 0.0) (15.24 0.873) ( 30.48 1.746) (60.96 3.49) (152.4 3.926) (304.8 4.545) (1524.0 5.585) ]> > Regarding the mapping itself: It's always (Input -> Output), All values are sorted increasing by the first value e.g. (0.0 ....) (0.8 ...) (0.81 ...) (1.0 ...) The second value of each pair is the output value for that for the respective input, they can go up and down as you need them to. BITE TEST FLASHING LIGHT I Needed a flashing light for 10 seconds. So here is the code // Radar Warning test <[input_button][RadarTestButton][] <[string8][Input][RadarTest]> <[string8][Events][ ButtonSoundConsole.Trigger ]> <[string8][EventsRelease][ ButtonSoundConsole.Trigger ]> > <[input_event][RadarTestButton_Clicked][] <[string8][Input][RadarTest]> <[string8][Events][ RadarWarningTest.Trigger ]> > <[event_pulse][RadarWarningTest][] <[float64][Duration][10.0]> > <[output_free][RadarWarningTestOutput][] <[string8][Input][RadarWarningTest.Output]> > FUEL SYSTEMS MassFull is the new name for MaximumQuantity, the latter will be removed at some point. They both control the internal MassFull varibale, I just left the old name in so that the user aircraft won't crash right away but they will eventually crash if they don's switch to MassFull (just not yet). To mix multiple fuel inputs for a tank you should use the fuel_line and just keep adding fuel onto it. The fuel collector tank is then just connected to the fuel line. But: this is not working 100% consistently, so you can overfill the collector tank and it will happily void some of the fuel (simulated as if it would overflow through the fuel vents). EXAMPLE FUEL SYSTEM FROM LYNX MK7 Works great to start with but pressure drops to zero after 90 seconds or so, as Jan said in his original post, fuel system is stiil causing problems and is being worked on. I Think of it as, pressure and flow in, do what you have to (pump, valve etc), pressure and flow out, use this as next pressure and flow in // Fuel System Left // Left Forward Fuel Tank <[fuel_line][LeftFwdTankFuelLine][] <[float64][Pressure][101325.0]> > <[fuel_tank][LeftForwardTank][] <[float64][MassFull][95.5]> <[float64][FillLevel][1.0]> <[string8][InputPressure][LeftFwdTankFuelLine.Output]> <[string8][AddFlow] [LeftFwdTankFuelLine.AddFlow]> > <[fuel_line_connection][LeftFwdTankToTransferPump][] <[string8][Body][Fuselage]> <[tmvector3d][R0][ 1.143 -0.2 -0.057 ]> <[tmvector3d][R1][ 0.099 -0.30 -0.087]> <[string8][InputPressure0][LeftFwdTankFuelLine.Output]> <[string8][InputPressure1][LeftFwdTankFuelLineLow.Output]> <[string8][AddFlow0] [LeftFwdTankFuelLine.AddFlow]> <[string8][AddFlow1] [LeftFwdTankFuelLineLow.AddFlow]> > <[fuel_line][LeftFwdTankFuelLineLow][] <[float64][Pressure][101325.0]> > <[fuel_pump][LeftTransferFuelPump][] <[float64][MaximumDeltaPressure][2000.0]> <[string8][Input] [SwitchFuelTransferNo1.Output]> <[string8][InputPressure0][LeftFwdTankFuelLineLow.Output]> <[string8][InputPressure1][LeftFwdTankTransferFuelLineLow.Output]> <[string8][AddFlow0] [LeftFwdTankFuelLineLow.AddFlow]> <[string8][AddFlow1] [LeftFwdTankTransferFuelLineLow.AddFlow]> > <[fuel_line][LeftFwdTankTransferFuelLineLow][] <[float64][Pressure][101325.0]> > <[fuel_valve][LeftFwdTankShutOffValve][] <[string8][Input] [FuelTransferNo1On.Output]> <[string8][InputPressure0][LeftFwdTankTransferFuelLineLow.Output]> <[string8][InputPressure1][LeftFwdTankFuelLinePostPump.Output]> <[string8][AddFlow0] [LeftFwdTankTransferFuelLineLow.AddFlow]> <[string8][AddFlow1] [LeftFwdTankFuelLinePostPump.AddFlow]> > <[fuel_line][LeftFwdTankFuelLinePostPump][] <[float64][Pressure][101325.0]> > <[fuel_check_valve][LeftCollectorTankFwdCheckValve][] <[string8][InputPressure0][LeftFwdTankFuelLinePostPump.Output]> <[string8][InputPressure1][LeftFwdToCollectorTankFuelLine.Output]> <[string8][AddFlow0] [LeftFwdTankFuelLinePostPump.AddFlow]> <[string8][AddFlow1] [LeftFwdToCollectorTankFuelLine.AddFlow]> > <[fuel_line][LeftFwdToCollectorTankFuelLine][] <[float64][Pressure][101325.0]> > // Left main Tank <[fuel_line][PortMainTankFuelLine][] <[float64][Pressure][101325.0]> > <[fuel_tank][FuelTankPort][] <[float64][MassFull][248.0]> <[float64][FillLevel][0.8]> <[string8][InputPressure][PortMainTankFuelLine.Output]> <[string8][AddFlow] [PortMainTankFuelLine.AddFlow]> > <[output_free][FuelTankPortOutput][] <[string8][Input][FuelTankPort.Output]> > <[fuel_line][PortTankFuelLineLow][] <[float64][Pressure][101325.0]> > // Left Collector Tank <[fuel_line_connection][LeftCollectorTankFeed][] <[string8][Body][Fuselage]> <[tmvector3d][R0][ 1.143 -0.2 -0.057 ]> <[tmvector3d][R1][ 0.099 -0.30 -0.087]> <[string8][InputPressure0][LeftFwdToCollectorTankFuelLine.Output]> <[string8][InputPressure1][PortTankFuelLineLow.Output]> <[string8][AddFlow0] [LeftFwdToCollectorTankFuelLine.AddFlow]> <[string8][AddFlow1] [PortTankFuelLineLow.AddFlow]> > <[fuel_line][LeftCollectorTankFeedFuelLine][] <[float64][Pressure][101325.0]> > <[fuel_tank][LeftCollectorTank][] <[float64][MassFull][129.0]> <[float64][FillLevel][1.0]> <[string8][InputPressure][LeftCollectorTankFeedFuelLine.Output]> <[string8][AddFlow] [LeftCollectorTankFeedFuelLine.AddFlow]> > <[fuel_line][LeftCollectorTankFuelLine][] <[float64][Pressure][101325.0]> > <[fuel_pump][LeftLPFuelPump][] <[float64][MaximumDeltaPressure][2000.0]> <[string8][Input] [SwitchFuelLPPumpNo1On.Output]> <[string8][InputPressure0][LeftCollectorTankFeedFuelLine.Output]> <[string8][InputPressure1][LeftCollectorTankLPPumpFuelLine.Output]> <[string8][AddFlow0] [LeftCollectorTankFeedFuelLine.AddFlow]> <[string8][AddFlow1] [LeftCollectorTankLPPumpFuelLine.AddFlow]> > <[fuel_line][LeftCollectorTankLPPumpFuelLine][] <[float64][Pressure][101325.0]> > <[fuel_valve][LeftEngineLPShutOffValve][] <[string8][Input] [SwitchFuelLPCock1On.Output]> <[string8][InputPressure0][LeftCollectorTankLPPumpFuelLine.Output]> <[string8][InputPressure1][LeftEngineLPFuelLine.Output]> <[string8][AddFlow0] [LeftCollectorTankLPPumpFuelLine.AddFlow]> <[string8][AddFlow1] [LeftEngineLPFuelLine.AddFlow]> > <[fuel_line][LeftEngineLPFuelLine][] <[float64][Pressure][101325.0]> > // left engine feed <[logic_invert][Engine1FuelValveTarget][] <[string8][Input][CutOffLeft.Output]> > <[fuel_valve][LeftEngineFeedShutOffValve][] <[string8][Input] [Engine1FuelValveTarget.Output]> <[string8][InputPressure0][LeftEngineLPFuelLine.Output]> <[string8][InputPressure1][LeftEngineFuelLine.Output]> <[string8][AddFlow0] [LeftEngineLPFuelLine.AddFlow]> <[string8][AddFlow1] [LeftEngineFuelLine.AddFlow]> > <[fuel_line][LeftEngineFuelLine][] <[float64][Pressure][101325.0]> > <[fuel_pump][LeftEngineDrivenFuelPump][] <[float64][MaximumDeltaPressure][206842.8]> <[string8][Input] [1.0]> <[string8][InputPressure0][LeftEngineFuelLine.Output]> <[string8][InputPressure1][LeftEngineHPFuelLine.Output]> <[string8][AddFlow0] [LeftEngineFuelLine.AddFlow]> <[string8][AddFlow1] [LeftEngineHPFuelLine.AddFlow]> > <[fuel_line][LeftEngineHPFuelLine][] <[float64][Pressure][101325.0]> > <[fuel_metering_unit][LeftEngineFuelMeteringUnit][] <[string8][Input][LeftFuelController.Output]> <[float64][MaximumFlow][0.5]> <[float64][Stiffness] [30.0]> <[float64][Speed] [0.5]> <[string8][InputPressure0][LeftEngineHPFuelLine.Output]> <[string8][InputPressure1][LeftEngineReturnFuelLine.Output]> <[string8][AddFlow0] [LeftEngineHPFuelLine.AddFlow]> <[string8][AddFlow1] [LeftEngineReturnFuelLine.AddFlow]> > <[fuel_line][LeftEngineReturnFuelLine][] <[float64][Pressure][101325.0]> > <[sum][PowerLever1SSL][] <[string8][Inputs][ PowerLever1Mapping.Output SSLRotationAngle.Output]> > <[fuel_control_unit][LeftFuelController][] <[string8][InputThrottle][PowerLever1SSL.Output]> <[string8][InputCondition][PowerLever1SSL.Output]> <[string8][InputNH][LeftEngineNH.Output]> <[float64][NHLightUpFlatEnd] [0.34]> <[float64][NHLowIdle] [0.38]> <[float64][NHHighIdle] [0.50]> <[float64][NHRating] [1.02]> <[float64][ThrottleMap] [ ( 0.0 0.0 ) ( 1.0 1.0 ) ]> <[float64][FuelFlowLightUpFlat][0.01637]> <[float64][FuelFlowLowIdle] [0.01385]> <[float64][FuelFlowMaximum] [0.075]> <[float64][NHTarget] [0.50]> > <[fuel_check_valve][LeftReturnCheckFuelValve][] <[string8][InputPressure0][LeftEngineReturnFuelLine.Output]> <[string8][InputPressure1][PortMainTankFuelLine.Output]> <[string8][AddFlow0] [LeftEngineReturnFuelLine.AddFlow]> <[string8][AddFlow1] [PortMainTankFuelLine.AddFlow]> > FUEL CONTROLLER here are all properties that are available currently: Code <[fuel_control_unit][FuelController][] <[string8][InputThrottle][PowerLever.Output]> <[string8][InputReverser][0.0]> <[string8][InputCondition][1.0]> <[string8][InputNH][EngineNG.Output]> <[float64][NHLightUpFlatEnd] [0.34]> <[float64][NHLowIdle] [0.58]> <[float64][NHHighIdle] [0.60]> <[float64][NHRating] [1.00]> <[float64][NHTarget] [0.60]> <[float64][ThrottleMap] [ ( 0.0 0.0 ) ( 1.0 1.0 ) ]> <[float64][FuelFlowLightUpFlat][0.01637]> <[float64][FuelFlowLowIdle] [0.01385]> <[float64][FuelFlowMaximum] [0.07]> <[float64][PFuelFlowNH] [0.4]> <[float64][PFuelFlowThrottle] [0.05]> <[float64][PFuelFlowReverse] [0.02]> > The FuelFlowLowIdle, Maximum control the fuel flow range (in kg/s) which are basically the hard limits for your low ground idle (where the engine can run without assistance and your full power (which melts your engine). PFuelFlowNH is a constant that defines how much fuel is to be added per target NH increase, that is roughly: (fuel_max - fuel_idle) / (nh_max - nh_idle) - more means the engine will add a lot of fuel to accelerate up to target nh and less means not burning up in flames. PFuelFlowThrottle is a feed forward control from the InputThrottle, that's like how much fuel goes in - can be tuned via throttle map FuelFlowLightUpFlat controls how much fuel is injected for the first part of the engine start - that fuel should be enough to stabilize the flames but shouldn't flood the engine at such low speeds - NHLightUpFlatEnd is defines the NH at which the controller switches to NH governing mode. The NH start is when you manually introduce fuel but you could just use a logic_greater NH > some value to change your condition lever input. NHTarget is the target rotation speed at the start of the simulation, needed because internally the FADEC ramps the target up and down slowly. NHRating is the maximum takeoff power core rotation speed, which could be 1.07 or 107% or 1.04 (104% NH) ThrottleMap is a mapping from your throttle input to a fraction between NHIdle and NHRating, for input 0.5 that mapping above returns the half way point between idle and rating. So basically nh_target = nh_idle * ( 1.0 - mapping_value ) + nh_rating * mapping_value. This is very useful because the actual thrust or power curve of the engine tends to be non-linear, this would be a way to counter that and could artificially increase the target NH early so that you have 50% thrust or power for 50% throttle input. Normally this would not be the case because the engine components get more efficient for higher power settings (towards their design power setting). The condition lever has a cut off range from 0.0 to about 0.1 I think and above that it goes from low idle target to high idle target (which you can adjust if you need) - you can think of that as your engine start/stop switch if your helicopter has that, if not - it probably has a cut off switch, then use that. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ENGINES Generally speaking this is how our engine stimulation works: Each turbo component simulates the thermodynamic process of that part with compressor maps, turbine maps, efficiency coefficients, etc. etc. These parts together create what we call an engine. Currently the only place we can adjust is the fuel flow, but we might add stuff like reverser flaps, mach inlets, variable stator vanes, bleed air extraction, etc. And we have connections to the outside using gear boxes to the core shaft and also the power turbine shaft. Those connections are necessary for the generators and starters. The fuel flow that we add to the combustion chamber is in kg/s and it can either be controlled fully manually if you create some form of mapping from the throttle lever or it can be fed through the simple fuel_controller, which is pretty stupid on its own, or it can be generated by the FADEC which can have more complex, fully digital control loops. So far we have only implemented a few FADECs specifically for that particular engine (see q400) but I think when we add more FADECs for the turbofans for example, we might create a more generic FADEC which can handle a certain engine category (e.g. twin spool high bypass turbofans or an afterburning jet fighter engine or maybe even a helicopter one with rotor speed governing, etc.) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ENGINE ROTATION SPEEDS RotationSpeed is the speed at which the shaft spins at the beginning of the simulation (initial rotation speed) DesignRotationSpeed is exactly that - the speed at which the compressor or turbine are designed to work at, a.k.a. 100% N1 in rad/s (in this case 100% N1 is defined as 37500 RPM = 3927.0 rad/s) That design parameter changes the efficiency of the compressor or turbine at off-design points, or put in other words: the maximum efficiency is reached at that design rotation speed. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ITT ( Turbine Inlet Temperature) AND FIRST_ORDER_LOW_PASS Yes the ITT rises nearly instantly, this is realistic in a sense that the actual ITT follows very close to the fuel flow, if you burn more fuel you heat up the gases very quickly. What you have experienced in the real world is the time delay caused by the heat transfer within the ITT probe. You can't directly measure the temperatures, your probes would melt, so you use other methods with metal parts that don't melt, but those need to get hot first before you can see an ITT increase. If you want to see your ITT increase slower you can use a first order delay: Code <[first_order_low_pass][EngineTOT][] <[string8][Input][EngineStation45.OutputTotalTemperature]> <[float64][TimeConstant][3.0]> <[string8][Value][755.8]> > This simulates the probe heating up and your indicated turbine temperature becomes slower OUTPUT VERSUS OUTPUT_FREE the output sends a value from the physics thread to the graphics and sound threads. These have to be declared since only a minimum of values from the physics are actually observable in the graphics, most physical states just change how it behaves, not so much how it looks in a single graphics frame. Code <[output][ThisNameIsImportant][] <[string8][Input][ThisCanBeAny.OutputThatCouldBeNonStandardOutput]> > It would be used whenever you want to keep the original name of the value like for a lever or for a discrete knob etc. The output_free does the exact same but does not alter the name of the variable. Code <[output_free][ThisNameIsIrrelevant][] <[string8][Input][ThisNameIsTakenInstead.Output]> > I only use this if I have to, e.g. when one object has multiple outputs or non standard outputs. E.g. a jet engine would have .N1, N2, FuelFlow, etc. The sender is a completely different story. It sends values to the outside of the aircraft, e.g. to the external dll, to saitek panels, to external autopilot displays, to the simulated copilot and so forth. SOUND....INTERNAL EXTERNAL If you don't specify Internal or External then they are false. Writing External false or Internal false is the same as deleting the line all together. But sometimes you want to emphasize to another developer that the sound is not to be played externally. If you set them to true the sound file will be played internally if the camera attribute "InCockpit" is true and externally otherwise. Having internal true and external false would be used for all switches, radar callouts, etc. that are usually not heard outside the aircraft. External true and internal false would be used for something that already has a different sound file (e.g. afterburner inside vs. outside) or for the APU in the 747 (does not have windows to open and listen to)