Самоучитель по 3dsmax 7

         

Поворот относительно оси (x,y,z) (иными словами, поворот вокруг вектора (x,y,z), проведенного...


Поворот относительно оси (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-сфере, являющейся сечением сферы плоскостью, проходящей через центр сферы и наши два вектора, то есть две точки на сфере.



Содержание раздела