#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);
Поскольку у меня нет остальной части вашей игры, я не могу проверить точный порядок, который подходит для вашего предполагаемого варианта использования — выше приведен всего лишь пример того, как создать кватернион, реализующий другой тип углов Эйлера, чем по умолчанию.