Получить упрощенное вращение объекта
В моей игре я всегда вращаю игровой объект (Куб) с помощью Quaternion.Lerp. И мне нужно, какое лицо этого куба смотрит вверх. Поэтому я думаю, что могу использовать текущее вращение объекта, чтобы получить это (если есть лучший способ, пожалуйста, скажите это).
Во-первых, это вращение игрового объекта (0,0,0). когда я поворачиваю его вперед, он становится (90,0,0). Нет проблем. Но после этого, когда я поворачиваю его во второй раз, он не становится (180,0,0). это (0,180,180). Как я могу предотвратить единство, чтобы сделать это.
2 ответа
Попробуйте использовать углы Эйлера вместо кватернионов, они намного проще, вот пример:
transform.eulerAngles = new Vector3(180, 0, 0);
Существует несколько способов представления поворота с углами Эйлера. Когда вы конвертируете вращение вашего GameObject (хранится внутри как кватернион) в углы Эйлера (используя либо transform.eulerAngles
или же transform.rotation.eulerAngles
Вы можете не получить ожидаемого результата.
Вы можете обойти это, сохранив Vector3 (назовем его currentRotation
) содержащий вращение вашего объекта в углах Эйлера, и построить из него кватернионы, используя Quaternion.Euler(currentRotation)
, Вы можете выполнить интерполяцию, рассчитав вращение цели (targetRotation
) как Vector3, а затем построить кватернион для него, прежде чем делать Quaternion.Lerp
:
var targetRotationQuaternion = Quaternion.Euler(targetRotation);
var currentRotationQuaternion = Quaternion.Euler(currentRotation);
transform.rotation = Quaternion.Lerp(currentRotationQuaternion, targetRotationQuaternion, *your t*);
Кстати, этот ответ очень похож на комментарий на http://answers.unity3d.com/questions/667037/transformrotationeulerangles-not-accuarate.html но его стоит воспроизвести здесь на тот случай, если его когда-нибудь уберут.