Fixed-wing flight model (FWG_01)
Source: the five DA_FWG_01_* flight assets, Curve_Symmetrical_LiftCoefFromAngleOfAttackDeg, Curve_DragCoefFromAngleOfAttackDeg, Curve_FWG_01_NoseCenterWheel_SteeringInfluenceByForwardSpeedKmPH and CurveTable_FWG_01_AutoTrimByAirspeedKmPH under Content/Vehicles/Pawns/Air/Airplane/FWG_01/Data. Generated by _tools/vehicle_round85_tables.py. Evidence and status: round 85 vehicles.
FWG_01 is the unfinished two-seat airplane described in Fixed-wing airplane. Vehicles (reference) section 3 and 4 list its mass, thrust, airfoil areas and control mapping. This page adds the rest: the property names, the full drag and torque set, the curve keys, the auto-trim table and the control-assist stacks. The data stores no top speed and no stall speed; the speed figures in section 6 are read from the auto-trim table.
1. Engine and body (stored property names)
| Asset | Property | Value |
|---|---|---|
DA_FWG_01_Engine | FanRPMIncreaseRatePerSecond | 5,000 |
DA_FWG_01_Engine | FanRPMDecreaseRatePerSecond | 5,000 |
DA_FWG_01_Engine | ThrustOrigin_LS | (-700, 0, 0) |
DA_FWG_01_Engine | ThrustDirection_LS | (1, 0, 0) |
DA_FWG_01_Engine | MaxEngineThrust_n | 226,800 |
DA_FWG_01_Engine | MinEngineThrust_n | 0 |
DA_FWG_01_Body | bEnableInertiaTensorOverride | true |
DA_FWG_01_Body | InertiaTensorOverride | (6e+08, 1.6e+08, 2.5e+08) |
DA_FWG_01_Body | bEnableMassOverride | true |
DA_FWG_01_Body | MassOverride | 10,000 |
DA_FWG_01_Body | bEnableCenterOfMassOverride | true |
DA_FWG_01_Body | CenterOfMassOverride | (-150, 0, 0) |
DA_FWG_01_Body | bEnableMaxAngularVelocityOverride | true |
DA_FWG_01_Body | MaxAngularVelocityOverride_degps | 180 |
The engine has one thrust vector and two limits, no thrust-by-speed curve and no fuel use of its own. Thrust is a straight 0 to 226,800 N range, scaled by the throttle control. Mass, inertia and thrust units are not stated in the export (read as kg and N below).
2. Drag (DA_FWG_01_Drag, BHAirplaneDragDataAsset)
| Property | Value |
|---|---|
AirDensityAtSeaLevel | 0.00125 |
FrontDragArea | 4,000 |
RearDragArea | 3,500 |
SideArea | 5,000 |
BottomArea | 2,800,000 |
TopArea | 2,800,000 |
DragCoefficient | 0.0056 |
bDrawDragDebugLines | true |
YawAngularVelocityInducedDragTorqueCoef | 2.4e+12 |
PitchAngularVelocityInducedDragTorqueCoef | 1.2e+13 |
RollAngularVelocityInducedDragTorqueCoef | 9.5e+11 |
RollLinearVelocityInducedDragTorqueCoef | 0.18 |
PitchLinearVelocityInducedDragTorqueCoef | 90,000 |
YawLinearVelocityInducedDragTorqueCoef | 70,000 |
YawLinearVelocityInducedDragTorqueCoefBySkidAngleCurve | CF_YawDragAngle_AggressiveNearZero |
PitchLinearVelocityInducedDragTorqueCoefByAngleCurve | CF_PitchDragAngle |
ReverseYawCorrectionCoef | 0.8 |
The two skid-angle curves live in the helicopter folder (CF_YawDragAngle_AggressiveNearZero, CF_PitchDragAngle); the airplane borrows them. The air density of 0.00125 is the sea-level value in g/cm3 (1.25 kg/m3) (unit reading assumed). How the native code multiplies the six area fields and the coefficient is not decoded.
3. Lift and drag curves (angle of attack in degrees)
All twelve airfoils share these two curves (LiftCoeffFromAngleOfAttackDeg_Curve, DragCoeffFromAngleOfAttackDeg_Curve). The airfoil angle of attack is the airplane angle plus the airfoil IncidenceAngle_deg (wings and flaps 2 degrees, the airbrake -45).
Lift coefficient (Curve_Symmetrical_LiftCoefFromAngleOfAttackDeg, symmetric about 0):
| Angle (deg) | Key value | Interpolation |
|---|---|---|
| -90 | 0 | Cubic |
| -45 | -1.1 | Cubic |
| -25 | -0.5 | Cubic |
| -16 | -1 | Cubic |
| 0 | 0 | Cubic |
| 16 | 1 | Cubic |
| 25 | 0.5 | Cubic |
| 45 | 1.1 | Cubic |
| 90 | 0 | Linear |
Derived values between the keys (evaluated as an Unreal rich curve, cubic keys with their tangents):
| Angle (deg) | 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 25 | 30 | 35 | 40 | 45 | 60 | 90 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Lift coefficient | 0 | 0.15 | 0.33 | 0.52 | 0.69 | 0.83 | 0.93 | 0.98 | 1 | 0.99 | 0.93 | 0.78 | 0.5 | 0.71 | 0.99 | 1.08 | 1.1 | 0.92 | 0 |
| Drag coefficient | 0.01 | 0.011 | 0.012 | 0.016 | 0.02 | 0.026 | 0.033 | 0.042 | 0.053 | 0.065 | 0.079 | 0.096 | 0.124 | 0.183 | 0.261 | 0.36 | 0.486 | 1.123 | 2.5 |
The curve climbs to 1.0 at 16 degrees, falls to 0.5 at 25 degrees (the stall) and rises again to 1.1 at 45 degrees (flat-plate behaviour), then returns to 0 at 90 degrees.
Drag coefficient (Curve_DragCoefFromAngleOfAttackDeg, five keys over -180 to 180 degrees):
| Angle (deg) | Value | Interpolation |
|---|---|---|
| -180 | 0.01 | Cubic |
| -90 | 2.5 | Cubic |
| 0.007533 | 0.01 | Cubic |
| 90 | 2.5 | Cubic |
| 180 | 0.01 | Cubic |
Drag is 0.01 edge-on and 2.5 broadside (90 degrees); the cubic keys make it rise slowly (see the derived row above).
Nose-wheel steering influence by forward speed (Curve_FWG_01_NoseCenterWheel_SteeringInfluenceByForwardSpeedKmPH, km/h):
| Forward speed (km/h) | Steering influence | Interpolation |
|---|---|---|
| 0 | 1 | Linear |
| 50 | 1 | Cubic |
| 100 | 4.818e-07 | Cubic |
The value at 100 km/h is 4.8e-07, effectively 0. The nose wheel keeps full steering to 50 km/h and fades out by 100 km/h.
4. Landing gear and other flight fields
| Side | Braking strength | Steering strength | Steering damping | Max steering angle (deg) | Brake steering influence | Bones (wheel / suspension / steer) |
|---|---|---|---|---|---|---|
| NoseCenter | 0 | 250 | 50 | 45 | 0 | wheelF_J / wheelMechanismF_J / wheelMechanismRotateF_J |
| RearLeft | 1,000,000 | 0 | 0 | 0 | 0.2 | wheelL_J / wheelMechanismL_J / wheelMechanismRotateL_J |
| RearRight | 1,000,000 | 0 | 0 | 0 | 0.2 | wheelR_J / wheelMechanismR_J / wheelMechanismRotateR_J |
| Property | Value |
|---|---|
bEnableMaxAngularVelocity | false |
MaxAngularVelocityDegPerS | 83 |
TranslationalLiftPercent | 20 |
TranslationalLiftMinAtHorizSpeed_mps / MaxAt | 24 / 34 |
GroundEffectAltitude_m / GroundEffectFalloff_m / GroundEffectStrengthPercent | 8.38 / 8.38 / 0 |
DefaultFMAssistanceLevel | bNeutralLift = true, bRateLock = true |
PitchHoverAssistanceCurve | CF_PitchHoverAssistance (helicopter folder) |
RearRotorEfficiencyCurve | TestHelo_RearRotorEfficiency_Curve2000KG (helicopter folder) |
GForceControlFalloffCurve | CF_GForceControlFalloff_AprilKom (helicopter folder) |
AerodynamicSettings.MainLiftMultiplier | 0.4 |
The helicopter fields (translational lift, ground effect, rear rotor, hover assistance) were copied from the helicopter flight asset and carry helicopter values; ground effect is switched off (strength 0). The maximum angular velocity limit is disabled.
5. Control assists
Each control is a BHRotaryMovementControl with a stack of assists (a category, a label, optional conditions, and a body). Flap and airbrake controls have none. Values are as stored; the gain units are not stated.
| Control | Assist label | Enabled | Conditions | Body |
|---|---|---|---|---|
| Throttle | Apply change | on | none | ChangeBody: RawIncreaseInterpSpeed 2; RawDecreaseInterpSpeed 2; IncreasePerSecond 0.5; DecreasePerSecond 0.5; ClampLowerBound 0 |
| Pitch | Reduce pitch when exceeding GForce limit | on | SmoothedInfluenceConditions: InInterpSpeed 0.3; OutInterpSpeed 0.3; Conditions (1) | SetToValueBody |
| Pitch | Auto-trim | on | none | AutoTrimCurveSamplingBody: CurveTable CurveTable_FWG_01_AutoTrimByAirspeedKmPH |
| Roll | Stabilize after input released | on | StabilizedAfterInputReleasedCondition: StabilityControlValueType LocalAngularVelocity_DegPerS; StabilityControlValueComponent X; StabilityThreshold 2.8648; InputStateCondition: ControlType CyclicX; Threshold 0.01; Operator Equal | PIDBody: OutputParams NegateCondition=Always; ControlValueParams Type=LocalAngularVelocity_DegPerS, Component=X; PID ProportionalGain=0.2094, IntegralGain=0.001745, DerivativeGain=0.0873 |
| Yaw | Dampen pressed inputs | on | InputStateCondition: ControlType Pedals; Threshold 1; Operator Equal | DampingBody: Interpolation InterpolationMethod=INTERP_TO, InterpSpeed=1 |
| Yaw | Dampen inputs | on | InputStateCondition: ControlType Pedals; Operator Equal | DampingBody: Interpolation InterpolationMethod=INTERP_TO, InterpSpeed=0.5 |
| Wheel brake | Engage when fully stopped | on | IsFullyStoppedAircraftMovementCondition | SetToValueBody: Value 1 |
| Wheel brake | Damping | on | none | DampingBody: Interpolation InterpolationMethod=INTERP_TO, InterpSpeed=3 |
The pitch auto-trim assist is the one that samples the 22-row table in section 6a.
6. Auto-trim table and speed figures
6a. Auto-trim table (CurveTable_FWG_01_AutoTrimByAirspeedKmPH)
The pitch assist samples one of 22 curves; the row names are Gear_{0,1}_Thrust_{0..100 step 10}, so the curves are chosen by landing-gear state and throttle in tens of percent. Native (static reading, round 91): the game parses the row names at load (Gear_ then a number, Thrust_ then a number; the thrust number times 0.01 becomes the row’s throttle key, 0 to 1) and keeps two lists sorted by that key. Each frame it reads the landing-gear state: Down uses the Gear_0 list, Up uses the Gear_1 list, and while the gear is retracting or extending it samples both lists and blends them by the gear travel fraction (the travel direction while in transit is inferred). Within a list the current engine thrust ratio (0 to 1) is looked up between the two nearest throttle keys, each of those two curves is read at the airspeed, and the two values are blended linearly by where the thrust ratio falls between the keys (below the lowest key or above the highest key the nearest row is used alone). So the table is interpolated in both throttle and airspeed, not looked up by a rounded row. The airspeed fed to the curves is the airplane’s forward speed along its own forward axis, converted from centimeters per second to kilometers per hour by the engine’s unit conversion, so the row keys are km/h. Each curve maps airspeed in km/h to a pitch-control trim value (stored as shown, unit not stated). Every curve rises to +0.2 within 10 km/h, holds it up to a throttle-dependent speed, then falls through 0 and ends at -0.08 or -0.09 at 1200 km/h. The throttle-0 rows are flat at -0.09. All keys are linear.
| Row | Keys | Holds +0.2 up to (km/h) | Falls to 0 at (km/h, derived) | Value at 1200 km/h |
|---|---|---|---|---|
Gear_1_Thrust_100 | 30 | 240 | 440 | -0.08 |
Gear_1_Thrust_90 | 31 | 220 | 420 | -0.08 |
Gear_1_Thrust_80 | 26 | 210 | 390 | -0.08 |
Gear_1_Thrust_70 | 26 | 200 | 370 | -0.08 |
Gear_1_Thrust_60 | 24 | 180 | 340 | -0.08 |
Gear_1_Thrust_50 | 25 | 170 | 310 | -0.08 |
Gear_1_Thrust_40 | 26 | 150 | 280 | -0.09 |
Gear_1_Thrust_30 | 23 | 130 | 240 | -0.09 |
Gear_1_Thrust_20 | 23 | 100 | 190 | -0.09 |
Gear_1_Thrust_10 | 23 | 70 | 140 | -0.09 |
Gear_1_Thrust_0 | 3 | - | - | -0.09 |
Gear_0_Thrust_100 | 31 | 230 | 440 | -0.08 |
Gear_0_Thrust_90 | 29 | 220 | 410 | -0.08 |
Gear_0_Thrust_80 | 26 | 210 | 390 | -0.08 |
Gear_0_Thrust_70 | 26 | 200 | 360 | -0.08 |
Gear_0_Thrust_60 | 23 | 180 | 340 | -0.08 |
Gear_0_Thrust_50 | 26 | 160 | 310 | -0.08 |
Gear_0_Thrust_40 | 24 | 150 | 270 | -0.08 |
Gear_0_Thrust_30 | 23 | 130 | 240 | -0.09 |
Gear_0_Thrust_20 | 23 | 100 | 190 | -0.09 |
Gear_0_Thrust_10 | 21 | 70 | 135 | -0.09 |
Gear_0_Thrust_0 | 3 | - | - | -0.09 |
The zero crossing is the airspeed where the assist asks for no pitch trim at that throttle, which is the speed the designers expected the airplane to hold level at that throttle. It rises from about 140 km/h at 10% to 430 km/h at 100% with the gear up (gear down: 135 to 430 km/h). At 100% the curve reaches zero at 430 and stays there until 440, which is the value the table column shows; at lower throttles the column is the point where the curve leaves zero. Gear_1 is the gear-up set and Gear_0 the gear-down set (confirmed in the native reader above). The full key list of every row is in the export; keys are 10 km/h apart or wider.
6b. Speed figures
The data stores no top speed and no stall speed. The only speed figures it gives are the zero crossings read from the auto-trim table in 6a: the speed where no pitch trim is asked for, 140 km/h at 10% throttle and 430 km/h at 100% throttle with the gear up (135 and 430 km/h with the gear down). They are read from the table, not stored as a limit.