Hi all,
I’m trying to write yet another vehicle controller. I’ve created a power train that “sends power” to each driving wheel. I’m having an issue where no matter the calculations I do, the vehicle never goes faster in higher gears, only goes slower because of the “real life” calculations of the engine.
I am using Sphere colliders with articulation bodies on them to act as custom wheels. This way I am able to get the contact points and have a little more control over them (for example, driving big wheels upside down and gaining an average direction based on contact points).
As an example, my engine at 8000rpm and 333hp produces about 218ft-lb of torque. The first gear ratio 4.23 and a final drive ratio of 3.62. This should produce 522rpm and 1669ft-lb of torque to each wheel (218 * 4.23 * 3.62 = 3338 / 2).
Because I am using Sphere colliders, I am figuring I will have to use AddForce to each drive wheel to push the car forwards. I have tried many different approaches from here; applying force simply using AddForce with the torque output, applying force with watts, finding angular velocities, getting force in newton meters, using ForceMode.Acceleration, comparing expected speeds, etc.
All of these come up short when it comes to shifting to the next gear. Once I shift, because the RPMs increase but the torque decreases, I am not able to go any faster when using solely torque and am actually going slower than the previous lower gear. I’ve been working on this issue for days now.
I’d like to simulate this relatively realistically, but I cannot figure out how to realistically push the car forward to get to the correct speed.
I have my torque curve based off of maximum HP, RPM and a power curve (Red is HP and Blue is Torque)

// In Newtons
inputTorqueNm = inputTorque * 1.35582f;
// Get the tractive forces for later when I want the wheel to spin
tractionMax = frictionCoefficientMax * weightSupported * 9.80665f;
tractiveForce = inputTorque / wheelRadius;
// If the expected RPMs are higher than the current RPMs, need to check torque
expectedWheelRPM = inputRPMs;
expectedWheelSpeedMps = inputRPMs * wheelRadius * (2 * Mathf.PI / 60);
currentWheelRPM = articulationBody.velocity.z * 60 / (wheelRadius * 2 * Mathf.PI);
currentWheelSpeedMps = currentWheelRPM * wheelRadius * (2 * Mathf.PI / 60);
// Find resistive forces for later.
roadGradientRadians = Mathf.Acos(Vector3.Dot(averageDirection.normalized, Vector3.forward));
rollingResistance = 0.015f * weightSupported * Mathf.Cos(roadGradientRadians);
dragResistance = 0.5f * airDensity * dragCoefficient * frontalArea * Mathf.Pow(currentWheelSpeedMps, 2);
I’ve looked through many different ways, though I feel they either do not address the torque or they do not address the RPMs. I do not want to use a linear speed percentage to reduce the Acceleration force, but I want the calculation to “wind out” the gear.
I may have just been looking at this for far too long and am probably missing something simple, but any help is accepted. TYIA!