unity3d
Кватернионы
Поиск…
Синтаксис
- Quaternion.LookRotation (Vector3 forward [, Vector3 вверх]);
- Quaternion.AngleAxis (поплавковые углы, ось VectorOfRotation);
- float angleBetween = Quaternion.Angle (Quaternion rotation1, Quaternion rotation2);
Вступление к Quaternion vs Euler
Угол Эйлера - это «углы градуса», такие как 90, 180, 45, 30 градусов. Кватернионы отличаются от углов Эйлера тем, что они представляют точку на единичной сфере (радиус равен 1 единице). Вы можете представить эту сферу как трехмерную версию окружности Единицы, которую вы изучаете в тригонометрии. Кватернионы отличаются от углов Эйлера тем, что они используют мнимые числа для определения 3D-вращения.
Хотя это может показаться сложным (и, возможно, это так), Unity имеет большие встроенные функции, которые позволяют переключаться между углами Эйлера и кватерами, а также функции для изменения кватернионов, не зная ни одной вещи о математике позади них.
Преобразование между Эйлером и Кватернионом
// Create a quaternion that represents 30 degrees about X, 10 degrees about Y
Quaternion rotation = Quaternion.Euler(30, 10, 0);
// Using a Vector
Vector3 EulerRotation = new Vector3(30, 10, 0);
Quaternion rotation = Quaternion.Euler(EulerRotation);
// Convert a transfroms Quaternion angles to Euler angles
Quaternion quaternionAngles = transform.rotation;
Vector3 eulerAngles = quaternionAngles.eulerAngles;
Зачем использовать кватернион?
Кватернионы решают проблему, известную как фиксация карданного вала. Это происходит, когда первичная ось вращения становится коллинеарной с третичной осью вращения. Вот наглядный пример @ 2:09
Ротация вращения кватерниона
Quaternion.LookRotation(Vector3 forward [, Vector3 up])
создаст поворот кватерниона, который смотрит вперед «вниз» вперед и имеет ось Y, выровненную с вектором «вверх». Если вектор вверх не указан, будет использоваться Vector3.up.
Поверните этот игровой объект, чтобы посмотреть на целевой объект игры
// Find a game object in the scene named Target
public Transform target = GameObject.Find("Target").GetComponent<Transform>();
// We subtract our position from the target position to create a
// Vector that points from our position to the target position
// If we reverse the order, our rotation would be 180 degrees off.
Vector3 lookVector = target.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(lookVector);
transform.rotation = rotation;