Оптимизация преобразований для скелетной анимации
5
struct Quaternion{
float x,y,z; // Вектор
float w; // Скаляр
};
Преобразование сферических координат в кватернион, например,
выполняется следующей функцией [1] (рис. 2).
Рис. 2.
Преобразование сферических координат в кватернион
Для того чтобы воспользоваться аппаратно оптимизированными
функциями расширения SSE, преобразования зададим в матричном
виде. Для получения итогового положения костей в результате дви-
жения, которое разбивается на сдвиг, поворот и масштабирование,
преобразования задаются при помощи матрицы аффинных преобра-
зований для каждой из костей, участвующей в движении, начиная с
родительской.
Смещение задается матрицей трехмерного переноса:
1 0 0 0
0 1 0 0
( , , )
0 0 1 0
1
M dx dy dz
dx dy dz
⎛
⎞
⎜
⎟
⎜
⎟
=
⎜
⎟
⎜
⎟
⎝
⎠
,
где
dx
,
dy
,
dz
— перемещения вдоль осей
x
,
y
,
z
.
Масштабирование задается следующей матрицей:
0 0 0
0
0 0
( , , )
0 0
0
0 0 0 1
cx
cy
M cx cy cz
cz
⎛
⎞
⎜
⎟
⎜
⎟
=
⎜
⎟
⎜
⎟
⎝
⎠
,
где
cx
,
cy
,
cz
— масштабные коэффициенты по осям
x
,
y
,
z
.