Summary:
From what i can see/feel friction does not play to much of a big part when going fast. Having much of the same grip at both low and high speeds, leads to what i think is no real risk for going fast and under steering, especially on dirt. So i setup a real simple test with increasing the and decreasing friction depending on speed only. I already have a similar setup on one of my mods.
How i tested:
t = (speed - minSpeedKmh) / (maxSpeedKmh - minSpeedKmh), clamped 0 to 1
friction = lerp(frictionAtMinSpeed, frictionAtMaxSpeed, t)
So below minSpeedKmh you're pinned at the "best grip" value, above maxSpeedKmh you're pinned at the "worst grip" value, and in between it slides smoothly. That friction value gets written to every wheel via WheelTyreSetLongitudinalFrictionState and WheelTyreSetLateralFrictionState.
The idea, just a starting point: something like two values on VehicleWheelSim, a tread value at low speed (best grip) and one at high speed (worst grip), interpolated by current speed. I tested this concept using Friction from script, low speed = high friction, high speed = low friction see videos.
Why it matters: currently there's no risk for going fast and under steering on much other surfaces, car handles a lot of the same at any speed.
Proof of concept attached as video: blue car running the friction-by-speed script (loses grip and understeers at speed), beige car vanilla (same grip regardless of speed), plus a clip of Assetto Corsa Rally for reference on understeer, since i think they have great physics.
How i believe it could be implemented using tread value on vehicle, makes it less work to get this type working maybe.
But my thinking is that you could just have a "tread range" on a vehicle, more speed less tread value. This ties back to what we discussed earlier on non tread and tread friction on surface. Since there is that, you already have a nice setup for setting global friction for tread and non tread on a surface and then more individual handeling for vehicles depending on their "tread range". Just to take an example: Uaz Max tread 0.8, Min tread 0.1 then it could fluctuate in between this depending on speed and other factor maybe. And with the forumla mentioned before on tread and non tread on surface this would greatly increase a more distinct driving experience depending on a vehicle
Example:
UAZ example, 20kmh vs 60kmh
- tread range 15-90kmh(where variable tread value range will happen)
- dirt surface
- frictionTread 0.85
- frictionNonTread 0.2
- Uaz: 0.8 to 0.1 tread range
15kmh it should start the variable change since low speed it already should have good traction
speedFactor = clamp((speed − minSpeed) / (maxSpeed − minSpeed))
tread(speed) = lerp(treadMax, treadMin, speedFactor)
friction = tread(speed) frictionTread + (1 − tread(speed)) frictionNonTread
20kmh:
speedFactor = (20-15)/(90-15) = 0.067
tread = 0.8 + (0.1-0.8) 0.067 = 0.75
friction = 0.75 0.85 + 0.22 0.2 = 0.69
60kmh:
speedFactor = (60-15)/(90-15) = 0.6
tread = 0.8 + (0.1-0.8) 0.6 = 0.38
friction = 0.38 0.85 + 0.38 0.2 = 0.45
so friction drops from ~=0.7 to 0.45 between 20 and 60kmh that should be noticeable difference just to take an example
basically the only thing that actually needs adding here is the lerp on tread, everything else is already there. you keep the exact same formula you already have friction = tread × frictionTread + (1 − tread) × frictionNonTread, nothing about that changes. tread just stops being a fixed number and becomes tread(speed) = lerp(treadMax, treadMin, speedFactor) instead, fed into the same formula. so its a small addition on top of whats already there, not a new system.