我正在尝试使用Assimp(开放资产导入库)来制作骨骼动画。现在我可以成功加载.dae模型并使用动画渲染它,但在这样做的过程中,模型会搞砸。
http://i.imgur.com/O7YzK8o.png
左侧模型未正确装配和装载。右边的模型是装配好的,从动画中获取正确的姿势,但是很奇怪地扭曲了(扁平的图形〜)。
我的看法是,我可能通过骨骼矩阵乘法做错了。
最终矩阵(我们称之为M)计算如下:
M[i] = transform_matrix[i] * scene->mRootNode->mTransformation * offset_matrix[i]
其中offset_matrix[i]
是来自aiBone->mOffsetMatrix
的串联的组合偏移矩阵,而transform_matrix[i]
是来自aiNodeAnim
TRS的矩阵串联的组合变换矩阵。
各个连接从底部到根部进行。
while(node!=NULL){
mOffset = loadRelativeOffset(node, scene) * mOffset
node = node->mParent;
}
offset_matrix.push_back(mOffset);
loadRelativeOffset(node, scene)
将遍历scene->mMeshes[0]->mNumBones
并返回匹配的aiBone
矩阵。如果未找到骨骼,则将返回单位矩阵。因此,最终结果将是所有骨骼矩阵的串联,忽略 Armature 和根节点。
加载转换矩阵的方式与此类似,但aiNodeAnim
中的mNumChannels
代替aiBones
中的mNumBones
。
我想最终结果看起来像这样:
M = Arm * Hand * Finger * RootNode * Offset_Arm * Offset_Hand * Offset_Finger;
我不知道为什么RootNode矩阵在那里,但如果不存在,一切看起来都像废话。
知道导致这种情况的原因,或者我能做些什么?
答案 0 :(得分:2)
我解决了。问题非常简单 - aiBone
中的骨骼偏移矩阵已经全局 / 组合,所以没有理由连接。