读取FBX文件踩坑清单

FBX文件得到了许多3D制图软件与3D游戏引擎的兼容,其发展趋势大好。因此若要编写一款3D图形系统,对FBX格式的支持是必经之路(或者使用插件形式)。笔者尝试在百度、必应等搜索引擎,外加fbxsdk实例的帮助下,读取了FBX文件,并且生成图像。特地编写一篇文章叙述解析FBX过程中,容易踩到的坑。以下展示显示效果:
模型原图:

读取FBX文件踩坑清单

显示效果:

读取FBX文件踩坑清单

 

踩坑清单:

1、FBX资源组织方式。FBX文件以多叉树结构组织,其解析始于FbxScene根结点,根节点下挂载网格、材质、纹理贴图、动画、骨骼、蒙皮、灯光等数据结点。这些概念的获得,笔者建议直接阅读FBXSDK项目下的官方程序示例。其中需要说明的是,网格与动画数据是独立的,它们通过骨骼蒙皮的形式,进行间接关联。

2、FBX贴图坐标倒转。笔者在解析静态网格时发现,直接使用UV坐标会导致模型的贴图出现上下颠倒的情况(me.u = fbx.u; me.v = fbx.v;),即在导入一只狗的模型时,头部贴图附着在模型的尾部。于是尝试性地改变UV坐标映射方式(me.u = fbx.u;me.v = 1.0-fbx.v;),结果出现,多数模型贴图映射为正常。笔者思考,fbx贴图的坐标原点是否异于窗口坐标系,位于图片左下角。

3、采用遍历动画层结点方式读取动画帧(关节动画)。FbxAnimStack结点下保存多个FbxAnimLayer结点(多个Layer是为了做动画混合),FbxAnimLayer结点保存了骨骼(关节)的多帧动画数据,这些关节动画需要遍历场景树的所有骨骼结点,才能获取。所谓的坑在于,FBXSDK中提供的动画导入示例,在读取关节变换矩阵(SQT数据结构)时,采用分别获取多帧动画的S(cale)、Q(uaternion)、T(ransfer)数组,在循环中获取的方式(即动画管道,例如坐标(x,y,z),使用管道方式是[x0,x1,...], [y0,y1,...], [z0,z1,...])。若这样做,在实际中发现,各个管道的长度不一。例如对于单个关节的SQT帧序列(数组),存在length(S)、length(Q)、length(T)的长度不等,这是非常棘手的问题。以上情况在参考其它文档后发现,可以直接在遍历AnimCurve结点时,设置帧率(比如24帧),采用EvaluateGlobalTransform接口,获取换算后的矩阵。再将其转换为SQT结构,这样保证同一关节的SQT各管道长度都相同(否则需要人为做管道插值)。

暂时发下这些问题,希望对你有帮助。

上一篇:BRIN: 区块索引


下一篇:资源工作流之自动导出FBX动画