User Tools

Site Tools


tools:a3flightmodeltool

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tools:a3flightmodeltool [2026/07/19 15:36] rocktools:a3flightmodeltool [2026/07/20 12:28] (current) rock
Line 7: Line 7:
 ===== Pages ===== ===== Pages =====
  
-  * [[tools:arma3_flight_graph_tool:workflow|Step by step workflow]] +  * [[/tools:a3flightmodeltool#arma_3_flight_model_graph_tool_workflow|Step by step workflow]] 
-  * [[tools:arma3_flight_graph_tool:data_sources|Finding the source data]] +  * [[tools:a3flightmodeltool#finding_flight_model_source_data|Finding the source data]] 
-  * [[tools:arma3_flight_graph_tool:field_reference|Field reference]] +  * [[tools:a3flightmodeltool#flight_model_field_reference|Field reference]] 
-  * [[tools:arma3_flight_graph_tool:formulas|Formulas and estimates]] +  * [[tools:a3flightmodeltool#flight_model_formulas_and_estimates|Formulas and estimates]] 
-  * [[tools:arma3_flight_graph_tool:tuning_checklist|In-game tuning checklist]]+  * [[tools:a3flightmodeltool#in-game_flight_model_tuning_checklist|In-game tuning checklist]]
  
 ===== What the tool does ===== ===== What the tool does =====
Line 36: Line 36:
   * [[https://community.bohemia.net/wiki/CfgVehicles_Config_Reference|Bohemia Interactive - CfgVehicles config reference]]   * [[https://community.bohemia.net/wiki/CfgVehicles_Config_Reference|Bohemia Interactive - CfgVehicles config reference]]
  
-====== Arma 3 Flight Model Graph Tool Workflow ======+====== Flight Model Graph Tool Workflow ======
  
 Follow this process for each aircraft type. Do not tune duplicate editor variants separately unless they use genuinely different physics values. Follow this process for each aircraft type. Do not tune duplicate editor variants separately unless they use genuinely different physics values.
Line 172: Line 172:
  
 ^ Aircraft ^ Typical extracted config path ^ ^ Aircraft ^ Typical extracted config path ^
-| A-143 Buzzard | ''Q:\a3\air_f_gamma\Plane_Fighter_03\config.cpp''+| A-143 Buzzard | ''P:\a3\air_f_gamma\Plane_Fighter_03\config.cpp''
-| A-149 Gryphon | ''Q:\a3\air_f_jets\Plane_Fighter_04\config.cpp''+| A-149 Gryphon | ''P:\a3\air_f_jets\Plane_Fighter_04\config.cpp''
-| A-164 Wipeout | ''Q:\a3\air_f_epc\Plane_CAS_01\config.cpp''+| A-164 Wipeout | ''P:\a3\air_f_epc\Plane_CAS_01\config.cpp''
-| Caesar BTT | ''Q:\a3\air_f_exp\Plane_Civil_01\config.cpp''+| Caesar BTT | ''P:\a3\air_f_exp\Plane_Civil_01\config.cpp''
-| F/A-181 Black Wasp II | ''Q:\a3\air_f_jets\Plane_Fighter_01\config.cpp''+| F/A-181 Black Wasp II | ''P:\a3\air_f_jets\Plane_Fighter_01\config.cpp''
-| KH-3A Fenghuang | ''Q:\a3\air_f_exp\UAV_04\config.cpp''+| KH-3A Fenghuang | ''P:\a3\air_f_exp\UAV_04\config.cpp''
-| MQ-4A Greyhawk | ''Q:\a3\drones_f\Air_F_Gamma\UAV_02\config.cpp''+| MQ-4A Greyhawk | ''P:\a3\drones_f\Air_F_Gamma\UAV_02\config.cpp''
-| To-199 Neophron | ''Q:\a3\air_f_epc\Plane_CAS_02\config.cpp''+| To-199 Neophron | ''P:\a3\air_f_epc\Plane_CAS_02\config.cpp''
-| To-201 Shikra | ''Q:\a3\air_f_jets\Plane_Fighter_02\config.cpp''+| To-201 Shikra | ''P:\a3\air_f_jets\Plane_Fighter_02\config.cpp''
-| UCAV Sentinel | ''Q:\a3\air_f_jets\UAV_05\config.cpp''+| UCAV Sentinel | ''P:\a3\air_f_jets\UAV_05\config.cpp''
-| V-44 X Blackfish | ''Q:\a3\air_f_exp\VTOL_01\config.cpp''+| V-44 X Blackfish | ''P:\a3\air_f_exp\VTOL_01\config.cpp''
-| Y-32 Xi'an | ''Q:\a3\air_f_exp\VTOL_02\config.cpp'' | +| Y-32 Xi'an | ''P:\a3\air_f_exp\VTOL_02\config.cpp'' |
- +
-Search examples: +
- +
-<code -> +
-rtk rg -n -i 'class .*Plane|simulation *= *"airplanex"|envelope\[]|thrustCoef\[]' Q:\a3 +
-rtk rg -n 'class I_Plane_Fighter_04_F|class Plane_Fighter_04_Base_F' Q:\a3 +
-</code>+
  
 ===== Your addon config ===== ===== Your addon config =====
Line 363: Line 356:
 For a graph array with ''N'' editable points and zero-based point index ''i'': For a graph array with ''N'' editable points and zero-based point index ''i'':
  
-<code>+<code ->
 station_speed_kmh = maxSpeed_kmh * range * i / (N - 1) station_speed_kmh = maxSpeed_kmh * range * i / (N - 1)
 </code> </code>
Line 378: Line 371:
 Example for ''maxSpeed = 800'' and ''envelope[]'' point 6: Example for ''maxSpeed = 800'' and ''envelope[]'' point 6:
  
-<code>+<code ->
 station_speed_kmh = 800 * 1.25 * 6 / 13 station_speed_kmh = 800 * 1.25 * 6 / 13
 station_speed_kmh = 461.5 station_speed_kmh = 461.5
Line 389: Line 382:
 If two adjacent points surround 1 g, interpolate between them: If two adjacent points surround 1 g, interpolate between them:
  
-<code>+<code ->
 t = (1 - lower_g) / (upper_g - lower_g) t = (1 - lower_g) / (upper_g - lower_g)
 stall_speed = lower_speed + t * (upper_speed - lower_speed) stall_speed = lower_speed + t * (upper_speed - lower_speed)
Line 400: Line 393:
 Use landing-configuration stall speed if known: Use landing-configuration stall speed if known:
  
-<code>+<code ->
 landingSpeed = landing_stall_speed * 1.20 to 1.35 landingSpeed = landing_stall_speed * 1.20 to 1.35
 </code> </code>
Line 417: Line 410:
 Use this relationship as a rough check: Use this relationship as a rough check:
  
-<code>+<code ->
 approx_maneuver_speed = stall_speed * sqrt(positive_limit_g) approx_maneuver_speed = stall_speed * sqrt(positive_limit_g)
 </code> </code>
Line 429: Line 422:
 In simplified form for each axis: In simplified form for each axis:
  
-<code>+<code ->
 friction_force = v * abs(v) * coef2 + v * coef1 + sign(v) * coef0 friction_force = v * abs(v) * coef2 + v * coef1 + sign(v) * coef0
 </code> </code>
Line 435: Line 428:
 The arrays contain three values: The arrays contain three values:
  
-<code>+<code ->
 airFrictionCoefs0[] = { X, Y, Z }; airFrictionCoefs0[] = { X, Y, Z };
 airFrictionCoefs1[] = { X, Y, Z }; airFrictionCoefs1[] = { X, Y, Z };
Line 449: Line 442:
 If static thrust is known: If static thrust is known:
  
-<code>+<code ->
 baseThrustN = known_static_thrust_N baseThrustN = known_static_thrust_N
 </code> </code>
Line 455: Line 448:
 If engine power is known instead: If engine power is known instead:
  
-<code>+<code ->
 baseThrustN = power_W / target_speed_mps baseThrustN = power_W / target_speed_mps
 </code> </code>
Line 467: Line 460:
 The tool estimates climb from excess power: The tool estimates climb from excess power:
  
-<code>+<code ->
 excess_thrust_N = thrust_N - drag_N excess_thrust_N = thrust_N - drag_N
 excess_power_W = excess_thrust_N * speed_mps excess_power_W = excess_thrust_N * speed_mps
Line 484: Line 477:
  
 Keep ''altNoForce'' higher than ''altFullForce''. If the values are too close, aircraft performance can collapse abruptly with altitude. Keep ''altNoForce'' higher than ''altFullForce''. If the values are too close, aircraft performance can collapse abruptly with altitude.
 +
 +====== In-game Flight Model Tuning Checklist ======
 +
 +Use this checklist after every meaningful curve or drag change.
 +
 +===== Preflight setup =====
 +
 +  * Build a temporary test class or keep the tuned class isolated in a test addon.
 +  * Use a fixed fuel and payload state.
 +  * Use clear weather and no wind.
 +  * Test at known altitude bands.
 +  * Record the config version or commit.
 +  * Record which preset or aircraft class was used as the baseline.
 +
 +===== Import sanity checks =====
 +
 +^ Check ^ Pass condition ^
 +| Class and parent | Correct aircraft class inherits from the intended parent. |
 +| ''simulation'' | Aircraft uses ''airplaneX'' or inherits it from the parent class. |
 +| Arrays | Graph arrays contain numeric values and no missing commas. |
 +| Drag arrays | ''airFrictionCoefs0/1/2[]'' each contain three numeric values. |
 +| Altitude limits | ''altNoForce'' is higher than ''altFullForce''. |
 +| Landing speed | ''landingSpeed'' is above the selected stall estimate. |
 +
 +===== Level flight tests =====
 +
 +Run level flight tests at:
 +
 +  * Sea level or low altitude.
 +  * Typical combat altitude.
 +  * Near ''altFullForce''.
 +  * Above ''altFullForce'' but below ''altNoForce''.
 +
 +Record:
 +
 +^ Test ^ Record ^
 +| Acceleration | Time from low speed to cruise speed. |
 +| Cruise | Stable speed at normal throttle and altitude. |
 +| Maximum level speed | Stable top speed at full throttle. |
 +| Altitude performance | Speed and climb degradation with altitude. |
 +
 +If top speed is too high, increase high-speed drag or reduce high-speed ''thrustCoef[]''. If acceleration is too weak but top speed is right, raise low/mid-speed ''thrustCoef[]'' and compensate high-speed drag if needed.
 +
 +===== Stall tests =====
 +
 +Test clean, flaps, and landing configuration.
 +
 +^ Test ^ Expected behaviour ^
 +| Clean stall | Stall begins near the target clean stall speed. |
 +| Flaps stall | Stall speed is lower or landing behaviour improves without becoming unstable. |
 +| Stall warning | Warning is useful before loss of control if configured. |
 +| Recovery | Nose-down recovery is possible without excessive altitude loss for the aircraft type. |
 +
 +If the clean stall is too fast, raise low-speed ''envelope[]'' around the 1 g crossing. If it is too slow, lower the same region.
 +
 +===== Takeoff tests =====
 +
 +Record:
 +
 +  * Rotation speed.
 +  * Lift-off speed.
 +  * Runway distance.
 +  * Pitch authority at rotation.
 +  * Gear-up acceleration.
 +
 +If the aircraft will not rotate, adjust low-speed ''elevatorCoef[]'' or ''elevatorSensitivity''. If it rotates but will not lift, adjust low-speed ''envelope[]''.
 +
 +===== Landing tests =====
 +
 +Record:
 +
 +  * Stable approach speed.
 +  * Sink rate.
 +  * Flare authority.
 +  * Touchdown speed.
 +  * Runway stopping distance.
 +  * AI approach behaviour if AI use matters.
 +
 +If approach is too fast, check ''landingSpeed'', flap drag, and low-speed lift. If the aircraft floats excessively, reduce low-speed lift or flap effect.
 +
 +===== Control tests =====
 +
 +^ Axis ^ What to check ^ Main fields ^
 +| Roll | Roll rate at takeoff, cruise, and high speed. | ''aileronCoef[]'', ''aileronSensitivity'' |
 +| Pitch | Rotation, flare, pull-up, and stall recovery. | ''elevatorCoef[]'', ''elevatorSensitivity'', ''envelope[]'' |
 +| Yaw | Runway tracking, slips, and high-speed yaw stability. | ''rudderCoef[]'', ''rudderInfluence'' |
 +
 +Use arrays for speed-specific problems. Use scalar fields when the whole aircraft feels too light or too heavy.
 +
 +===== Drag device tests =====
 +
 +^ Device ^ Test ^
 +| Flaps | Approach descent rate, speed loss, landing stability. |
 +| Gear | Gear-down speed loss and approach drag. |
 +| Airbrake | Dive recovery, combat deceleration, and high-speed braking. |
 +
 +Tune one device at a time. Do not change flap, gear, and airbrake drag together unless you are deliberately doing a broad reset.
 +
 +===== Test record template =====
 +
 +^ Field ^ Value ^
 +| Aircraft class |   |
 +| Config version |   |
 +| Baseline preset/class |   |
 +| Payload/fuel |   |
 +| Altitude |   |
 +| Weather/wind |   |
 +| Changed fields |   |
 +| Result |   |
 +| Next action |   |
 +
 +===== Acceptance criteria =====
 +
 +A tuning pass is ready to move forward when:
 +
 +  * The exported config loads without errors.
 +  * The aircraft can take off, climb, cruise, land, and recover from stalls.
 +  * The aircraft reaches a plausible level-flight maximum speed.
 +  * Altitude performance degrades smoothly.
 +  * Controls are useful at low speed and not excessive at high speed.
 +  * AI behaviour is acceptable for the intended role.
 +  * Source notes identify which values are extracted, estimated, or calibrated.
  
  
tools/a3flightmodeltool.1784475384.txt.gz · Last modified: by rock