Browse Source

wheeled vehicle downforce aug. applies a spoiler effect

AzaezelX 7 months ago
parent
commit
69a0c40795

+ 20 - 1
Engine/source/T3D/vehicles/wheeledVehicle.cpp

@@ -315,6 +315,7 @@ WheeledVehicleData::WheeledVehicleData()
    dMemset(&wheel, 0, sizeof(wheel));
    for (S32 i = 0; i < MaxSounds; i++)
       INIT_SOUNDASSET_ARRAY(WheeledVehicleSounds, i);
+   mDownForce = 0;
 }
 
 
@@ -477,6 +478,8 @@ void WheeledVehicleData::initPersistFields()
    addField("brakeTorque", TypeF32, Offset(brakeTorque, WheeledVehicleData),
       "@brief Torque applied when braking.\n\n"
       "This controls how fast the vehicle will stop when the brakes are applied." );
+   addField("downforce", TypeF32, Offset(mDownForce, WheeledVehicleData),
+      "downward force based on velocity.");
    endGroup("Steering");
 }
 
@@ -500,6 +503,7 @@ void WheeledVehicleData::packData(BitStream* stream)
    stream->write(engineTorque);
    stream->write(engineBrake);
    stream->write(brakeTorque);
+   stream->write(mDownForce);
 }
 
 void WheeledVehicleData::unpackData(BitStream* stream)
@@ -519,6 +523,7 @@ void WheeledVehicleData::unpackData(BitStream* stream)
    stream->read(&engineTorque);
    stream->read(&engineBrake);
    stream->read(&brakeTorque);
+   stream->read(&mDownForce);
 }
 
 
@@ -920,6 +925,18 @@ void WheeledVehicle::updateForces(F32 dt)
    Wheel* wend = &mWheel[mDataBlock->wheelCount];
    mRigid.clearForces();
 
+   //calculate here so we can stiffen the springs a bit based on
+   //the final amount of downforce
+   //get the speed
+   F32 downForce = mRigid.linVelocity.lenSquared() <= 1 ? 1 : mRigid.linVelocity.lenSquared();
+   //grab the datablock var
+   downForce *= mDataBlock->mDownForce;
+   //make it a smaller number so we can multiply gravity by it
+   downForce = mSqrt(downForce);
+   downForce *= TickSec;
+   //ensure that it is not smaller then one, cause mulltiplying gravity by fractions is baaaad
+   downForce = downForce < 1 ? 1 : downForce;
+
    // Calculate vertical load for friction.  Divide up the spring
    // forces across all the wheels that are in contact with
    // the ground.
@@ -955,6 +972,8 @@ void WheeledVehicle::updateForces(F32 dt)
          // Spring force & damping
          F32 spring  = wheel->spring->force * (1 - wheel->extension);
 
+         spring += (spring * downForce);
+
          if (wheel->extension == 0) //spring fully compressed
          {
             // Apply impulses to the rigid body to keep it from
@@ -1110,7 +1129,7 @@ void WheeledVehicle::updateForces(F32 dt)
    mRigid.force += mAppliedForce;
 
    // Container drag & buoyancy
-   mRigid.force  += Point3F(0, 0, mRigid.mass * mNetGravity);
+   mRigid.force  += Point3F(0, 0, mRigid.mass * mNetGravity * downForce);
    mRigid.force  -= mRigid.linVelocity * mDrag;
    mRigid.torque -= mRigid.angMomentum * mDrag;
 

+ 1 - 0
Engine/source/T3D/vehicles/wheeledVehicle.h

@@ -141,6 +141,7 @@ struct WheeledVehicleData: public VehicleData
    ClippedPolyList rigidBody;    // Extracted from shape
    S32 brakeLightSequence;       // Brakes
    S32 steeringSequence;         // Steering animation
+   F32 mDownForce;
 
    //
    WheeledVehicleData();