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

         

Все это называется сферической линейной интерполяцией (spherical linear interpolation, если...


Все это называется сферической линейной интерполяцией (spherical linear interpolation, если скоращенно, slerp) и определяется следующим образом:

slerp(q1,q2,t) = (q1*sin((1-t)*a) + q2*sin(t*a)) / sin(a),

где t - локальное время (см.п.7.6), a - угол между векторами q1, q2;

0 cos(a) = (q1,q2)/(|q1|*|q2|) = (q1,q2).

То есть q1, q2 здесь уже рассматриваем как 4D-вектора. Приведенную формулу нетрудно вывести (для лучшего понимания): нам нужна такая точка q, которая лежит на единичной сфере, лежит в одной плоскости с q1 и q2 и центром (то есть нулем), причем угол между векторами q и q1 меняется линейно и, таким образом, равен t*a. Раз точка лежит в одной плоскости с 0, q1, q2, то вектор q равен линейной комбинации векторов q1, q2:

q = k1*q1 + k2*q2,

где k1, k2 - какие-то (пока неизвестные) коэффициенты. q лежит на сфере, значит, длина q равна 1, отсюда имеем:

|q| = (q,q) = 1,
(k1*q1+k2*q2, k1*q1+k2*q2) = 1,
k1*k1*(q1,q1) + k2*k2*(q2,q2) + 2*k1*k2*(q1,q2) = 1,
k1*k1 + k2*k2 + 2*k1*k2*(q1,q2) = 1.

Угол между q и q1 равен t*a, отсюда:

cos(q,q1) = cos(t*a),


(q,q1) = cos(t*a),
k1*(q1,q1) + k2*(q1,q2) = cos(t*a),
k1 + k2*(q1,q2) = cos(t*a).

Получили систему уравнений для k1, k2:

k1 + k2*(q1,q2) = cos(t*a),
k1*k1 + k2*k2 + 2*k1*k2*(q1,q2) = 1,

или

k1 + k2*cos(a) = cos(t*a),
k1*k1 + k2*k2 + 2*k1*k2*cos(a) = 1.

Отсюда k1 = (cos(t*a) - k2*cos(a)), и получаем квадратное уравнение:

cos(t*a)^2 - 2*k2*cos(a)*cos(t*a) + k2^2*cos(a)^2 + k2^2 +
2*k2*cos(a)*cos(t*a) - 2*k2^2*cos(a)^2 = 1,

cos(t*a)^2 + k2^2*(1 - cos(a)^2) = 1,

k2^2 * sin(a)^2 = sin(t*a)^2,

k2 = sin(t*a) / sin(a),

k1 = cos(t*a) - sin(t*a)*cos(a) / sin(a) =
   = (cos(t*a)*sin(a) - sin(t*a)*cos(a)) / sin(a) =
   = sin(a - t*a) / sin(a) = sin((1 - t)*a) / sin(a).

Если a - очень маленький угол, настолько, что могут возникнуть ошибки при делении на sin(a), можно использовать обычную линейную интерполяцию (так как при маленьких значениях a sin(a) ~= a, sin(t*a) ~= t*a, и так далее).

Итак, мы умеем задавать повороты кватернионами, мы умеем их интерполировать линейно по множеству их возможных значений, то есть, поверхности сферы.



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