安装
1. 下载 FBX Python SDK
官网地址,根据你的操作系统,下载相应的 FBX SDK 2020.3.4 Python exe 文件。
2. 安装
执行下载的文件 fbx202034_fbxpythonsdk_win.exe,安装完的程序路径我的是 D:\Program Files\Autodesk\FBX\FBX Python SDK\2020.3.4。里面有个 Python 的 whl 包,还有个 samples 文件夹,这个也有用。
安装 whl:pip install fbx-2020.3.4-cp310-none-win_amd64.whl
使用
1. 加载模型
把上面提到的 samples 文件夹中的 FbxCommon.py 文件复制到你的 Python 程序目录。
import FbxCommonfilename = "" # 文件路径
manager, scene = FbxCommon.InitializeSdkObjects() # 初始化
FbxCommon.LoadScene(manager, scene, filename) # 加载场景
2. FbxScene 和 FbxNode
场景是节点组成的树状结构。FbxScene
有个根节点,节点通过 GetChild
方法获取子节点。
root_node = scene.GetRootNode()
for i in range(root_node.GetChildCount()):node = root_node.GetChild(i)
由此,可以获取每个节点
def make_tree(scene):def get_child(parent_node):child_count = parent_node.GetChildCount()tree = {}for i in range(child_count):child_node = parent_node.GetChild(i)tree[child_node.GetName()] = get_child(child_node)return treeroot_node = scene.GetRootNode()tree = get_child(root_node)
3. 遍历和处理 FBX 节点
在上一节中,我们定义了 make_tree
函数来递归地获取 FBX 场景中的所有节点,并将它们组织成一个树状结构。这个树状结构可以方便地让我们遍历、查询和修改节点。
接下来,我们将进一步探讨如何处理这些节点。
3.1 遍历节点树
有了 make_tree
函数生成的节点树,我们可以使用递归函数来遍历它:
def traverse_tree(tree, indent=""):for name, child_tree in tree.items():print(f"{indent}{name}")traverse_tree(child_tree, indent + " ")# 使用前面定义的 make_tree 函数获取节点树
tree = make_tree(scene)
# 遍历并打印节点名称
traverse_tree(tree)
3.2 处理节点属性
FBX 节点包含了许多属性,如变换(位置、旋转、缩放)、几何形状、材质等。我们可以根据需求来读取或修改这些属性。
例如,获取节点的变换信息:
def get_transform(node):transform = node.EvaluateLocalTransform() # 获取节点的本地变换translation = transform.GetT() # 获取位移rotation = transform.GetQ() # 获取旋转(四元数)scale = transform.GetS() # 获取缩放return translation, rotation, scale# 获取某个节点的变换信息
node = root_node.GetChild(0) # 假设我们获取第一个子节点
translation, rotation, scale = get_transform(node)
print(f"Translation: {translation}")
print(f"Rotation: {rotation}")
print(f"Scale: {scale}")
3.3 处理几何形状和材质
如果节点包含几何形状(如网格),我们可以通过节点的 GetGeometry
方法来获取它。同样,如果节点有材质,我们也可以通过相应的方法来获取。
处理几何形状和材质通常涉及到更复杂的操作,如读取顶点数据、索引数据、UV 坐标、材质属性等。这些操作需要根据具体需求和 FBX 文件的结构来进行。
4. 保存修改后的 FBX 文件
在对 FBX 文件进行读取、修改等操作后,我们可能想要保存修改后的内容。FBX SDK 提供了保存场景的功能。
import FbxIOSettings
import FbxExporter# 创建保存设置
ios = FbxIOSettings.Create(FbxIOSettings.IOSROOT, FbxIOSettings.IOS_EXPORT)
ios.SetBoolProp(FbxIOSettings.EXP_FBX_MATERIAL, True) # 保存材质等信息
ios.SetBoolProp(FbxIOSettings.EXP_FBX_TEXTURE, True) # 保存纹理等信息# 创建导出器并设置文件名
exporter = FbxExporter.Create(manager, "output.fbx", ios)# 导出场景
if not exporter.Initialize(scene, -1, manager.GetIOSettings()):print("Failed to initialize exporter.")return
if not exporter.Export(scene):print("Failed to export scene.")return
exporter.Destroy() # 清理导出器资源
5. 结语
通过本文的介绍,相信你已经对如何使用 FBX SDK 在 Python 中加载、处理和保存 FBX 文件有了初步的了解。FBX SDK 提供了丰富的功能和强大的灵活性,可以满足各种3D模型处理需求。当然,要深入掌握它还需要更多的实践和学习。希望本文能为你的学习之旅提供一个良好的起点。