FBX、DAE模型的格式、导入与骨骼动画

如题所述


探索3D模型的卓越伙伴:FBX与DAE格式的深度解析

自上世纪90年代的游戏革命以来,3D模型格式的演变见证了技术的飞跃。从简化模型的OBJ和3DS,到ID Tech系列的MD2、MD3等,骨骼动画的出现,尤其是MD5对顶点蒙皮的支持,推动了实时渲染领域的发展。Autodesk、Microsoft和Khronos等巨头联手,催生了通用标准,如Autodesk的FBX和Khronos的DAE,它们在处理3D模型的骨骼动画方面扮演了关键角色。


FBX和DAE,作为当前的主流格式,分别由Autodesk和Khronos维护,它们各有特色。FBX,作为封闭格式,专为游戏引擎设计,得益于Autodesk SDK的强大支持,而DAE(Collada)则是开放标准,虽功能广泛但相较于FBX,其完善度稍逊。除此之外,还有针对VR和特定引擎优化的定制化格式。


FBX的组织结构以Scene节点树为基石,允许多模型共存,编程时需分别处理。通过FbxImporter,我们可以解析和转换模型,获取关键的动画、网格和骨骼信息,如C++示例所示:


C++: FbxScene *pScene = FbxScene::Create(...); pSdkImporter->Import(pScene);

解析模型时,通过递归处理ProcessNode,我们重点聚焦Mesh,提取位置、纹理、骨骼影响数据,包括骨骼蒙皮。在每个Mesh上,我们计算骨骼点索引和权重,存储于t3DJoint结构,同时处理LinkingBoneNode,计算关节变换矩阵。


DAE的处理则稍显复杂,数据结构更自由,如需获取cluster中存储的顶点信息,需遍历多层循环。例如,获取FBX中的控制点,需要通过mtBindShape矩阵,这是模型制作者用于调整网格的矩阵,如C++代码所示:


C++: FbxVector4 lT, lR, lS; ... GetMatrixValue(FbxAMatrix(lT, lR, lS), &mtBindShape);

骨骼驱动和Attach关系的识别是关键,DAE模型虽加载灵活,但其动画支持相对较弱,文档更新也较为滞后。处理时,需针对不同的模型结构进行调整。


DAE文件结构包含VisualScenes、Nodes和Geometries,解析顺序为场景节点、网格和控制器、材质,再到动画。静态模型主要由VisualScenes和Geometries构成。而在处理过程中,动画部分的复杂性尤为突出,由于数据组织的灵活性,读取时需要针对不同模型进行定制。


在DAE的节点变换中,XML格式的表示方式体现了早期OpenGL的痕迹,这在计算节点变换时带来了额外的挑战。比如,一个关节节点的复杂变换,可能包含如下的XML表示:


XML: <node id="l_knee">...

面对这样的复杂性,我们不仅要理解模型矩阵,可能还需要自建系统。对于动画处理,关键帧的动画数据替换和矩阵计算是必不可少的,如C++代码所示:



    根据关键帧信息设置矩阵或旋转量,并应用到模型变换中。
    处理旋转时,根据旋转轴调整qRotation。

模型的包围盒,尤其是骨骼动画模型,是渲染器的重要组成部分。计算动态包围盒时,必须在应用层或GPU上进行,不能预先确定,这要求我们在导入阶段进行精心的计算和合并,如ZWModelBase::t3DObject::GetRetrictingBoundingBox所示。


在优化过程中,我们预先计算关节的最大包围盒,以减少动画对性能的影响。总结来说,FBX和DAE格式在处理3D模型和骨骼动画时,提供了强大的工具,但同时也需要开发者深入理解其复杂性并灵活运用。


本文摘自ZwqXin.com,原文链接:[原文链接],发表日期:2013-4-30


温馨提示:答案为网友推荐,仅供参考
相似回答