Я поворачиваю своего игрового персонажа, чтобы посмотреть на цель, используя следующий код:
transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f)
startQuaternion - это текущее вращение персонажа, когда дается новая цель.
lookQuaternion - это направление, в котором должен смотреть персонаж, и оно установлено так:
destinationVector = currentWaypoint.transform.position - transform.position;
lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up);
turnNormalizer просто Time.deltaTime
увеличивается и turningSpeed
является статическим значением, заданным в редакторе.
Проблема в том, что, хотя персонаж поворачивается, как и должно быть, большую часть времени, у него есть проблемы, когда он должен приблизиться к 180 градусам. Тогда это иногда дрожит и отражает вращение:
На этом плохо нарисованном изображении персонаж (справа) начинает поворачиваться к кругу слева. Вместо того, чтобы просто повернуть налево или направо, начинается «зеркальный танец»:
- Он начинает вращаться в направлении новой облицовки
- Затем он внезапно поворачивается на тот же угол, но на другой стороне и продолжает вращаться
Он делает это «зеркальное отображение» так долго, пока не смотрит на цель. Это что-то с кватернионами, сползанием / лепрпингом или чем-то еще?
РЕДАКТИРОВАТЬ 1: Очевидно, проблема не возникает из-за самого вращения. Более вероятная проблема заключается в том, что персонаж движется по направлению к лицу во время его вращения. Ограничение угла между лицом и целью, когда персонажу позволено двигаться, иногда уменьшает вращение дрожания / отражения.
Это, конечно, вызывает больше вопросов, почему персонаж не может двигаться и вращаться одновременно без проблем? Код, используемый для движения:
transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);