Использование ключей при анимации

Ключ (сокращение от анимационный ключ) это временной маркер, который показывает изменение положения и/или ориентации кости. Анимация, использующая ключи, называется анимацией на основе ключевых кадров. Существуют весомые причины использования ключей, при этом одной из главных является экономия памяти.

Вы видите, что анимация является последовательностью движений (в данном случае движений костей) за установленный промежуток времени. Во время анимации изменяется иерархия костей для передачи движения анимации. Сохранение расположения и ориентации костей для каждой миллисекунды анимации является невозмож ным; слишком много данных для эффективного хранения. Вместо этого вы можете сохранять движение через более протяженные периоды времени (каждую секунду или две) или, еще лучше, во время значительных изменений положения или ориентации костей. Например, представьте вашу руку... хотя лучше представьте руку, изображенную на рис. 5.1.

Рис. 5.1. Анимация костей во времени; ключевые отметки описывают каждое движение

Кости, которые на рис. 5.1 образуют руку, в начале анимации расположены на одной линии. Со временем кости изгибаются в воображаемом локте, затем фиксируются, а потом изгибаются на другой угол. Таким образом, в ориентации костей можно выделить три основных изменения: прямое положение (начальное положение), небольшой изгиб и большой изгиб в сочленении. Эти три изменения являются ключами в анимации.

Теперь, вместо того чтобы хранить ориентацию костей каждую миллисекунду, сохраним эти три ключа и точное время (в миллисекундах) достижения костями соответствующих ориентации. Для этого примера положим время начала анимации руки равное 0 миллисекунд, первый ключ (полу-изогнутая рука) в 500 миллисекунд, и последний ключ (полностью изогнутая рука) в 1200 миллисекунд.

Вот где удобно использовать ключевые кадры. Предположим, вы хотите вычислить ориентацию костей в заданное время... скажем в 648 миллисекунд. Это время как раз попадает между вторым и третьим ключами (148 миллисекунд после второго ключа). Далее положим, что для ориентирования каждой кости в анимации используется две матрицы.

Б3ВХМАТК1Х таг_Кеу1, таг_Кеу2 ;

Использование ключей при анимации

Взяв каждый ключ и проинтерполировав их значения, вы получите преобразование, используемое для времени, находящегося между ключами. Например, прошло 648 миллисекунд анимации, вы можете проинтерполировать это преобразование так:

// Получить разность матриц

D3DXMATRIX matTransformation = matKey2 - MatKey1;

// Получить время ключей float Key1Time = 500.0f; float Key2Time = 1200.0f;

// Получить разность времен ключей

float TimeDiff = Key2Time - Key1Time;

// Получить скаляр, используя время анимации и разность времен float Scalar = (648.0f - Key1Time) / TimeDiff;

// Вычислить интерполированную матрицу преобразования matTransformation *= Scalar; matTransformation += matKey1;

Вот и все! Теперь в матрице matTransformation содержится интерполированное преобразование, которое вы применяете к костям для синхронизации анимации! Для увеличения точности интерполяции вы можете использовать значения перемещения, вращения и масштабирования вместо матриц преобразования. Я расскажу как это делать немного позже, а пока давайте вернемся к шаблону Animation, с которым вам предстоит иметь дело.

Для каждой кости в иерархии должен быть соответствующий ей объект Animation. Сразу же после объявления объекта Animation вы увидите ссылочное имя объекта данных. Данные анимации кости, имеющей это имя, хранятся в предшествующем объекте AnimationKey. Это означает, что в предыдущем примере кости Bip01 и BipOlLeftArm анимированы.

После ссылки на объект данных следует один или более объектов AnimationKey. Объект AnimationKey определяет используемые костью ключи анимации, которые могут включать ключи перемещения, вращения, масштабирования или преобразования. Давайте рассмотрим каждый тип ключа и способы хранения их информации в объекте более подробно.

Использование наборов скелетных анимаций, основанных на ключевых кадрах || Оглавление || Работа с четырьмя типами ключей