Представление ориентации (матрицы, углы Эйлера и кватернионы)

NOTE

Заметка подразумевает, что читатель предварительно знаком с матрицами, углами Эйлера и кватернионами.

Матричная форма

Преимущества

Недостатки

Углы эйлера

Используемая конвенция Эйлера (порядок вращения): Z->X->Y

Преимущества

Недостатки

Подробнее о недостатках

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

Вторая и более проблемная форма aliasing происходит потому, что три угла не совсем независимы друг от друга. Например, поворот X = 135° — это то же самое, что и Y = 180°, затем X = 45°, затем Z = 180°.

Чтобы гарантировать уникальное представление для любой данной ориентации, мы должны ограничить диапазоны углов. Одной из распространенных техник является ограничение Y и Z до ±180° и ограничение X до ±90°. Это устанавливает соглашение «канонического» набора углов Эйлера.

Самый известный (и раздражающий) тип проблемы с aliasing, с которой страдают углы Эйлера, иллюстрируется этим примером: если мы вращаем Y на 45°, а затем вращаем X на 90°, это то же самое, что X на 90°, а затем Z на 45°. (Рисунок со сферой нарисовать)
Фактически, как только выбираем X ±90° – в этот момент ось Z совпадает с осью Y, и начинают вращаться вокруг одной и той же вертикальной оси. Мы теряем одну степень свободы — два угла делают одно и то же, и управлять ориентацией независимо по трём осям больше невозможно. Это явление известно как Gimbal Lock. Чтобы устранить эту неоднозначность в каноническом наборе углов Эйлера, мы договариваемся: всё вращение вокруг вертикальной оси отдаётся углу Y, а Z принудительно обнуляется. Другими словами, в каноническом наборе, если X = ±90°, то Z = 0°, а Y остаётся таким, какой есть.

Операция интерполирования между двумя ориентациями A и B также является важной в задачах, например, анимаций персонажей или автоматического управления камерой.

Наивный подход чтобы проинтерполировать заключается в том, чтобы интерполировать каждый из трех углов независимо. Но это чревато некоторыми проблемами:

wrap(x)=x360x+180360Δθ=wrap(θ1θ0)θt=θ0+tΔθ\begin{align*} \text{wrap}(x) &= x - 360^\circ \left\lfloor \frac{x + 180^\circ}{360^\circ} \right\rfloor \\ \Delta\theta &= \text{wrap}(\theta_1 - \theta_0) \\ \theta_t &= \theta_0 + t\Delta\theta \end{align*}

В итоге, простые проблемы aliasing имеют обходные пути, но не gimbal lock. К сожалению, gimbal lock – это не просто мелкая неприятность, это фундаментальная проблема. Возможно, мы могли бы переформулировать наши вращения и разработать систему, которая не страдает от этих проблем? К сожалению, это невозможно. Это фундаментальное ограничение, связанное с использованием трёх чисел для описания 3D-ориентации. Любая система, которая параметризует ориентацию в трехмерном пространстве с помощью трех чисел, гарантированно будет иметь особенности в пространстве параметризации и, следовательно, будет подвержена таким проблемам, как gimbal lock.

Кватернионы

Если вы не знакомы с кватернионами, прочитайте базовое введение

Продолжение…

Best Practices