flight_model.cfg - Additional Information
This page contains various notes related to some of the functionality derived from the flight_model.cfg sections and parameters.
Notes On The Exponential Constant
By default when defining a point.N
list (in the [CONTACT_POINTS]
section), the last value (16) is used to give an exponential constant for the springs. This is used in the spring calculations to change the way they react. A standard spring will use the following linear curve formula to generate its force:
$$F = k_0 \times x$$
Where:
- \(F\) is the force (in lbf)
- \(k_0\) is the spring constant, calculated as \(\frac {\textrm{lbf}}{ft}\)
- \(x\) is the compression distance.
That's the standard spring linear curve, however the simulation does not use this exact curve. Instead, the simulation permits you to supply an exponent so that you do not end up with a standard "linear" spring (unless it is set to 1). This means that the simulation formula is as follows:
$$F = k_1 \times x \times ratio_1$$
Where:
- \(F\) is the force (in lbf)
- \(k_1\) is the modified spring constant, calculated as \(k_1 = k_0 \times \frac{n \times MSCR}{1+\frac{n-1}{MSCR^{n-1}}}\)
- \(x\) is the compression distance in ft
- \(\textrm{ratio}_1\) is the ratio applied to correct the default linear curve, calculated as \(ratio_1 = \frac{\overline{x} + (n-1) \times \overline{x}^n}{n}\)
The additional terms used in the above calculation are as follows:
- \(k_0\) is the default linear spring constant, calculated as \(\frac {\textrm{lbf}}{ft}\)
- \(n\) is the exponential constant (16 in the point list)
- \(MSCR\) is maximum to static compression ratio (9 in the point list)
- \(\overline{x}\) is calculated as \(\frac{x}{x_{max}}\)
- \(x_{max}\) a value greater than 0.1 ft
However, this implementation of the formula gives rise to certain issues:
- if \(n > 1\) - ie: the curve is not linear - then the formula lowers the spring force if compression is low, making the spring very weak at low compression ranges.
- if \(n > 1\) but close to 1, then the formula is incorrect and still differs significantly from the base linear curve formula.
This can be fixed by having your aircraft use the updated formula by setting the spring_exponential_fix
parameter to 1 (true). The updated formula looks like this:
$$F = k_0 \times x \times ratio_2$$
Where:
- \(F\) is the force (in lbf)
- \(k_0\) is the default linear spring constant, calculated as \(\frac {\textrm{lbf}}{ft}\)
- \(x\) is the compression distance (in \({ft}\))
- \(\textrm{ratio}_2\) is the ratio applied to correct the default linear curve, calculated as \(ratio_2 = \frac{1}{n} + (R \times x^{n-1} - \frac{1}{n}) \times \overline{x}\)
The additional terms used in the above calculation are as follows:
- \(\overline{x}\) is calculated as \(\frac{x}{x_{max}}\)
- \(n\) is the exponential constant (16 in the point list)
- \(R\) calculated as \(\frac{A}{k_0} = \frac{MSCR+\frac{1-MSCR}{n}}{SC^{n-1}}\)
- \(SC\) is the static compression (in ft) under load \(W\) (in lbf)
- \(A\) is the load calculation \(W \times \frac{MSCR+\frac{1-MSCR}{n}}{SC^n}\)
Using this new calculation we get the following:
- Force \(F\) will be \(\frac{K_0}{n} \times x\) as \(\overline{x}\) approaches 0, which gives us the low compression range
- Force \(F\) will be \(A \times x^n\) as \(\overline{x}\) approaches 1, which gives us the high compression range
Essentially, When the spring_exponential_fix
parameter to 1 (true), if the exponential constant is greater than 1 then it becomes the denominator for the linear spring force curve in the low compression range, and the power of this curve in the high compression range.
It is worth noting that this curve formula can be visualised using the following Excel document, where you can edit the values highlighted in blue: Landing_Gear_ExpoConstant.xlsx
Notes On Spring/Damping Factors
By default the spring factor and damping factor for the landing gear (in the [CONTACT_POINTS]
section) is calculated automatically based on the value of the static compression of the landing gear when parked parked (specified by parameter 9 of the contact point.N
), using the maximum gross weight of the aircraft and taking into account the location of the contact point relative to the center of gravity.
However, this default method is only used for landing gear that are all of the type wheel. For other types of landing gear (Skids, Skis and Floats), and mixed types of landing gear (wheels + some other landing gear type), the following process is used to determine the spring and damping factors:
- The simulation will check through the list of contact points and find the first spring reaction contact point - either a wheel, skid, or a ski - which is located in front of the center of gravity of the empty aircraft. This contact point will initially be considered as main front landing gear.
- If there is another spring reaction contact point which is located towards the front of the center of gravity of the empty aircraft, then that will be the contact point that is considered as the main front landing gear (so, the second contact point) .
- The simulation then calculates the spring factor and damping factor for this basic "main" front contact point, taking into account its location relative to the empty center of gravity, and the
point.N
parameters: static compression, max/static compression ratio and damping ratio (8, 9 and 10 in the point list). - These newly calculated spring and damping factors are transmitted to all contact points of the type skid and ski - but not wheels - which are located in front of the center of gravity of the empty aircraft. Therefore, the location of all these contact points and their static compression, max/static compression ratio and damping ratio parameters don't matter at all.
- The simulation then does the same thing for the rear landing gear, ie: finds the first (or the second if there are two) spring reaction contact point in the list which is located behind the center of gravity of the empty aircraft, calculates the spring factor and damping factor for this contact point, then applies these values to all rear skid or ski contact points.
- Finally, the simulation will repeat the same procedure (steps 1 - 5, above) for float contact points, this time only taking into account float type contact points.
As you can see, the order in which the contact points are defined in the list can play a significant role in the final behaviour of all the landing gear for the aircraft.
Notes On Skids
If you are defining the [CONTACT_POINTS]
for skids, there are a few things that you should be aware of:
- The maximum number of contact points for skid-type retractable landing gear is 6 (previously this was limited to only 2). These are:
- Center Front Skid
- Center Rear Skid
- Left Front Skid
- Left Rear Skid
- Right Front Skid
- Right Rear Skid
- The initialisation rules for skids when reading the contact point list from the
flight_model.cfg
file are as follows:- If the contact point is of skid type and is retractable (ie: it has non-zero retraction and extension times), then the skid position is determined by the lateral X coordinate of the contact point, where:
- The front and rear skids on each side are then initialized based on the longitudinal Z coordinate of the contact points. If there is only one skid on one side, the skid will be considered as the front skid if the longitudinal coordinate Z > 0, otherwise it will be considered as the rear skid.
- If more than 2 skids are mistakenly found in the list of contact points for any side, the others are ignored.
- Retractable skids can be used in addition to wheels (regardless of whether the wheels are retractable or not).
- The initialization method of retractable skids in the FLT Files (including in the game-menu hangar) is similar to the wheel-type retractable landing gear, ie: Gear1 for the center skid(s), Gear2 for the left skid(s), Gear3 for the right skid(s).
Finally, it is worth noting that the following SimVars can also be used for skids:
GEAR_LEFT_POSITION
GEAR_RIGHT_POSITION
GEAR_CENTER_POSITION
GEAR_POSITION
GEAR_ANIMATION_POSITION
GEAR_IS_SKIDDING
GEAR SKIDDING FACTOR
GEAR_IS_ON_GROUND
GEAR_WATER_DEPTH
Notes On Tailwheels
The simulation code will automatically detect whether a wheel contact point is a tailwheel or not based on it's position and other parameters. However, this is done in two different ways depending on what the aircraft is going to be used for. Currently the "legacy" method will be used in all cases except for deciding if an aircraft is correctly configured for the user to fly it in a career activity (but may be phased out over time and so you should try and ensure that your aircraft follow the updated rules).
Legacy Tailwheel Calculation
An aircraft is considered as having a tailwheel using the legacy calculation when:
- The wheel is on the center of the longitudinal axis, ie: the X position is 0.
- The wheel contact point is behind the Datum Reference Point, ie the Z position is less than 0.
When both these conditions are met, the wheel is considered as a tailwheel, however this method is problematic with aircraft that are setup in a non-standard way with a datum reference point further forward or backwards than the aircraft CG.
Modern Tailwheel Calculation
For an aircraft to be considered as having a tailwheel, the modern calculation does not use the Datum Reference Point and instead uses a combination of factors related to wheel size and aircraft CG. This is done as follows:
- From the list of contact points in the
[CONTACT_POINTS]
section of flight_model.cfg, determine the largest radius between all of the contact points defined as wheels (this value comes from position 6 of thepoint.N
definition). - The list of contact points is then parsed again to determine the minimum longitudinal position between all of the contact points defined as wheels (this value comes from position 1 of the
point.N
definition) and that have a radius the same as that of the largest radius discovered in the previous step. - If the minimum longitudinal position of a wheel that is found is greater than the
empty_weight_CG_position
Z position value, then the aircraft is considered as having a tailwheel.
Notes On Floats
It is important to note that if your aircraft features retractable floats, then you must define a "wheel" contact point as well as the "float" points in order for the floats to be evaluated as part of the retract/extend process. This contact point can be placed in a position where it does not interfere with the operation of the aircraft, since it is not actually going to be physically referenced and is simply necessary to "link" the float and landing gear code and permit the floats to retract / extend.
Note On Collision Damage / Wear And Tear
The collision damage / wear and tear system is based on a number of internal values, but it can be quite simply summed up as follows: Certain parts of the aircraft have "health points". These health points will be reduced in one of two ways:
- Through general wear and tear over time and through normal use.
- Through collision damage.
Wear and Tear
When it comes to damage from general wear and tear, this is something which is applied to all applicable systems while an aircraft is in use, and the amount will vary based on the actions of the pilot and other factors. All wear and tear means is that over time a small amount of the part or system "health points" will be reduced to simulate the effect of "real world" things like abrasion, dirt, lifetime stress, etc... Here are a couple of examples so you can get an idea of how this system works:
- the landing gear will take a small amount of wear and tear damage on every landing, but if the the pilot makes a particularly hard landing, then the wear and tear factor will be increased.
- the aircraft flaps will also take a small amount of damage every time they are extended, but if the pilot is flying above (or below) certain thresholds, then the wear and tear factor for the flaps will be increased.
If the wear and tear on a system or component passes a specific threshold, then it may fail. These failures can be controlled on a "global" level by the [WEAR_AND_TEAR_SYSTEM]
section, but some components can be set to never take damage on an individual level as well. For example, you can inhibit all damage/wear-and-tear to the electrical system, or permit it on a global level, then inhibit only certain electrical components that don't make sense to take damage or wear and tear.
Collision Damage
Collision damage is based on the force and shock values associated with some kind of collision between the aircraft and something else (another aircraft, a building, the ground, etc...). Damage from these kinds of collisions is done to the part or system "health points", and is usually greater than that caused by basic wear and tear. The way that damage is applied is as follows:
- You can associate some parts and components to one or more scrape points, by assigning them a "damage profile".
- The damage profile is simply a link between the part, a scrape point, and a factor, created using the
CollisionDamage.N
parameter. - When a scrape point experiences a collision, it generates a damage number based on the velocity threshold and an internal damage curve calculation.
- This damage number is then modified by the damage profile factor before being propagated to the associated parts for that scrape point.
- The "health points" for the part are then reduced, and may generate a failure event (You can inhibit some failures using the
[WEAR_AND_TEAR_SYSTEM]
parameters).
In this way the system can be used to simulate a wide range of damage types from major to minor and everything in between. For example, you may set up two damage profiles, one for light damage and one for heavy damage. The light damage profile is assigned to a scrape point on the wing and has a damage factor of 0.1, while the heavy damage scrape point is situated on the engine and has a damage factor of 0.95. Both these profiles can be assigned to, for example, a fuel tank. If the wing scrapes the ground the fuel tank may be damaged, but only lightly, but if something hits the engine, then the fuel tank will be heavily damaged and likely fail instantly.
Wear And Tear Parts List
Not everything in the simulation is subject to collision damage or wear and tear events, and so here we provide you with a list of the system parameters that can be set up to be affected:
- Fuel System:
Tank.N
- Hydraulics System:
Reservoir.N
,Pump.N
,Actuator.N
,Junction.N
- Electrical System:
battery.N
,circuit.N
,generator.N
- Flaps:
FlapSurface_Left
,FlapSurface_Right
,FlapCable_Left
,FlapCable_Right
- Ailerons, Rudder, Elevator, Contact Points.
- Engines: Engine.N Note that engines also have an additional parameter,
smoke_protection
, specifically related to dealing with smoke damage. - Oil Tanks, Autopilot, etc...: Multiple systems within the aircraft can have wear and tear and collision damage, however there is no direct control over these other than to have them inhibited or not. See here for more information:
[WEAR_AND_TEAR_SYSTEM]
. -
Miscellaneous: All aircraft have a miscellaneous category, and it requires no setup and has no parameters that can directly influence the components that fall under this category. This category is primarily used to compensate for the lack of defined wear and tear components (ie: some or all of the the components listed above do not have wear and tear setup), such that the aircraft will have the same maintenance costs regardless of the amount of specific wear and tear information available.
Note that you can query the status of many of these parts using the appropriate SimVar, as shown here:
Wear And Tear XML Tags
There are a number of XML tags that have been created for use with some of the Model Behavior Templates, notably when Checking Aircraft Parts as part of the preflight setup. Below is the full list of tags that can be used to define wear and tear elements:
<FUEL_TANK />
<FLAPS_LEFT />
<FLAPS_RIGHT />
<FLAPS_LEFT_CABLE />
<FLAPS_RIGHT_CABLE />
<AILERONS_LEFT />
<AILERONS_RIGHT />
<AILERONS_LEFT_CABLE />
<AILERONS_RIGHT_CABLE />
<ELEVATOR />
<ELEVATOR_CABLE />
<ELEVATOR_LEFT />
<ELEVATOR_RIGHT />
<ELEVATOR_LEFT_CABLE />
<ELEVATOR_RIGHT_CABLE />
<RUDDER />
<RUDDER_CABLE />
<HYDRAULIC_RESERVOIR />
<HYDRAULIC_PUMP />
<HYDRAULIC_ACTUATOR />
<ELECTRICAL_ALTERNATOR />
<ELECTRICAL_BATTERY />
<ELECTRICAL_BUS />
<ELECTRICAL_CIRCUIT />
<LANDING_GEAR />
<BRAKE />
<TIRE />
<TIRE_PRESSURE />
<PISTON_ENGINE />
<TURBINE_ENGINE />
<OIL_TANK_INTEGRITY />
<OIL_TANK_AMOUNT />
<AUTOPILOT_BANK />
<AUTOPILOT_PITCH />
<AUTOPILOT_YAW />
<GENERAL />
Notes On Interactive Points
The various notes in this section are all relevant for the [INTERACTIVE POINTS]
section of the flight_model.cfg.
Type, Position, and Orientation
For the available "door" point types - Main exit, Cargo exit/door, Drop Exit, and Emergency exit - the interactive point should be positioned at the bottom of the door in the model (at its center for other directions). The orientation should point horizontally towards the exterior of the door, i.e. perpendicular to the door itself. This position and orientation will be used by Jetways, BoardingRamps, CateringTrucks, and (for cargo) BaggageLoaders, in order to align themselves properly.
If you are wanting to do an activity where an interactive door element needs to be open - for example skydiving - then the door interactive point should be of the type Drop Exit. Interactive points used to define regular exits, cargo door exits, or emergency exits, will all cause the aircraft to crash if opened mid-flight, while the drop-exit type will not.
For an aircraft to properly interact with a FuelTruck, it should have a fuel hose node as part of its model, hidden by default thanks to ModelBehaviors, preferably on the left side of the aircraft (see the section below for more details). The associated interactive point of type 3 - Fuel Hose - should then be placed at the end of the hose (on the fueltruck side), in the center of the circle (assuming a cylindrical hose). The orientation should point towards the exterior of the hose, in the same direction as the last part of the hose.
For an aircraft to properly interact with a GroundPowerUnit, it should have an electrical cable node as part of its model, hidden by default thanks to model behaviors, preferably on the right side of the aircraft, close to its nose (see the section below for more details). The associated interactive point of type 4 - Ground Power cable - should then be placed at the end of the cable (on the groundpowerunit side), in the center of the circle (assuming a cylindrical cable). The orientation should point towards the exterior of the cable, in the same direction as the last part of the cable.
Note that, when using the SimObject Editor, interactive points are represented on the aircraft with an arrow starting from their position that indicates their orientation.
Jetway Values
The last six values of an interactive_point
are used to properly animate the hood of a jetway in order to best match the shape of the aircraft. This also means that those values are only useful for interactive points of type 0 - Main exit - and only for aircrafts suitable for jetway interaction (defined in the [SERVICES]
section of aircraft.cfg
).
Those six values are matched with the six animations for the jetway hood. The left and right deployment values are angles in degrees to incline the base of the jetway hood (with 0 being the default vertical position). The left and right bend values are percentages of the bending animation (0 to 100, where 0 is the default state). The top horizontal and vertical values are signed percentages of the corresponding animations (-100 to 100, where 0 is the default state).
To properly define them for your aircraft, there is sadly no magic recipe, and you will have to tweak those values until the result is satisfying. The recommended way to do so is as follows:
- start a flight on a gate with your aircraft
- call the jetway with the shortcut input TOGGLE JETWAY (default to
ctrl+J
, and it can be changed in the controls option menu) - examine the current result of hood animation
- retract the jetway with the shortcut input
- edit interactive point values
- save them and reload your aircraft sim
- repeat
The good thing about those values is that any jetway created by any company will give similar results as your aircraft, as long as they use the same animation conventions.
To give an example, the default Airbus A320 Neo in Microsoft Flight Simulator 2024 has the following last six values for its interactive point of the front-left door:
72, 16, 85, 3, -2, 33
These correspond - in order - to:
- left bend
- left deployment
- right bend
- right deployment
- top horizontal
- top vertical
Carrier Landings
If you are wanting an aircraft to land on an aircraft carrier, then it must have a tailhook so it can be correctly arrested at speed when landing by the deck cables. This tailhook should be enabled in the systems.cfg file (see the [TailHook]
section), and will require you to setup 3 interactive points for it to work correctly. These need to be of the type "Tailhook" (6) and will be associated with the following details:
- the point where the tail hook is attached to the plane
- the point of the end of the tail hook when fully retracted
- the point of the end of the tail hook when fully deployed
So, in this following example, we have 7 interactive points defined for the aircraft, and points 4, 5 and 6 are the ones that are used for the TailHook:
[INTERACTIVE POINTS] interactive_point.0 = Name:ipDoorL #Properties: 0.33 , 4, -30, -2.5, 3 , 0, 0, -90, 0, 0, 0, 0, 0, 0 interactive_point.1 = Name:ipDoorR #Properties: 0.33 , 4, 30, -2.5, 3 , 0, 0, 90, 0, 0, 0, 0, 0, 0 interactive_point.2 = Name:ipCargoL #Properties: 0.33 , -22, -13, -2.5, 4 , 0, 0, -135, 0, 0, 0, 0, 0, 0 interactive_point.3 = Name:ipCargoR #Properties: 0.33 , -22, 23, -2.5, 4 , 0, 0, 135, 0, 0, 0, 0, 0, 0 interactive_point.4 = Name:ipTailHookL #Properties: 0.33 , -21.3, 0, -1.7, 6 , 0, 0, 0, 0, 0, 0, 0, 0, 0 interactive_point.5 = Name:ipTailHookC #Properties: 0.33 , -27.3, 0, -0.5, 6 , 0, 0, 0, 0, 0, 0, 0, 0, 0 interactive_point.6 = Name:ipTailHookR #Properties: 0.33 , -24.5, 0, -7, 6 , 0, 0, 0, 0, 0, 0, 0, 0, 0
Behaviors And SimVars Related To Interactive Points
Each interactive point SimVar has to use an index corresponding to the index of the interactive point in the flight_model.cfg
(starting at 0). In addition to the SimVars listed here and representing the constant values of interactive points, another SimVar - INTERACTIVE POINT OPEN
- is available. This SimVar is a percentage which is 0% when the corresponding interactive point door is closed or the hose/cable is not visible, and 100% when the door is open or hose/cable is fully deployed.
All those SimVars can be used directly, or you can also use the following <Behaviors>
templates, by using this include:
<Include ModelBehaviorFile="Asobo_EX1\Index.xml" /> <Include ModelBehaviorFile="Asobo_EX1\DefaultConfig.xml" />
The template ASOBO_ET_COMMON_Interactive_Point_Animation_SubTemplate
is used to play an animation based on an interactive point, matching the SimVar for the associated interactive point. You can find more information here:
Note On Flight Assistance
The different assistance_
parameters in the [HELICOPTER]
section are provided to pre-initialise the PID that is used for assistance, and will only be used when flight assistance is enabled. The way the PID works is that it will converge towards a value which makes it possible to stabilize the helicopter in hover, and it's the assistance_xxxx_xxxx_stability_centre
that you can use to pre-initialise the PID. This will make it start directly at the value that stabilizes the helicopter, so it doesn't "search" as much before stabilizing and is more quickly stable. Note too that there are limits to stabilisation, and if you are too off-center it sometimes does not stabilise at all.
Note On Ground Contact Model
The "new contact model" for landing gear can be disabled by simply omitting all of the relevant parameters from the CFG file. However, including them will tell the simulation to use this model, and you should set the parameter values appropriately.
To correctly set up the new contact model, you should start by setting the ground_new_contact_model_up_to_speed_lateral
and ground_new_contact_model_up_to_speed_longitudinal
parameters. These parameters set the aircraft speed to be used to calculate the lateral and longitudinal friction for the landing gear when on the ground (whether stationary or moving). Lateral friction is for simulating sideways friction when turning, dealing with cross-winds, etc... while while longitudinal friction affects breaking, forward air resistance, ground friction on slopes, etc... Setting very high values for these parameters will result in only the new contact model being used.
To effectively use these parameters you should do the following:
- Enable
enable_high_accuracy_integration
to get the simulation to take micro movements into consideration. - Set
ground_new_contact_model_gear_flex
to 1 / aircraft weight and then fine tune the value through tests. - Set
ground_new_contact_model_gear_flex_damping
to approximately 1% of the aircraft weight and then fine tune the value through tests.
NOTE: Using very large values will make the landing gear so flexible that it will become very unstable and generate extremely exaggerated/unrealistic results. - Set the
ground_new_contact_model_up_to_speed_lateral
andground_new_contact_model_up_to_speed_longitudinal
parameters to 10000 to ensure that the new contact model will always be enabled. - Setting the lateral and longitudinal friction will initially cause the aircraft to get very "sticky" at high rolling speeds. To resolve this, you should edit the
ground_new_contact_model_rolling_stickyness
parameter. Start with a value of 0.5 and then reduce it if the rolling still feels too sticky, or increase it if the rolling does not feel sticky enough.
NOTE: You may wish to check that theempty_weight_CG_position
is at the correct height as it will heavily impact ground rolling