编译FBX SDK for Python3.9

前言

公司有个需求是要在UE5中处理fbx数据,要用到fbx sdk。
可是UE5的python版本是3.9,网上没有找到对应的,就自己编译了一个。
这里记录一下过程。
(文章尾巴有编译好的自取)

编译过程

准备

下载安装FBX SDK和Python Bindings

下载FBX C++ SDK

下载FBX SDK Python Bindings

这两样下载完成后直接安装即可,安装后记录安装路径位置。

新建一个文件夹D:\fbx_sdk\2020.2,将分别将它们复制到bindingssdk

下载sip

下载完成后解压,放到D:\fbx_sdk\sip

下载Visual Studio 2019

下载并安装

下载并配置flex和bison

解压后加入到环境变量PATH:
C:\Users\zhanglingyun\Downloads\Compressed\win_flex_bison-2.5.25
去掉flex.exebison.exe前面的”win_”前缀。
查看是否配置成功

1
flex -V

配置环境变量

1
2
3
set FBXSDK_ROOT=D:\fbx_sdk\2020.2\sdk
set FBXSDK_LIBS_64_FOLDER=D:\fbx_sdk\2020.2\sdk\lib\vs2019\x64\release
set SIP_ROOT=D:\fbx_sdk\sip

编译sip

1
2
# 进入到sip目录
python build.py prepare

编译fbx sdk for python3.9

使用它

1
2
# 进入到 D:\fbx_sdk\2020.2\bindings 目录
C:\Users\zhanglingyun\Miniconda3\envs\fbxsdk_ue5\python.exe PythonBindings.py Python3_x64 buildsip

这样就完成了。

一些fbx sdk代码段

遍历节点

1
2
3
4
5
6
7
8
9
10
11
import fbx  
import FbxCommon

output_file = r'D:\test\test1.fbx'
manager, scene = FbxCommon.InitializeSdkObjects()
result = FbxCommon.LoadScene(manager, scene, output_file)
nodes = scene.GetRootNode()

for i in range(scene.GetNodeCount()):
node = scene.GetNode(i)
mesh = node.GetNodeAttribute()

获取模型点,线,面信息

1
2
3
4
5
6
7
8
9
10
# 遍历节点
for i in range(scene.GetNodeCount()):
node = scene.GetNode(i)
mesh = node.GetNodeAttribute()
# 过滤mesh类型
if mesh and isinstance(mesh, fbx.FbxMesh):
print(node.GetName(),
len(set(mesh.GetPolygonVertices())), # 点数
mesh.GetMeshEdgeCount(), # 边数
mesh.GetPolygonCount()) # 面数

修改名称

1
2
3
4
5
# 获取名称
name = node.GetName()

# 修改名称
node.SetName(name+'_modify')

创建Locator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建空group
group_node = fbx.FbxNode.Create(manager, "Locator01")
# 创建Locator
locator = fbx.FbxNull.Create(scene, 'Locator01')
# 将locator放到transform节点下
group_node.AddNodeAttribute(locator)
# 获取root节点
root_node = scene.GetRootNode()
# 加入到root节点中
root_node.AddChild(group_node)

# 或者
group_node = fbx.FbxNode.Create(manager, "Locator01")
null_prop = fbx.FbxNull.Create(manager, "")
group_node.SetNodeAttribute(null_prop)
root_node = scene.GetRootNode()

创建Group,setParent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file_path = r'D:\test001.fbx'  
# file_path = r'D:\work\ple\test\ad\test3.fbx'
manager, scene = FbxCommon.InitializeSdkObjects()
result = FbxCommon.LoadScene(manager, scene, file_path)
if not result:
return
group_node = fbx.FbxNode.Create(manager, "Locator01")

root_node = scene.GetRootNode()
for i in range(scene.GetNodeCount()):
node = scene.GetNode(i)
mesh = node.GetNodeAttribute()
if not mesh:
continue
root_node.AddChild(group_node)
output_file = r'D:\test2.fbx'
FbxCommon.SaveScene(manager, scene, output_file, 0)

结尾分享

编译好的 fbx sdk for python3.9

(完)