[Python] FBX SDK:使用Python进行3D模型导入导出的设置

FBX SDK 为FBX模型的导入导出提供了对应的FbxImporterFbxExporter

这里介绍下如何使用这两个类进行导入与导出以及对应的导入导出设置

1. 初始化

使用FBX SDK,首先得对FbxManager对象初始化,用于管理FBX模型的几乎所有对象

然后创建一个空白场景用于写入将要导入或导出的数据

lSdkManager = FbxManager.Create()
if not lSdkManager:
    sys.exit(0)

ios = FbxIOSettings.Create(lSdkManager, IOSROOT)
pSdkManager.SetIOSettings(ios)

pScene = FbxScene.Create(lSdkManager, "")

2. 导入模型

FBX SDK通过FbxImporter类来完成导入模型。

首先,创建导入器对象,接着调用其初始化方法完成导入的基本设置,该方法共有三个参数以及一个额外的可选参数:

  • 第一个参数指定要导入的FBX文件的路径和文件名。
  • 第二个参数指定要导入的FBX文件的格式,可以是二进制格式或ASCII格式。-1表示自动检测文件格式,0为二进制格式,1为ASCII格式。
  • 第三个参数为导入的FbxIOSettings对象,用于设置导入FBX文件的选项,例如是否导入材质、动画、几何体等。
  • 最后的可选参数指定一个文件流,表示用于读取FBX文件的数据流,可以是文件流或内存流。如果不指定文件流,则默认使用文件名和格式来创建一个文件流。

FbxIOSettings对象具体设置了对于导入FBX文件的选项,常见的导入设置如下所示,这里介绍下每个选项的含义:

  • IMP_FBX_MATERIAL:设置是否导入FBX文件中的材质信息。
  • IMP_FBX_TEXTURE:设置是否导入FBX文件中的纹理信息。
  • IMP_FBX_SHAPE:设置是否导入FBX文件中的形状信息,例如几何体和曲线。
  • IMP_FBX_GOBO:设置是否导入FBX文件中的灯光信息。
  • IMP_FBX_ANIMATION:设置是否导入FBX文件中的动画信息。
  • IMP_FBX_GLOBAL_SETTINGS:设置是否导入FBX文件中的全局设置信息,例如单位、坐标系和时间轴设置。

这些选项可以根据需要进行设置,以便在导入FBX文件时只导入所需的信息,从而提高导入效率和减少内存占用。

最后调用导入器对象的Import方法导入即可,记得导入完成后销毁导入器对象。

def LoadScene(pSdkManager, pScene, pFileName):
    lImporter = FbxImporter.Create(pSdkManager, "")
    result = lImporter.Initialize(pFileName, -1, pSdkManager.GetIOSettings())
    if not result:
        return False

    if lImporter.IsFBX():
        pSdkManager.GetIOSettings().SetBoolProp(IMP_FBX_MATERIAL, True)
        pSdkManager.GetIOSettings().SetBoolProp(IMP_FBX_TEXTURE, True)
        pSdkManager.GetIOSettings().SetBoolProp(IMP_FBX_SHAPE, True)
        pSdkManager.GetIOSettings().SetBoolProp(IMP_FBX_GOBO, True)
        pSdkManager.GetIOSettings().SetBoolProp(IMP_FBX_ANIMATION, True)
        pSdkManager.GetIOSettings().SetBoolProp(IMP_FBX_GLOBAL_SETTINGS, True)

    result = lImporter.Import(pScene)
    lImporter.Destroy()
    return result

3. 导出模型

类似地,FBX SDK通过FbxExporter类来完成导入模型。

导出的方法与导入的基本一致,只有IO设置中参数的前缀都要从IMP改为EXP

最后调用导出器对象的Export方法导出即可,记得导入完成后销毁导出器对象。

def export_scene(pSdkManager, pScene, pFileName):
    lExporter = FbxExporter.Create(fbxManager, "")

    if not pSdkManager.GetIOSettings():
        ios = FbxIOSettings.Create(pSdkManager, IOSROOT)
        pSdkManager.SetIOSettings(ios)

    pSdkManager.GetIOSettings().SetBoolProp(EXP_FBX_MATERIAL, True)
    pSdkManager.GetIOSettings().SetBoolProp(EXP_FBX_TEXTURE, True)
    pSdkManager.GetIOSettings().SetBoolProp(EXP_FBX_EMBEDDED, False)
    pSdkManager.GetIOSettings().SetBoolProp(EXP_FBX_SHAPE, True)
    pSdkManager.GetIOSettings().SetBoolProp(EXP_FBX_GOBO, True)
    pSdkManager.GetIOSettings().SetBoolProp(EXP_FBX_ANIMATION, True)
    pSdkManager.GetIOSettings().SetBoolProp(EXP_FBX_GLOBAL_SETTINGS, True)

    result = lExporter.Initialize(output_path, 1, pSdkManager.GetIOSettings())

    if result:
        result = lExporter.Export(pScene)
    lExporter.Destroy()