У меня есть формат файла бипал-анимации человека, который я бы хотел программно прочитать в Maya с использованием C++ API.Импорт анимационных анимационных клипов в Maya
Формат файла анимации аналогичен формату Open Asset Importer's per-node animation structure.
Для каждого сустава существует серия до 60 трехмерных векторных клавиш (для описания перевода сустава) и 60 кватернионных клавиш (для описания вращения сустава). Гарантируется, что каждое соединение имеет одинаковое количество ключей (или вообще никаких ключей).
Длина (время в секундах) анимации может быть указана или изменена (чтобы вы могли установить 60 ключей, которые будут выполняться в течение 2 секунд для анимации 30 FPS, например).
Переводы и вращения суставов распространяются по дереву скелета в каждом кадре, создавая анимацию.
Вот образец. Дополнительные замечания о структуре данных добавляются средством ведения журнала. Я сократил ключи для краткости.
Bone Bip01
Parent null
60 Position Keys
0 0.000000 4.903561 99.240829 -0.000000
1 0.033333 4.541568 99.346550 -2.809127
2 0.066667 4.182590 99.490318 -5.616183
... (truncated)
57 1.366667 5.049816 99.042770 -116.122604
58 1.400000 4.902135 99.241692 -118.754120
59 1.400000 4.902135 99.241692 -118.754120
60 Rotation Keys
0 0.000000 -0.045869 0.777062 0.063631 0.624470
1 0.033333 -0.043855 0.775018 0.061495 0.627400
2 0.066667 -0.038545 0.769311 0.055818 0.635212
... (truncated)
57 1.366667 -0.048372 0.777612 0.065493 0.623402
58 1.400000 -0.045869 0.777062 0.063631 0.624470
59 1.400000 -0.045869 0.777062 0.063631 0.624470
Bone Bip01_Spine
Parent Bip01
60 Position Keys
...
60 Rotation Keys
...
В C++, структуры данных я в настоящее время соответствует этому:
std::unordered_map<string, std::vector<Vector3>> TranslationKeyTrack
используется для отображения набора векторов перевода к соответствующей кости.
std::unordered_map<string, std::vector<Quaternion>> RotationKeyTrack
Используется для сопоставления набора кватернионов вращения с соответствующей костью.
Дополнительные примечания: Есть некоторые кости, которые не двигаются относительно его родительской кости; у этих костей нет ключей вообще (но есть запись с 0 ключами). Есть также некоторые кости, которые имеют только поворот или только клавиши положения. Данные скелета хранятся в отдельном файле, который я уже могу прочитать в Maya с использованием MFnIkJoint.
Кости, указанные в файле анимации, равны 1: 1 костям в данных скелета.
Теперь я хотел бы импортировать эти данные анимации в Maya. Однако я не понимаю Maya's way of accepting animation data through its C++ API.
В частности, функция MFnAnimCurve, установленная addKeyFrame
или addKey
, принимает только одно значение с плавающей запятой, привязанное к ключевому слову, тогда как у меня есть список векторов и кватернионов. MFnAnimCurve также принимает «касательные»; после прочтения документации, я все еще не уверен, как преобразовать данные, которые у меня есть, в эти касательные.
Мой вопрос: Как мне преобразовать данные, которые у меня есть во что-то, что понимает Майя?
Я лучше понимаю примеры, поэтому некоторые примеры кода будут полезны.