Как вы видели в главах 4 и 5, скелетная анимация просто является последовательностью матриц преобразования, применяемых к костям скелетной структуры меша. Эти преобразования включают перемещение, масштабирование и вращение. Большей частью преобразования являются вращениями. Кости поворачиваются в сочленениях; обычно только корневая кость может перемещаться по миру, и даже тогда лучше преобразовывать мир (чем напрямую перемещать кости). Принимая во внимание все вышесказанное еще раз заметим, что анимация создается с помощью преобразований.

Рис. 6.1. Хотя две анимации, показанные слева, и определены раздельно, вы можете соединить их в одну уникальную анимацию, как показано справа
Как вы можете видеть на рис. 6.2, можно создавать новые позы, добавляя разнообразные преобразования скелетной структуры к уже существующим. Например, чтобы двигать руку скелета, добавьте вращательное преобразование к матрице преобразования кости руки. Постепенное увеличение угла вращения, добавленного к преобразованию кости, создает плавную анимацию.
Вы можете видеть, что анимация создана комбинированием (через перемножение матриц) или непосредственным сохранением набора преобразований анимации и матриц преобразования скелета. Для плавного анимирования меша вы можете использовать линейную интерполяцию, соизмеряя матрицы преобразования набора анимаций со временем.
Так что на самом примитивном уровне вы имеете дело с преобразованием матриц для создания анимации; существует одна матрица преобразования, накладываемая на каждую кость в меше. Набор предварительно вычисленных анимаций является источником матриц преобразования, накладываемых на преобразования кости.

Рис. 6.2. Начальная поза скелета имеет присоединенный набор матриц преобразования; при их комбинировании с матрицами преобразования набора анимаций будут созданы новые позы
Подумайте, вместо того чтобы брать одну матрицу преобразования из набора анимаций (матрицу ключевого кадра или комбинацию из набора ключевых кадров положения, перемещения и вращения), почему бы просто не взять последовательность матриц преобразования, которые действуют на одну и ту же кость, из различных наборов анимаций и не скомбинировать их? В конце концов, ведь мы же используем объединение матриц для комбинирования множественных преобразований, так почему бы просто не добавить еще несколько преобразований из различных анимаций?
Стоп! Вот я и попался, вы не можете просто перемножить матрицы и получить правильный результат. Подумайте: умножение матриц не коммутативное, т. е. имеет значение порядок, в котором вы перемножаете различные преобразования. Если бы вы перемножали два преобразования, оба из которых сначала поворачивают, а потом перемещают, вы бы получили результирующее преобразование, которое бы поворачивало и перемещало, поворачивало и перемещало. Очевидно, что здесь слишком много преобразований для данных кости, которая обычно поворачивается, а затем перемещается.
Для решения этой проблемы вам необходимо складывать преобразования вместо того чтобы перемножать их. Так, для примера, два предыдущих преобразования, которые поворачивают, а потом перемещают, в результате дадут преобразование, которое повернет, а потом сдвинет (вместо того чтобы поворачивать и перемещать, поворачивать и перемещать). Сложение преобразований является идеальным решением!
Сложение двух матриц (представленных объектами D3DXMATRIX) очень просто, что показано на следующем примере:
D3DXMATRIX matResult = Matrixl + Matrix2;
Выполнив эти действия, вы можете использовать матрицу matResult для преобразований; она является комбинированным преобразованием матриц Matrix1 и Matrix2. Чтобы соединить большее количество преобразований анимации, просто добавьте ещё одну матрицу к matResult и продолжайте делать это пока не соедините все используемые преобразования.
Теперь вы знаете, как можно соединять разнообразные преобразования наборов анимаций. Для упрощений вы можете расширить объекты анимаций, разработанные в главе 5.
⇐Комбинирование скелетных анимаций || Оглавление || Улучшение объектов скелетной анимации⇒