Well… As Raul pointed out with the Tag, the ground handling is isn’t the best right now. Actually it may have gotten a little worse in SU-15 until they optimize their changes.
As far as some aspects like Free-Castoring Tailwheel, Ice/Snow Physics, Dirt Physics, and other nuances… our team has developed customed code in our XML that overrides these physical limitations and allows for realistic handling in these scenarios. That said, these are custom in-house solutions and have nothing to do with Asobo’s implementation. Therefore, your question is still valid and we are waiting for deeper integration. Even if not in MSFS 2020, hopefully in MSFS 2024.
As for water simulation… that needs a complete overhaul, but I know that’s not doable in MSFS 2020 and I’m sure they may be looking at a new system in 2024 based on the feedback in MSFS 2020 in general.
All questions… good questions… but empty at the moment.
The closest we’ve gotten to realistic ground handling is our Double Ender with “Realism” mode checked. May want to look into that aircraft if you’re looking for a temporary solution until Asobo integrates it deeper.
As mentioned, ours are fully custom XML injects (which I find is more reliable than an external flight model, and it’s Xbox compatible):
<Component ID="FLIGHT_MODEL_AUGMENTATION">
<UseTemplate Name="ASOBO_GT_Update">
<FREQUENCY>3</FREQUENCY>
<UPDATE_CODE>
(A:IS SLEW ACTIVE, Bool) ! (A:AI CONTROLS, Bool) ! and
if{
(* Surface Conditions *)
(A:SURFACE CONDITION, Enum) s0
l0 0 ==
if{
1.00 (>O:GgGpGrip) (* Dry *)
} els{
l0 1 ==
if{
0.77 (>O:GgGpGrip) (* Wet *)
} els{
l0 2 ==
if{
0.23 (>O:GgGpGrip) (* Ice *)
} els{
0.46 (>O:GgGpGrip) (* Snow *)
}
}
}
(* Surface Types, effect on stopping distance (https://www.experimentalaircraft.info/flight-planning/aircraft-performance-7.php) *)
(A:SURFACE TYPE, Enum) s1
l1 1 == l1 3 == or l1 5 == or l1 7 == or (* Short grass *)
if{
0.80 s2
2 (>L:GgGpSfxSurface)
} els{
l1 6 == (* Long grass *)
if{
0.70 s2
2 (>L:GgGpSfxSurface)
} els{
11 14 l1 rng 21 22 l1 rng or (* Lose soil (sand, gravel etc) *)
if{
0.75 s2
3 (>L:GgGpSfxSurface)
} els{ (* Hard surfaces *)
1.00 s2
1 (>L:GgGpSfxSurface)
}
}
}
(* Final Surface Grip *)
(O:GgGpGrip) l2 * (>O:GgGpGrip)
}
</UPDATE_CODE>
</UseTemplate>
<UseTemplate Name="ASOBO_GT_Update">
<FREQUENCY>30</FREQUENCY>
<UPDATE_CODE>
(A:IS SLEW ACTIVE, Bool) ! (A:AI CONTROLS, Bool) ! and
if{
(A:GEAR IS ON GROUND:1, Bool)
(A:GEAR IS ON GROUND:2, Bool) or
-35 5 (A:PLANE PITCH DEGREES, Degrees) rng and
if{
(* COMMON DATA *)
(A:PROP THRUST:1, pounds) (A:PROP THRUST:2, pounds) + (>O:GgGpThrust)
(A:RUDDER POSITION, Percent over 100) (A:RUDDER TRIM PCT, Percent over 100) 0.15 * + (>O:GgGpRudderPosition)
(A:BRAKE LEFT POSITION, Percent over 100) (A:CONTACT POINT COMPRESSION:1, Percent over 100) * (O:GgGpGrip) * (>O:GgGpBrakeLeft)
(A:BRAKE RIGHT POSITION, Percent over 100) (A:CONTACT POINT COMPRESSION:2, Percent over 100) * (O:GgGpGrip) * (>O:GgGpBrakeRight)
(A:GROUND VELOCITY, Knots) 0.5 - 0.333 * 0 max 1 min (>O:GgGpGroundVelocityEasing)
(A:GROUND VELOCITY, Knots) 1.0 - 0.125 * 0 max 1 min (>O:GgGpGroundVelocityEasingLong)
(A:PROP BETA:1, Degrees) 0 <
if{
(A:ENG COMBUSTION:1, Bool) (A:GENERAL ENG PCT MAX RPM:1, Percent over 100) 0.40 - 0 max * 0.90 * (>O:GgGpReverseThrust)
} els{
0 (>O:GgGpReverseThrust)
}
(* STEERING *)
(* Simplified Ground Physics (Additional steering with rudder) *)
(L:GsGpGroundHandlingFullPhysics) !
if{
(O:GgGpRotationVBodyY) (A:VELOCITY BODY Z, Knots) (O:GgGpRudderPosition) 0.00080 * * + (>O:GgGpRotationVBodyY)
}
(* P-Factor (consider Helical Propwash nil due to contra-rotation cancelling) *)
(L:GsGpGroundHandlingFullPhysics)
if{
-0.00000030 (A:PLANE PITCH DEGREES, Degrees) * s0 (* P-Factor *)
(O:GgGpRotationVBodyY) (O:GgGpThrust) 100 - 0 max l0 * + (>O:GgGpRotationVBodyY)
}
(* Rudder steering through regular airflow and propwash *)
(O:GgGpRotationVBodyY) (O:GgGpThrust) 100 - 0 max 0.000034 * (A:RELATIVE WIND VELOCITY BODY Z, Feet per second) 0.000180 * + (O:GgGpRudderPosition) * + (>O:GgGpRotationVBodyY)
(* Differental Braking *)
1 (A:GROUND VELOCITY, Knots) 0.5 pow 0.12 * - 0 max s0
(O:GgGpRotationVBodyY) 0.001200 (A:LEFT WHEEL RPM, Rpm) (A:RIGHT WHEEL RPM, Rpm) + * (O:GgGpGroundVelocityEasing) * l0 * (O:GgGpThrust) 300 - 0 max 0.000155 * + (O:GgGpReverseThrust) 0.15 * - (O:GgGpBrakeRight) (O:GgGpBrakeLeft) - * + (>O:GgGpRotationVBodyY)
(* Rotation Braking *)
(O:GgGpBrakeLeft) (O:GgGpBrakeRight) + 1.333 (A:BRAKE LEFT POSITION, Percent over 100) (A:BRAKE RIGHT POSITION, Percent over 100) - abs - * (>O:GgGpBrakeSimultaneous)
(O:GgGpRotationVBodyY) 0 >
if{
(O:GgGpRotationVBodyY) (O:GgGpBrakeSimultaneous) 0.0950 * - 0 max (>O:GgGpRotationVBodyY)
} els{
(O:GgGpRotationVBodyY) (O:GgGpBrakeSimultaneous) 0.0950 * + 0 min (>O:GgGpRotationVBodyY)
}
(* Groundloop *)
(L:GsGpGroundHandlingFullPhysics)
if{
(A:ACCELERATION BODY Z, Feet per second squared) s0
l0 0 <
if{
(A:VELOCITY BODY X, Feet per second) s1
(O:GgGpRotationVBodyY) l1 l0 * 0.000275 * + (>O:GgGpRotationVBodyY)
}
}
(* Weathervaning *)
(O:GgGpRotationVBodyY) (A:RELATIVE WIND VELOCITY BODY X, Feet per second) 0.000235 * (O:GgGpGroundVelocityEasingLong) * + (>O:GgGpRotationVBodyY)
(* Rotation, Friction, Moments and Normalisation *)
(O:GgGpRotationVBodyY) 0.9920 (A:TAILWHEEL LOCK ON, Bool) (A:CONTACT POINT COMPRESSION:0, Percent over 100) * 0.080 * - * -1.85 max 1.85 min (>O:GgGpRotationVBodyY)
(O:GgGpRotationVBodyY) (>A:ROTATION VELOCITY BODY Y, Feet per second)
(* BRAKING *)
(* Brake Effectiveness (Brake and Tire wear and tear) *)
(L:MVP50RealismNew)
if{
(L:WearLeftBrake) (L:WearRightBrake) + 0.5 * 0.70 - 0 max 3.333 * s0
(L:WearLeftTire) (L:WearRightTire) + 0.5 * 0.70 - 0 max 0.750 * s1
1 l0 - l1 - 0 max (>O:GgGpBrakeEffectiveness)
} els{
1 (>O:GgGpBrakeEffectiveness)
}
(* Augmented Smart Power Brakes (power reduces at nose-over risk speeds) *)
(O:GgGpGroundVelocityEasing) 0 > (O:GgGpReverseThrust) 0 > or
if{
(O:GgGpBrakeSimultaneous) (O:GgGpBrakeEffectiveness) * (O:GgGpGroundVelocityEasing) * 0.80 * (>O:GgGpBrakePower)
(A:VELOCITY BODY Z, Knots) 0 >
if{
(A:VELOCITY BODY Z, Feet per second) (O:GgGpBrakePower) - (O:GgGpReverseThrust) - (>A:VELOCITY BODY Z, Feet per second)
} els{
(A:VELOCITY BODY Z, Feet per second) (O:GgGpBrakePower) + (O:GgGpReverseThrust) - -12 max (>A:VELOCITY BODY Z, Feet per second)
}
}
(* MISCELANEOUS *)
(* Sound Support *)
(A:VELOCITY BODY X, Feet per second) abs 10 - 15 / 0 max 1 min (>L:GgGpSfxSkidding)
} els{
0 (>O:GgGpRotationVBodyY)
0 (>L:GgGpSfxSkidding)
}
} els{
0 (>O:GgGpRotationVBodyY)
0 (>L:GgGpSfxSkidding)
}
</UPDATE_CODE>
</UseTemplate>
</Component>