1. Ориентация твердого тела
Вращение

Для того чтобы описать движение твердого тела, нам нужно знать его положение и ориентацию. Положение можно описывать так же как это делали с точкой. С ориентацией все немного сложнее. Для этого вводится локальная система координат, которая ассоциирована с телом. Она может вращаться и двигаться вместе с телом. Локальная система координат имеет 3 оси, которые образуют ортонормированный базис. Эти оси могут быть выражены в глобальной системе координат.
Для того чтобы описать ориентацию существует несколько способов: Опишу
- Матрица поворота
- Кватернионы
Об углах Эйлера сказано много всего. В общем это не лучший способ описывать ориентацию. Много особенных случаев, которые даже имеют свои названия (gimbal lock).
Матрица поворота
Матрица поворота - это матрица, которая описывает поворот в пространстве. Она имеет размерность 3x3 и является ортогональной. Это значит, что ее строки (или столбцы) образуют ортонормированный базис. Из полезных свойств матрицы поворота:
- $R^T = R^{-1}$ - обратная матрица равна транспонированной
- $det(R) = 1$ - определитель матрицы равен 1
матрица $R \in \mathbb{R}^{3 \times 3}$, которая описывает ориентацию твёрдого тела выглядит следующим образом:
$$ R = \begin{bmatrix} | & | & | & \\ e_{1}^{global} & e_{2}^{global} & e_{3}^{global} \\ | & | & | & \\ \end{bmatrix} $$
где $e_{i}^{global}$ - ось твердого тела выраженная в глобальной системе координат.
Если составить такую матрицу, то получим ориентацию твердого тела. Это матрица $R_{global←local}$, которая переводит вектор из локальной системы координат в глобальную. Т.е. если у нас есть вектор $v_{local}$, то его глобальная форма будет:
$$ v_{global} = R_{global←local} * v_{local} $$
Кватернионы
имеют 4 компоненты: $q = (w, x, y, z)$, где $w$ - это скалярная часть, а $(x, y, z) = \vec{v}$ - векторная часть. Часто их записывают в виде $q = (w, \vec{v})$.
Операции
Для них определены операции сложения
$$ q_1 + q_2 = (w_1, \vec{v_1}) + (w_2, \vec{v_2}) = (w_1 + w_2, \vec{v_1} + \vec{v_2}) $$
и умножения через векторное произведение
$$ q_1 * q_2 = (w_1, \vec{v_1}) * (w_2, \vec{v_2}) = (w_1 w_2 - \vec{v_1} \cdot \vec{v_2}, w_1 \vec{v_2} + w_2 \vec{v_1} + \vec{v_1} \times \vec{v_2}) $$
где $\cdot$ - скалярное произведение, а $\times$ - векторное произведение. Тк векторное произведение не коммутативно, то умножение кватернионов не коммутативно. Это значит, что порядок имеет значение. Например, $q_1 * q_2 \neq q_2 * q_1$. И операция деления определена как
$$ q_1 / q_2 = q_1 * q_2^{-1} $$
где $q_2^{-1} = (w_2, \vec{v_2})^{-1} = (w_2, -\vec{v_2}) / (w_2^2 + \vec{v_2}^2)$ - обратный кватернион. Для нормированного кватерниона $q$ определено его сопряжение как
$$ q^* = (w, \vec{v})^* = (w, -\vec{v}) $$
и его длина как
$$ |q| = \sqrt{w^2 + \vec{v}^2} $$
Для нормированных кватернионов определены экспонента и логарифм. Экспонента кватерниона определяется как
$$ e^{q} = e^{w} * e^{\vec{v}} = e^{w} * (cos(|\vec{v}|), sin(|\vec{v}| \frac{\vec{v}}{|\vec{v}|})) $$
где $|\vec{v}|$ - длина векторной части кватерниона. Логарифм кватерниона определяется как
$$ log(q) = (log(|q|), \frac{\vec{v}}{|q|} * arccos(\frac{w}{|q|})) $$
где $|q|$ - длина кватерниона.
Благодаря этому нормированные кватернионы можно использовать для описания ориентации. Например, если у нас есть вектор $v$ и мы хотим его повернуть на угол $\theta$ вокруг оси $\vec{u}$, то мы можем записать это как:
$$
q_v = (0, \vec{v})
q = (cos(\frac{\theta}{2}), sin(\frac{\theta}{2}) \vec{u})
q = q * q_v * q^{-1} q = (0, \vec{v’})
$$
Если мы говорим, что у нас есть кватернион $q_{global←local}$, который переводит вектор из локальной системы координат в глобальную. Т.е. если у нас есть вектор $v_{local}$, то его глобальная форма будет:
$$ v_{global} = q_{global←local} * v_{local} * q_{global←local}^{-1} $$
Перевод из кватернионов в матрицу поворота и обратно
Для того чтобы перевести кватернион в матрицу поворота, нужно воспользоваться следующими формулами:
$$ R = \begin{bmatrix} 1 - 2y^2 - 2z^2 & 2xy - 2wz & 2xz + 2wy \\ 2xy + 2wz & 1 - 2x^2 - 2z^2 & 2yz - 2wx \\ 2xz - 2wy & 2yz + 2wx & 1 - 2x^2 - 2y^2 \end{bmatrix} $$
где $q = (w, x, y, z)$ - кватернион. Для того чтобы перевести матрицу поворота в кватернион, нужно воспользоваться следующими формулами:
$$ q = \begin{bmatrix} w \\ x \\ y \\ z \end{bmatrix} $$
где
$$ w = \sqrt{1 + R_{11} + R_{22} + R_{33}} / 2 \\ x = \sqrt{1 + R_{11} - R_{22} - R_{33}} / 2 \\ y = \sqrt{1 - R_{11} + R_{22} - R_{33}} / 2 \\ z = \sqrt{1 - R_{11} - R_{22} + R_{33}} / 2 $$
где $R_{ij}$ - элементы матрицы поворота. Если $w$ отрицательный, то нужно поменять знаки у всех компонент кватерниона.
Slerp
Slerp -
Nlerp