编译FBX SDK for Python3.9

zhangly 2023-02-10 23:44:36
Categories: Tags:

前言

公司有个需求是要在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_"前缀。
查看是否配置成功

flex -V

配置环境变量

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

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

编译fbx sdk for python3.9

使用它

1661327591215.png

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

这样就完成了。

一些fbx sdk代码段

遍历节点

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()

获取模型点,线,面信息

# 遍历节点
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())               # 面数

修改名称

# 获取名称
name = node.GetName()

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

创建Locator

# 创建空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

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

(完)