【发布时间】:2016-04-30 07:42:09
【问题描述】:
我有一个人类双足动画文件格式,我想使用 C++ API 以编程方式将其读入 Maya。
动画文件格式与Open Asset Importer's per-node animation structure类似。
对于每个关节,有一系列多达 60 个 3D 矢量键(用于描述关节的平移)和 60 个四元数键(用于描述关节的旋转)。保证每个关节都有相同数量的键(或根本没有键)。
可以指定或更改动画的长度(时间以秒为单位)(例如,对于 30 FPS 动画,您可以将 60 个键设置为在 2 秒内发生)。
关节的平移和旋转每帧都会沿着骨架树传播,从而产生动画。
这是一个示例。有关数据结构的附加说明由日志记录工具添加。为简洁起见,我已经截断了密钥。
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 个键的条目)。 还有一些骨骼只有旋转,或者只有位置键。 骨架数据存储在一个单独的文件中,我已经可以使用 MFnIkJoint 将其读入 Maya。
动画文件中指定的骨骼与骨骼数据中的骨骼为 1:1。
现在我想将此动画数据导入 Maya。但是,我不明白Maya's way of accepting animation data through its C++ API。
特别是,MFnAnimCurve 函数集 addKeyFrame 或 addKey 只接受与时间键相关的单个浮点值,而我有一个向量和四元数列表。 MFnAnimCurve 也接受“切线”;阅读文档后,我仍然不确定如何将我拥有的数据转换为这些切线。
我的问题是:如何将我拥有的数据转换为 Maya 可以理解的数据?
我通过示例更好地理解,所以一些示例代码会有所帮助。
【问题讨论】: