void ApplyMotorTorque(ref Ackermann ackermann, float maxTorque, float value) { float fs, fp, rs, rp; // If we have Ackerman steering, we apply torque based on the steering radius of each wheel var radii = AckermannUtils.GetRadii(ackermann.angle, ackermann.AxleSeparation, ackermann.AxleWidth); var total = radii[0] + radii[1] + radii[2] + radii[3]; fp = radii[0] / total; fs = radii[1] / total; rp = radii[2] / total; rs = radii[3] / total; if (ackermann.angle > 0) { ackermann.m_FrontRight.motorTorque = value * maxTorque * fp; ackermann.m_FrontLeft.motorTorque = value * maxTorque * fs; ackermann.m_RearRight.motorTorque = value * maxTorque * rp; ackermann.m_RearLeft.motorTorque = value * maxTorque * rs; } else { ackermann.m_FrontLeft.motorTorque = value * maxTorque * fp; ackermann.m_FrontRight.motorTorque = value * maxTorque * fs; ackermann.m_RearLeft.motorTorque = value * maxTorque * rp; ackermann.m_RearRight.motorTorque = value * maxTorque * rs; } }
public void Run(float delta) { var farAngle = AckermannUtils.GetSecondaryAngle(angle, AxleSeparation, AxleWidth); // The rear wheels are always at 0 steer in Ackermann m_RearLeft.steerAngle = m_RearRight.steerAngle = 0; if (Mathf.IsZeroApprox(angle)) { m_FrontRight.steerAngle = m_FrontLeft.steerAngle = 0; } m_FrontLeft.steerAngle = angle; m_FrontRight.steerAngle = farAngle; }