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

         

и нудный вывод для v1,


Далее, сравнивая g(t) с полученной в п.7.6. интерполяционной функцией f(t) можно заметить, что, если p1 = v1 v1 = p1, r1 = (c1 - v1) * 3 c1 = (p1 + r1) / 3, r2 = (v2 - c2) * 3 c2 = (p2 - r2) / 3, p2 = v2 v2 = p2, то g(t) совпадает с f(t). Длинный и нудный вывод для v1, v2, c1, c2 через функции lerp()/slerp() делать, пожалуй, смысле нет, так что ограничимся конечными результатами. А именно, для каждой точки-ключа cur имеем g1 = slerp(cur, prev, -(1+bias)/3.0);
g2 = slerp(cur, next, (1-bias)/3.0);
g3 = slerp(g1, g2, 0.5 + 0.5*continuity);
g4 = slerp(g1, g2, 0.5 - 0.5*continuity);
cur.ra = slerp(cur, g3, (tension-1));
cur.rb = slerp(cur, g3, -(tension-1));
Для начальной и конечной точки, соответственно, имеем следующее: q0.rb = slerp(p0, p1, (1-tension)*(1+continuity*bias)/3.0);
qn.ra = slerp(pn, p(n-1), (1-tension)*(1-continuity*bias)/3.0);
При интерполяции между какими-то точками a и b просто полагаем v1 = a,
c1 = a.rb,
c2 = b.ra,
v2 = b,
и считаем g(t) по приведенному выше алгоритму. Здесь мы до сих пор не учли параметры ease to и ease from, но это дело одной строки кода - посчитать на самом деле надо не g(t), а g(ease(t)). Впрочем, обычно ease(t) = t. Что это за функция ease(), откуда она берется, для чего нужна и как рассчитывается, написано в п.7.6. Таким образом, получаем кватернион, соответствующий повороту, задающий ориентацию объекта.


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