Странное поведение в управлении машины в Unity 3D
Всем здравствуйте, такая проблема возникла, при запуске сцены машина нормально управляется но когда я нажимаю назад и влево машина резко разгоняется и кружится по кругу, все показал в видео. Код тут - https://jmp.sh/s/0pxCUQBIsFOcuAbYcIdU
public void CalculateAndApplySteering(float input, float maxSteerAngle, List<AxleInfo> allAxles)
{
// Находим самый дальний мост (с минимальным Z, так как в Unity Z вперед)
AxleInfo farestAxle = allAxles[0];
float minZ = (farestAxle.leftWheel.transform.localPosition + farestAxle.rightWheel.transform.localPosition).z / 2f;
for (int a = 1; a < allAxles.Count; a++)
{
float currentZ = (allAxles[a].leftWheel.transform.localPosition + allAxles[a].rightWheel.transform.localPosition).z / 2f;
if (currentZ < minZ)
{
minZ = currentZ;
farestAxle = allAxles[a];
}
}
float wheelTrack = Vector3.Distance(leftWheel.transform.localPosition, rightWheel.transform.localPosition);
float wheelBase = Mathf.Abs(((farestAxle.leftWheel.transform.localPosition + farestAxle.rightWheel.transform.localPosition) / 2f).z -
((leftWheel.transform.localPosition + rightWheel.transform.localPosition) / 2f).z);
float angle = maxSteerAngle * input;
if (Mathf.Abs(angle) > 0.1f)
{
// Правильный расчет углов Аккермана
if (angle > 0) // Поворот вправо
{
// Внешнее колесо (левое)
leftAckermanCorrectionAngle = Mathf.Atan(wheelBase / (wheelBase / Mathf.Tan(Mathf.Deg2Rad * angle) + wheelTrack / 2f)) * Mathf.Rad2Deg;
// Внутреннее колесо (правое) - больше угол
rightAckermanCorrectionAngle = Mathf.Atan(wheelBase / (wheelBase / Mathf.Tan(Mathf.Deg2Rad * angle) - wheelTrack / 2f)) * Mathf.Rad2Deg;
}
else // Поворот влево
{
// Внешнее колесо (правое)
rightAckermanCorrectionAngle = Mathf.Atan(wheelBase / (wheelBase / Mathf.Tan(Mathf.Deg2Rad * -angle) + wheelTrack / 2f)) * Mathf.Rad2Deg;
// Внутреннее колесо (левое) - больше угол
leftAckermanCorrectionAngle = Mathf.Atan(wheelBase / (wheelBase / Mathf.Tan(Mathf.Deg2Rad * -angle) - wheelTrack / 2f)) * Mathf.Rad2Deg;
// Сохраняем знак угла
rightAckermanCorrectionAngle *= -1;
leftAckermanCorrectionAngle *= -1;
}
// Применяем коэффициент Аккермана (1 - полный Аккерман, 0 - параллельные колеса)
leftAckermanCorrectionAngle = angle * (1 - ackermanSteering) + leftAckermanCorrectionAngle * ackermanSteering;
rightAckermanCorrectionAngle = angle * (1 - ackermanSteering) + rightAckermanCorrectionAngle * ackermanSteering;
}
else
{
rightAckermanCorrectionAngle = 0f;
leftAckermanCorrectionAngle = 0f;
}
leftWheel.steerAngle = leftAckermanCorrectionAngle;
rightWheel.steerAngle = rightAckermanCorrectionAngle;
}