Найти в Дзене
Another Art

Вращение и ориентация игровых объектов в Unity

Оглавление

Приветствую всех друзья! В прошлой статье мы подробно рассмотрели предназначение слоев в Unity. Сегодня мы поговорим о представлении вращения и ориентации в пространстве игровых объектов. Это важная информация особенно для новичков - очень многие путаются на начальных этапах именно во вращении игровых объектов.

Картинка для привлечения внимания из открытых источников
Картинка для привлечения внимания из открытых источников

Вращения в 3D приложениях обычно представляют одним из двух путей: кватернионы (Quaternions) или углы Эйлера (Euler angles). У каждого из них есть свои преимущества и недостатки. Unity под капотом использует для представления вращений кватернионы, но в инспекторе для удобства показаны значения углов Эйлера, это делает изменение значений в инспекторе более простым и легким для понимания.

Углы Эйлера.

Углы Эйлера представлены тремя значениями углов для осей X, Y и Z которые применяются последовательно. Чтобы применить вращение Эйлера к конкретному игровому объекту Каждое значение вращения применяется поочередно, как вращение вокруг своей соответствующей оси.

У углов Эйлера есть следующие преимущества:

- Они имеют интуитивно понятный «человекочитаемый» формат, состоящий из трех углов.

- Они могут представлять собой поворот от одной ориентации к другой через поворот более чем на 180 градусов

Но без недостатков как вы понимаете такой способ представления вращения также не обошелся:

- Они страдают от «Складывания рамок». При применении трех поворотов поочередно возможно, что первое или второе вращение приведет к тому, что третья ось будет направлена в том же направлении, что и одна из предыдущих осей. Это означает, что «степень свободы» была потеряна, потому что третье значение вращения не может быть применено вокруг единственной оси.

Кватернионы.

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

Точно также, как вектор может представлять либо положение, либо направление (где направление измеряется от начала координат), кватернион может представлять либо ориентацию, либо вращение – где вращение измеряется от вращательного «начала координат» или «идентичности». Именно потому, что вращение измеряется таким образом – от одной ориентации к другой – кватернион не может представлять вращение дальше 180 градусов.

К его сильным сторонам можно отнести:

- Вращение через кватернионы не страдает от «Складывания рамок».

К слабым можно отнести следующее:

- Один кватернион не может представлять вращение, превышающее 180 градусов в любом направлении.

- Числовое представление кватерниона не является интуитивно понятным.

Unity хранит вращения всех игровых объектов как кватернионы, так как его достоинства перевешивают недостатки.

Компонент Transform отображает в инспекторе вращения с использованием углов Эйлера, поскольку это легче понять и отредактировать. Unity преобразует новые значения в инспекторе для вращения игрового объекта в новые значения вращения кватерниона.

Отображение вращения в окне инспектора компонента Transform
Отображение вращения в окне инспектора компонента Transform

Существует небольшой побочный эффект от таких преобразований, скажем мы ввели в окне инспектора следующие цифры для Rotation X: 0 Y: 375: Z: 0. Это значение невозможно представить в виде кватерниона, поэтому при запуске игры в инспекторе значения вращения игрового объекта изменятся на X: 0 Y: 15: Z: 0. Это происходит потому, что Unity преобразует вращение в кватернион, который не имеет понятия полного вращения на 360 градусов плюс 5 градусов, вместо этого он настроен на ориентацию таким же образом, как и результат вращения.

Последствия для написания скриптов.

При работе с обработкой вращений в ваших скриптах, вы должны пользоваться классом Quaternion (о нем еще будет отдельная статья) и его функциями для создания и изменения вращательных значений. Есть некоторые ситуации, когда допустимо использовать углы Эйлера, но вы должны иметь в виду – нужно использовать функции класса Quaternion, которые имеют дела с углами Эйлера. Извлечение, изменение и повторное применение значений углов Эйлера из свойства Rotation компонента Transform может вызвать непреднамеренные побочные эффекты.

Последствия для создания анимации.

Многие программы создания трехмерной графики, а также сам Unity с его окном анимации позволяют использовать углы Эйлера для задания поворотов во время анимации.

Эти значения вращений часто могут превышать диапазоны, выражаемые кватернионами. Например, если игровой объект вращается на 720 градусов, это может быть представлено углами Эйлера как X: 720 Y: 0 Z: 0. Но это невозможно представить с помощью значения кватерниона.

В собственном окне анимации (о котором еще будет статья) есть опции, которые позволяют указать, как вращение должно быть интерполировано – с помощью интерполяции кватерниона или углов Эйлера. Задавая интерполяцию Эйлера, вы сообщаете Unity, что хотите получить полный диапазон движения, заданный углами. Однако при вращении кватерниона вы говорите, что просто хотите, чтобы вращение закончилось в определенной ориентации, и Unity использует интерполяцию кватерниона и вращается на кратчайшее расстояние, чтобы добраться туда.

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

Также есть некоторые ситуации, когда даже при повторной дискретизации – кватернионное представление импортированной анимации не может соответствовать оригиналу достаточно близко, по этой причине в Unity 5.3 и выше есть возможность отключить повторную дискретизацию анимации, так что вы можете вместо этого использовать исходные ключевые кадры анимации Эйлера во время выполнения.

Выделенный пункт позволяет переключаться между дискретизацией в кватернионы или оставить все в формате Эйлера
Выделенный пункт позволяет переключаться между дискретизацией в кватернионы или оставить все в формате Эйлера

На сегодня это все. В следующей статье мы обзорно пройдемся по источникам освещения и камерам в Unity. Спасибо всем, кто дочитал эту статью до конца, подписывайтесь на канал, ставьте лайки, а для тех, у кого появились вопросы - спрашивайте в комментариях! А если вы хотите помочь данному каналу в развитии – делитесь этой статьей с друзьями в социальных сетях!

МОЙ КАНАЛ НА YOUTUBE | ГРУППА МОЕЙ ИНДИ ИГРЫ В VK