fbx导出轴变换及骨骼动画加载Tricks

"踩坑记录"

Posted by A-SHIN on December 7, 2017

“Yeah It’s on. ”

前言

之前在使用fbx sdk导入模型渲染的时候,发现在模型的朝向跟3DMAX里的不一致。即使添加如下代码还是不起作用:

// Convert Axis System to what is used in this example, if needed
FbxAxisSystem SceneAxisSystem = m_pScene->GetGlobalSettings().GetAxisSystem();
FbxAxisSystem OurAxisSystem(FbxAxisSystem::eYAxis, FbxAxisSystem::eParityOdd, FbxAxisSystem::eRightHanded);
if (SceneAxisSystem != OurAxisSystem)
{
	OurAxisSystem.ConvertScene(m_pScene);
}

当时重心在架构引擎,所以简单的在游戏里使用欧拉旋转强行把模型调成想要的朝向。。。

正文

最近随着渲染模型的增多,因此采用了配置文件的方法加载场景里的模型。后续还会写个编辑器方便配置(暂时考虑使用QT)。
之前挖的坑就暴露出来了。朝向的问题使得配置场景文件变得很麻烦。没办法重新review了fbx模型加载模块,终于找到了问题。
当从fbx文件读取顶点对应的controlpoint坐标保存后,需要乘这个mesh的globaltransform矩阵:

matrixMeshGlobalPositionIn3DMax = pFbxMesh->GetNode()->EvaluateGlobalTransform();
FbxVector4 curPoint = pCtrlPoint[nCtrlPointIndex];
curPoint = matrixMeshGlobalPositionIn3DMax.MultT(curPoint);

EvaluateGlobalTransform方法返回的矩阵包含了导出时坐标系轴变换以及模型在3DMAX中的位移、旋转、缩放等

后记

另外关于骨骼动画的加载可参考sdk中的demo。不同的是我们需要在加载fbx时预计算关键帧的顶点调色矩阵并保存,然后渲染时插值使用便可,如此FbxScene便可清除并去加载后续fbx。而不像demo中那样每帧渲染的时候需要使用FbxScene下的接口去计算顶点调色矩阵。