Unity 6.3
0 онлайн 91 гостей 3 в системе
Вход
GameObjects Шаг 8 из 56

Программирование с использованием класса Quaternion

Unity использует класс Quaternion, чтобы хранить трёхмерную ориентацию GameObject, а также описывать относительный поворот из одной ориентации в другую.

На этой странице дан обзор класса Quaternion и типичных сценариев его использования в скриптах. Полный справочник по всем членам класса Quaternion см. в Справочная информация о кватернионах.

Важно понимать разницу между Эйлеровыми углами (значения X, Y и Z, которые вы видите в инспекторе для вращения объекта). GameObject), и базовое значение кватерниона, который Unity используется для хранения фактического вращения GameObjectsВместо " основы этой темы " читать " основы этой темы ". Ротация и ориентация в Unity.

Работая с поворотами в скриптах, используйте класс Quaternion и его функции для создания и изменения значений поворота. Иногда углы Эйлера уместны, но помните: — используйте функции класса Quaternion, работающие с углами Эйлера; — считывание, изменение и повторное применение значений Эйлера к повороту может дать непреднамеренные побочные эффекты (см. ниже).

Создание и обработка кватернионов напрямую

В классе Quaternion в Unity есть ряд функций, позволяющих создавать повороты и работать с ними, вообще не прибегая к углам Эйлера; именно их и стоит использовать в большинстве типичных случаев. Каждая из ссылок ниже ведёт в справочник по скриптам с примерами кода:

Создание поворотов:

Манипулирование вращениями:

Класс Transform также предоставляет методы для работы с поворотами Quaternion:

Работа с Эйлеровыми углами

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

Более подробно о том, как именно могут возникать эти проблемы, вы можете прочитать на справочной странице скрипта eulerAngles.

Вот некоторые примеры ошибок, часто совершаемых с помощью гипотетического примера попытки повернуть GameObject вокруг оси X на 10 градусов в секунду. Вот чего вы должны избегать:

// rotation scripting mistake #1
// the mistake here is that we are modifying the x value of a quaternion
// this value does not represent an angle, and does not produce desired results
    
void Update () 
{
    var rot = transform.rotation;
    rot.x += Time.deltaTime * 10;
    transform.rotation = rot;
}
// rotation scripting mistake #2
// Read, modify, then write the Euler values from a Quaternion.
// Because these values are calculated from a Quaternion,
// each new rotation might return very different Euler angles, which might suffer from gimbal lock.
        
void Update () 
{
    var angles = transform.rotation.eulerAngles;
    angles.x += Time.deltaTime * 10;
    transform.rotation = Quaternion.Euler(angles);
}

А вот пример использования Эйлеровых углов в скрипте правильно:

// Rotation scripting with Euler angles correctly.
// Store the Euler angle in a class variable, and only use it to
// apply it as an Euler angle, but never rely on reading the Euler back.
        
float x;
void Update () 
{
    x += Time.deltaTime * 10;
    transform.rotation = Quaternion.Euler(x,0,0);
}

Дополнительные ресурсы