Представление ориентации при помощи кватернионов (quaternions)

Кватернион – набор четырех значений, первое (скалярная часть) определяет поворот вокруг вектора, остальные три (векторная часть) определяют вектор оси поворота. Нормированный (normalized) кватернион, т.е. тот, у которого сумма квадратов всех компонентов равна единице, обладает следующими свойствами: скалярная часть равна косинусу половины угла поворота, векторная часть – ось вращения, длина вектора оси равна синусу половины угла поворота. Нормированный кватернион может определять повороты только от –PI до +PI. Именно кватернионы, а не углы Эйлера используются в 3ds max (и вообще в компьютерной графике) для хранения поворотов объектов, поскольку это наиболее надежный и удобный способ. Вектор можно выразить через кватернион, у которого скалярная часть равна нулю. Повороты и отсчет углов в MAXScript происходят по правилу правой руки, т.е. против часовой стрелки вокруг положительного направления оси при вращении на положительный угол.

Конструкторы:
  1. quat <x_float> <y_float> <z_float> <w_float>, где x, y, z – вектор, w – поворот.
  2. quat <degrees_float> <axis_point3>, где <degrees_float> – угол в градусах, <axis_point3> – ось вращения (величина Point3).
  3. <angleaxis> as quat – перевести величину <angleaxis> (ось и угол) в кватернион. Выражение типа <angleaxis> представляет собой набор из двух значений: угла поворота в градусах и вектора оси вращения (величина Point3). Величины <angleaxis> похожи на кватернионы за исключением того, что нормированный кватернион ограничен определением поворотов только от –PI до +PI. А величины <angleaxis> этого ограничения лишены, поэтому с их помощью можно определять многократные вращения (углы больше 360) в отличие от кватернионов. Вращения также происходят по правилу правой руки.
  4. <eulerangle> as quat – перевести величину <eulerangle> (угол Эйлера) в кватернион. Выражение типа <eulerangle> представляет собой набор углов поворотов вокруг осей координат: x, y, z.
  5. <matrix3> as quat – перевести в кватернион ту часть матрицы 4х3, которая отвечает за поворот.
Кватернионы тоже можно переводить в углы Эйлера, выражения типа ось и угол или матрицы: <quat> as eulerAngles, <quat> as angleaxis, <quat> as matrix3.

Свойства (у всех тип Float): <quat>.w; <quat>.x; <quat>.y; <quat>.z
Извлекаемые свойства: <quat>.angle – тип Float, <quat>.axis – тип Point3.
Некоторые из методов:
normalize <quat> – возвращает нормированный кватернион
inverse <quat> – возвращает обратный кватернион (1/q)

Для хранения положений и поворотов можно использовать вспомогательные объекты-пустышки Dummy. Объекты-пустышки не визуализируются и имеют только одно персональное свойство: <dummy>.boxsize - размер пустышки (Point3). По умолчанию [10,10,10]
Пример:
d=dummy pos: [10, 20, 30] rotation: (quat 10 [10, 10, 10]) --КВАТЕРНИОН
b=box(); b.rotation=d.rotation; b.position=10*d.position