简述: 项目需要一些对fbx的自动修改功能,之前的经验都是用python 调用 FBXSdk 进行批量处理,最近突发奇想,unity既然有了 FBXExport 功能,那证明他也调用了 FBXSDK。果然 FBXSDK 依赖了一个 叫 Autodesk FBX SDK for Unity 的包。那就总结一下吧。本文先写一个概况,具体Unity内的示例与用法在后续用到的时候在写,当然本文也带了一些官方示例的链接可以参考
官方文档内的示例
版本 Unity 2022.1.7
把 FBX SDK 接进Unity
有两种方式,
- 直接安装 FBX Export 包,会自动添加
- 自己手动添加 参考文档
单独添加 FBXSDK 到 unity
FBX 的使用
主要参考了一些博主和官方文档
1. 博主文章
https://blog.csdn.net/oilcode/article/details/52586109
https://blog.csdn.net/oilcode/article/details/52489835
2. 官方文档 建议从这一页开始看 官网教程
基础使用要点
操作方式
我们一般对文件的操作都是打开,操作,保存。
FBX SDK 不一样,他是导入、操作、导出。他的导入需要用 FbxImporter 对象,他的导出需要用到 FbxExport 对象
FBX SDK 的文件处理方式更像是创建几个对象,然后通过对象对FBX文件内容进行处理,更像是设计模式中的命令模式。与我们在Unity中常用的 加载一个文件作为一个对象,然后对对象进行处理,然后保存的思维方式不大一样。
所以一般使用时 都是起手一个 SdkManager 对象,然后紧跟一个 Scene对象
FbxSdkManager 全局内存管理
FBX SDK 需要一个 FbxSdkManager 对象,这个对象是用来管理内存的,基本上在创建其它SDK 内的对象时(一般都是 .Create() 方法),都需要将这个 manager 传递进去。也就是说这个对象是必须的,一般情况下全局有一个就够了。
IOSetting 导入导出设置对象
类似于一个配置对象,就像我们在max里向外导出时弹出的设置面板,这里面可以指定哪些要导出,导入,哪些要烘焙处理,等等
这个类创建时需要传入 mananger,创建完后要通过 mananger的 SetIOSetting 再设置给 mananger。
FbxScene fbx数据容器
场景对象,我们的 Fbx 操作内容都在这个对象内。
scene 对象的创建需要传递 manager 进去
scene 对象可以存在多个
导入、导出都是基于scene 的,也就是我们创建了多个scene,导出时指定的是哪个scene就导出哪个scene的内容,其它scene不受影响
Node 和 AttributeType
一个 Node 是什么类型是需要实例化的 AttributeType 来指定的。
Node 包含基础的 Tranlation Rotation Scale ,这些属性在FbxSDK中是 Vector4 的形式存储的
例如 创建一个Node A,但目前并不能说他是个 mesh 还是个 camera,他只是一个节点,通过 A.SetNodeAttribute 就可以设置一个具体的 AttributeType 示例对象与其绑定。
这有点和我们在 max 中创建cube 不一样,我们在 max 中创建 Cube时其实是创建一个 node 然后有创建了一个 mesh ,然后将 mesh set给 node的 attribute
Node 有点类似于 unity的 emptyObject ,只有一个 transform 信息。其它信息需要单往上挂
官方创建Cube的例子
FBX 的数据结构
内部结构是节点形式的,scene对象 自带一个 Root 节点。节点可以包含属性对象来描述节点的类型等。下图文档链接

一个简单的创建cube的官方代码示例
//Create an SDK manager for your application
KFbxSdkManager* gSdkManager = KFbxSdkManager::Create();
// Create a scene object
gScene = KFbxScene::Create(gSdkManager, "");
// Create a mesh object
KFbxMesh* lMesh = KFbxMesh::Create(pSdkManager, "");
// Get the scene’s root node
KFbxNode* lRootNode = gScene->GetRootNode();
// Create a node for the mesh.
KFbxNode* lNode = KFbxNode::Create(pSdkManager, "");
// Set the node as a child of the scene’s root node.
lRootNode->AddChild(lNode);
// Set the mesh as the node attribute of the node
lNode->SetNodeAttribute(lMesh);
// set the shading mode to view texture
lNode->SetShadingMode(KFbxNode::eTEXTURE_SHADING);
// Rescale the cube
lNode->LclScaling.Set(KFbxVector4(0.3, 0.3, 0.3));
可以看到,起手一个 mananger,紧接着一个 scene,然后在其中调用Create 方法的地方都传入了 mananger对象。
整体总结
- 起手 Manager,Scene
- 创建对象调用Create 需要传入 Manager对象,
- manager对象一般全局有一个就可以,它负责内存的管理
- Manager 对象需要设置 IOSetting对象 用来配置导入导出的选项
- Scene 对象可以有多个,导入导出对象以 scene 整体进行操作
- 打开和保存文件需要通过 Import 对象和 Export 对象进行操作
- FBX数据结构为树形,scene 自带一个Root节点为整个场景内的根节点,除了Root,Scene内的所有节点必须要有一个父节点,一个节点可以有多个子节点
- Node 不具备具体类型,具体类型需要通过调用 Node 的 SetNodeAttribute(Attribute) 设置实例化的类型对象到 Node的Attribute
网友评论