我正在尝试将 FBX 文件的解析器编写为可在我的游戏引擎中使用的自定义模型格式,但我目前仍在提取每个骨骼所需的矩阵。我想我也可能迷失在剥皮理论中......
我设法提取了网格的骨骼层次结构,并将变形簇的权重和索引附加到我的顶点。现在我需要提取(两个?)我需要在我的引擎中进行蒙皮的矩阵。
基本上,在我的格式中,我也希望它看起来像这样:
//骨骼ID
//父骨骼ID
//矩阵1
//矩阵2
现在,对于矩阵......我是否正确假设其中至少一个应该是“绑定姿势矩阵”,即我的骨架的默认位置?如何从 FBX 中提取它?这个矩阵对于整个网格是均匀的吗?
至于第二个,我真的不知道,我试过查看 ViewScene 和 ImportScene 示例,但我不明白。我读了一些关于“局部空间矩阵”的东西,我猜这是每个骨骼的单独位置、旋转和比例?
感谢您提供任何帮助或建议,我现在不知所措,可能是因为我对此视而不见。几乎到了放弃 FBX 转而支持 COLLADA 的地步。
Edit1:引擎还没有绘图功能,因为我想在继续之前完成这项工作。我找到了一个我认为我理解的例子,也许这里有人可以确认它是否正确。
//TEST CODE
//This lFbxLinkMatrix is the skeleton's transform when the binding happened.
//It is the same as the matrix in bindpose if the bindpose is complete.
// Multiply lClusterGlobalInitPosition by Geometric Transformation
FbxAMatrix clusterGlobalInitPosition;
cluster->GetTransformLinkMatrix(clusterGlobalInitPosition);
FbxAMatrix clusterGeometry = GetGeometry(cluster->GetLink());
clusterGlobalInitPosition *= clusterGeometry;
skeleton->at(boneListPosition).bindMatrix = clusterGlobalInitPosition;
// Compute the shift of the link relative to the reference.
//lVertexTransformMatrix = RGCP.Inverse() * CGCP * CGIP.Inverse() * RGIP * RG;
// CGCP = position of bone
// RGCP = mesh position
FbxAMatrix offsetMatrix;
FbxNode* boneNode = cluster->GetLink();
FbxAMatrix CGIP, RGIP, vertexTransformMatrix;
cluster->GetTransformLinkMatrix(CGIP);
cluster->GetTransformMatrix(RGIP);
vertexTransformMatrix = CGIP.Inverse() * RGIP;
skeleton->at(boneListPosition).localBoneMatrix = vertexTransformMatrix;
所以基本上,当我想计算我的动画时,我得到网格世界矩阵的逆矩阵,将它与代表我的动画帧的矩阵相乘,乘以我的绑定矩阵的逆矩阵,该骨骼的父绑定矩阵和最终的父变换矩阵?