уже лучше

This commit is contained in:
Valera
2025-06-15 21:59:42 +07:00
parent 4912d0ae1a
commit f0f89ff947
11 changed files with 218 additions and 255 deletions

View File

@@ -14,33 +14,40 @@ public partial class VeloXCar
[Property, Feature( "Steer" )] public float MaxSteerAngle { get; set; } = 35f;
[Sync] public float Steering { get; private set; }
private float jTurnMultiplier;
private float inputSteer;
public static float SignedAngle( Vector3 from, Vector3 to, Vector3 axis )
{
float unsignedAngle = Vector3.GetAngle( from, to );
float cross_x = from.y * to.z - from.z * to.y;
float cross_y = from.z * to.x - from.x * to.z;
float cross_z = from.x * to.y - from.y * to.x;
float sign = MathF.Sign( axis.x * cross_x + axis.y * cross_y + axis.z * cross_z );
return unsignedAngle * sign;
}
public float VelocityAngle { get; private set; }
public int CarDirection { get { return ForwardSpeed.InchToMeter() < 5 ? 0 : (VelocityAngle < 90 && VelocityAngle > -90 ? 1 : -1); } }
private void UpdateSteering( float dt )
{
var inputSteer = Input.AnalogMove.y;
var absInputSteer = Math.Abs( inputSteer );
var sideSlip = Math.Clamp( avgSideSlip, -1, 1 );
VelocityAngle = -SignedAngle( Body.Velocity, WorldRotation.Forward, WorldRotation.Up );
var steerConeFactor = Math.Clamp( TotalSpeed / SteerConeMaxSpeed, 0, 1 );
var steerCone = 1 - steerConeFactor * (1 - SteerConeMaxAngle);
steerCone = Math.Clamp( steerCone, Math.Abs( sideSlip ), 1 );
inputSteer = ExpDecay( this.inputSteer, inputSteer * steerCone, SteerConeChangeRate, dt );
this.inputSteer = inputSteer;
var counterSteer = sideSlip * steerConeFactor * (1 - absInputSteer);
counterSteer = Math.Clamp( counterSteer, -1, 1 ) * CounterSteer;
inputSteer = Math.Clamp( inputSteer + counterSteer, -1, 1 );
float target = -inputSteer * MaxSteerAngle;
if ( CarDirection > 0 )
target -= VelocityAngle * CounterSteer;
inputSteer = Math.Clamp( inputSteer, -1, 1 );
Steering = inputSteer;
SteerAngle = new( 0, -inputSteer * MaxSteerAngle, 0 );
if ( ForwardSpeed < -100 )
jTurnMultiplier = 0.5f;
else
jTurnMultiplier = ExpDecay( jTurnMultiplier, 1, 2, dt );
SteerAngle = new( 0, target, 0 );
}
}

View File

@@ -2,27 +2,9 @@
public partial class VeloXCar
{
private float avgSideSlip;
private float avgPoweredRPM;
private float avgForwardSlip;
private void WheelThink( in float dt )
{
float avgRPM = 0, totalSideSlip = 0, totalForwardSlip = 0;
foreach ( var w in Wheels )
{
w.Update( this, dt );
totalSideSlip += w.SideSlip;
totalForwardSlip += w.ForwardSlip;
var rpm = w.RPM;
avgRPM += rpm * w.DistributionFactor;
}
avgPoweredRPM = avgRPM;
avgSideSlip = totalSideSlip / Wheels.Count;
avgForwardSlip = totalForwardSlip / Wheels.Count;
}
}

View File

@@ -7,32 +7,6 @@ namespace VeloX;
[Title( "VeloX - Car" )]
public partial class VeloXCar : VeloXBase
{
protected override void OnStart()
{
base.OnStart();
//StreamPlayer = new( Stream );
//if ( IsDriver )
//{
// UpdateGearList();
// UpdatePowerDistribution();
//}
}
protected override void OnUpdate()
{
base.OnUpdate();
//if ( StreamPlayer is not null )
//{
// StreamPlayer.Throttle = Throttle;
// StreamPlayer.RPMPercent = RPMPercent;
// StreamPlayer.EngineState = EngineState;
// StreamPlayer.IsRedlining = IsRedlining;
// StreamPlayer.Update( Time.Delta, WorldPosition );
//}
}
protected override void OnFixedUpdate()
{
if ( !IsDriver )