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

         

Они контролируют нелинейность движения по полученной кривой в зависимости от времени - или...


Они контролируют нелинейность движения по полученной кривой в зависимости от времени - или, если угодно, нелинейность самого времени. Не особо вникая в детали, корректно отработать все это можно с помощью следующего куска кода: // ... float ease(float t, float a, float b) { float k; float s = a + b; if (s == 0.0) return t; if (s > 1.0) { a = a / s; b = b / s; } k = 1.0 / (2.0 - a - b); if (t < a) return ((k / a) * t * t); else { if (t < 1.0 - b){ return (k * (2 * t - a)); } else { t = 1.0 - t; return (1.0 - (k / b) * t * t); } } } // ... time = ease(time, beginKey.easeFrom, endKey.easeTo); // ...

Подведем итог. Для того, чтобы вычислить значение какой-то величины (скажем, положения объекта) в какой-то момент времени, придется сделать следующее:

  • найти те два ключа, между которыми попадает этот момент времени (если ключ всего один, значение просто постоянно);
  • перевести глобальное время в локальное для отрезка между этими ключами;
  • скорректировать локальное время с помощью функции ease();
  • посчитать "выходящую" производную rb для начального ключа и "входящую" производную ra для конечного ключа;
  • по значениям величины в ключах, посчитанным производным и локальному времени посчитать интерполированное значение.


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