Как правильно использовать кватернионы для отклонения на x величин от исходного поворота?

#c# #unity3d #scripting #rotation #quaternions

#c# #unity3d #сценарии #вращение #кватернионы

Вопрос:

Я собираюсь выпустить свою первую игру, и на последних штрихах застрял с кватернионами.

У меня есть GameObject с моими скриптами, и его дочерний элемент содержит сетку. Когда машина дрейфует, я пытаюсь повернуть сетку на x градусов от положения покоя, и когда машина ускоряется или уменьшается, немного по оси x в соответствии с этим, но она просто случайным образом вращается в направлении y. Есть какие-нибудь подсказки?

 void RotateMesh()
{
    float xRotation = -90 - thrust * 20;
    float yRotation = -transform.rotation.eulerAngles.y;
    float zRotation = 0 - rightVelocity * 50;
    mesh.rotation = Quaternion.Euler(xRotation, yRotation, zRotation);
}
  

Комментарии:

1. Углы должны быть указаны в радианах.

Ответ №1:

Согласно документации, Quaternion.Euler класс «Возвращает поворот, который поворачивает на z градусов вокруг оси z, на x градусов вокруг оси x и на y градусов вокруг оси y.», предполагая, что это реализует углы Эйлера z-x-y.

К сожалению, при использовании углов Эйлера оси нельзя рассматривать как независимые — операция создаст кватернион, который сначала вращается вокруг оси Z, затем принимает результат и поворачивает его с помощью поворота X, а результат этого затем поворачивается вокруг оси Y. К сожалению, Unity, похоже, не реализует какой-либо другой тип углов Эйлера — если вам нужно изменить порядок, вы можете поэкспериментировать с чем-то вроде:

 mesh.rotation = Quaternion.Euler(0, yRotation, 0) * 
     Quaternion.Euler(xRotation, 0, 0) * Quaternion.Euler(0, 0, zRotation);
  

Поскольку у меня нет остальной части вашей игры, я не могу проверить точный порядок, который подходит для вашего предполагаемого варианта использования — выше приведен всего лишь пример того, как создать кватернион, реализующий другой тип углов Эйлера, чем по умолчанию.