Unity 6.3
0 онлайн 76 гостей 3 в системе
Вход

Quaternion.eulerAngles

Declaration

public Vector3 eulerAngles;

Описание

Возвращает или устанавливает эйлеровский угол представления вращения в градусах.

Эйлеровы углы могут представлять трехмерное вращение, выполняя три отдельных вращения вокруг отдельных осей. В Unity эти вращения выполняются вокруг оси Z, оси X и оси Y, в этом порядке.

Вы можете установить вращение кватерниона, установив это свойство, и вы можете прочитать значения Эйлеровых углов, прочитав это свойство.

Когда вы задаёте поворот через свойство .eulerAngles, важно понимать: хотя вы описываете поворот значениями по осям X, Y и Z, именно эти значения в повороте не сохраняются. Вместо этого значения X, Y & Z преобразуются во внутренний формат Quaternion.

Когда вы читаете свойство .eulerAngles, Unity преобразует внутреннее представление поворота в Quaternion в углы Эйлера. Поскольку один и тот же поворот можно описать углами Эйлера несколькими способами, считанные значения могут заметно отличаться от тех, которые вы присваивали. Это может сбивать с толку, если вы пытаетесь постепенно наращивать значения для получения анимации. Подробнее см. в примере скрипта внизу страницы.

Чтобы избежать подобных проблем, рекомендуемый способ работы с вращениями заключается в том, чтобы не полагаться на последовательные результаты при чтении .eulerAngles, особенно при попытке постепенно увеличивать вращение для создания анимации. Для лучших способов достижения этого, см. Оператор кватерниона *.

Следующий пример демонстрирует вращение GameObject с помощью eulerAngles на основе ввода пользователя. Пример показывает, что мы никогда не полагаемся на чтение Quanternion.eulerAngles для увеличения вращения, вместо этого мы устанавливаем его с помощью наших Vector3 currentEulerAngles. Все изменения вращения происходят в переменной currentEulerAngles, которые затем применяются к кватерниону, избегая проблемы, упомянутой выше.

using UnityEngine;

public class DocsEulerAngles : MonoBehaviour { float rotationSpeed = 45; Vector3 currentEulerAngles; Quaternion currentRotation; float x; float y; float z;

void Start() { // Initialize the quaternion to identity currentRotation = Quaternion.identity; currentEulerAngles = Vector3.zero; }

void Update() { if (Input.GetKeyDown(KeyCode.X)) x = 1 - x; if (Input.GetKeyDown(KeyCode.Y)) y = 1 - y; if (Input.GetKeyDown(KeyCode.Z)) z = 1 - z;

//modifying the Vector3, based on input multiplied by speed and time currentEulerAngles += new Vector3(x, y, z) * Time.deltaTime * rotationSpeed;

//creating a new Quaternion from the updated euler angles currentRotation = Quaternion.Euler(currentEulerAngles);

// set the rotation of the gameObject transform.rotation = currentRotation; }

void OnGUI() { GUIStyle style = new GUIStyle(); style.fontSize = 18; style.normal.textColor = Color.white; GUI.Label(new Rect(10, 0, 500, 25), "Press X, Y, Z keys to toggle rotation on each axis", style); GUI.Label(new Rect(10, 25, 500, 25), "Rotating on X:" + x + " Y:" + y + " Z:" + z, style);

// Show our accumulated euler angles (what we're setting) GUI.Label(new Rect(10, 50, 500, 25), "Accumulated Euler angles: " + currentEulerAngles.ToString("F1"), style);

// Use eulerAngles to show the euler angles of the quaternion stored in currentRotation GUI.Label(new Rect(10, 75, 500, 25), "Quaternion.eulerAngles: " + currentRotation.eulerAngles.ToString("F1"), style);

// Show the transform.eulerAngles of the GameObject (should match currentRotation.eulerAngles) GUI.Label(new Rect(10, 100, 500, 25), "Transform.eulerAngles: " + transform.eulerAngles.ToString("F1"), style); // Show the actual quaternion values for reference GUI.Label(new Rect(10, 125, 500, 25), "Quaternion (x,y,z,w): " + currentRotation.ToString("F3"), style); } }

Следующий пример показывает, как значения, которые вы читаете из .eulerAngles, могут сильно отличаться от значений, которые вы назначаете, даже если они представляют одно и то же вращение.

using UnityEngine;

// demonstration of eulerAngles not returning the same values as assigned public class EulerAnglesProblemExample : MonoBehaviour { private void Start() { Quaternion myRotation = Quaternion.identity; myRotation.eulerAngles = new Vector3(150, 35, 45);

Debug.Log(myRotation.eulerAngles);

// output is: (30.0, 215.0, 225.0) } }