Поворот относительно оси (x,y,z) (иными словами, поворот вокруг вектора (x,y,z), проведенного из начала координат) на угол angle представляется кватернионом q, лежащим на единичной 4D-сфере (то есть, 4D-вектором длины 1):
s = cos(angle/2),
v = (x,y,z) * sin(angle/2) / |(x,y,z)|,
q = [s,v].
Что интересно, в такой форме поворот, соответствующий комбинации поворотов q1 и q2, просто равен их произведению. В случае с 3D Studio это позволяет быстро и просто перевести сохраненные в CHUNK_TRACKROTATE относительные повороты в абсолютные: просто читаем эти самые повороты (а записаны они как раз в форме [angle,(x,y,z)], причем длина вектора (x,y,z) уже приведена к единичной), переводим их в кватернионную форму, получаем набор кватернионов q0, q1, ..., q(n-1), qn. Здесь q0 и так задает абсолютный поворот, а вот все остальные придется переводить (умножение здесь, конечно, кватернионное):
absolute_q0 = q0,
absolute_q1 = q1*absolute_q0,
absolute_q2 = q2*absolute_q1,
...
absolute_qn = qn*absolute_q(n-1).
Получаем набор кватернионов, задающих абсолютные повороты, или абсолютную ориентацию объекта в какие-то моменты времени. Для того же, чтобы получить поворот-ориентацию в любой момент времени, придется как-то интерполировать повороты между этими заданными ключевыми значениями.
Все кватернионы, задающие повороты, должны лежать на единичной 4D-сфере, поэтому простейший метод (линейная интерполяция) несколько усложнится: мы вынуждены интерполировать не по прямой между двумя векторами, а по дуге на этой 4D-сфере, являющейся сечением сферы плоскостью, проходящей через центр сферы и наши два вектора, то есть две точки на сфере.