Question by
qkrqntjd · Feb 28, 2019 at 03:45 PM ·
physicscar gamecar physics
How to make rpm increase like this video
I'm make car game . but ,now my car engine script does not increase rpm like this
The rpm increases only when rear tires hit the ground This is the FixedUpdate part of my engine script.
float ratio = gearRatios[gear] * finalDriveRatio;
float inertia = engineInertia * Sqr(ratio);
float engineFrictionTorque = engineBaseFriction + rpm * engineRPMFriction;
float engineTorque = (CalcEngineTorque() + Mathf.Abs(engineFrictionTorque)) * throttle;
if (backFireEnabled)
{
//backfire calculation
if (engineFrictionTorque > lastEngFricTorq)
{ //increasing
backfireTracker -= Mathf.Abs(engineFrictionTorque - lastEngFricTorq);
backfireTracker = Mathf.Clamp(backfireTracker, 0f, backfireTracker);
}
else if (engineFrictionTorque < lastEngFricTorq)
{// decreasing
backfireTracker += Mathf.Abs(engineFrictionTorque - lastEngFricTorq);
}
if (backfireTracker > 32f)
{
backfirePS.Emit(5);
GetComponent<SoundController>().playBackFire();
backfireTracker = 0f;
}
lastEngFricTorq = engineFrictionTorque;
}
slipRatio = 0.0f;
// TURBO //
float turboPower = 1f;
if (enableTurbo)
{
float temp = turbo.CalculateTorque((rpm / powerRPM), throttle);
turboPower = 1f + temp;
}
turbo.angularVelocity = engineAngularVelo;
if (ratio == 0 || (clutch == 1 && (int)(GetComponent<Rigidbody>().velocity.magnitude * 3.6f) > 5))
{
// Neutral gear - just rev up engine
float engineAngularAcceleration = (engineTorque - engineFrictionTorque) / engineInertia;
engineAngularVelo += engineAngularAcceleration * Time.deltaTime;
if ((int)GetComponent<Rigidbody>().velocity.magnitude * 3.6f == 0 && engineAngularVelo < 0f)
engineAngularVelo = 0f;
// Apply torque to car body
GetComponent<Rigidbody>().AddTorque(-engineOrientation * engineTorque * 2.5f);
}
else
{
float drivetrainFraction = 1.0f / poweredWheels.Length;
float averageAngularVelo = 0;
foreach (Wheel w in poweredWheels)
averageAngularVelo += w.angularVelocity * drivetrainFraction;
float engineAngularAcceleration = (engineTorque - engineFrictionTorque) / engineInertia;
// Apply torque to wheels
foreach (Wheel w in poweredWheels)
{
float lockingTorque = (averageAngularVelo - w.angularVelocity) * differentialLockCoefficient;
w.drivetrainInertia = inertia * drivetrainFraction;
w.driveFrictionTorque = engineFrictionTorque * Mathf.Abs(ratio) * drivetrainFraction;
w.driveTorque = engineTorque * ratio * drivetrainFraction + lockingTorque;
slipRatio += w.slipRatio * drivetrainFraction;
}
engineAngularVelo = averageAngularVelo * ratio;
}
Debug.Log(engineAngularVelo + " /" + engineAngularVelo * (60.0f / (2 * Mathf.PI)));
// update state
slipRatio *= Mathf.Sign(ratio);
rpm = engineAngularVelo * (60.0f / (2 * Mathf.PI));
rpm = Mathf.Clamp(rpm, 0f, maxRPM + minRPM); //limit excess rpm
Comment