AutoDesk推出的FBX的python API,目前只有某个特定的版本,官方是Python37. 如果我们要python38或者python39就得自己编译。
但是这块网上教程比较少,这里记录一下如何在Ubuntu下,来编译带有Python39的FBX python API。顺便图草一下autodesk的FBX,都特马2022年了,装个python SDK这么麻烦。不过也理所应当,毕竟人家制定的标准,现在估计整个团队都只需要坐着收钱就行,谁还想着怎么方便给你用。
下载文件
先把需要的文件下载一下,主要是FBX SDK:
以及Python Binding:
请注意,由于我们不要官方的python sdk了,那么官方的那个就不用下载了,只需要下载SDK和Binding即可,我们将利用这两个编译我们自己的Python SDK.
最新版本从这里看:
https://www.autodesk.com/developer-network/platform-technologies/fbx-sdk-archives
编译
首先,先把FBX的SDK, 下载解压,然后运行一下安装程序,先不管安装到了,就解压到当前目录也行。我们需要的就是 lib
和 include
。就可以了
export FBX_ROOT=`pwd`
然后执行一下 Python Binding的执行程序,这一步会生成sip以及对应的 PythonBindings.py 文件。此时你的文件树应该是这样的:
.
├── common
│ └── FbxCommon.py
├── compile
│ ├── Makefile.template
│ └── profile.xml
├── configure.py
├── fbx202001_fbxpythonbindings_linux
├── fbx202001_fbxpythonbindings_linux.tar.gz
├── fbx202001_fbxsdk_linux
├── fbx202001_fbxsdk_linux.tar.gz
├── FBX_SDK_Online_Documentation.html
├── FbxUtils.py
├── include
│ ├── fbxsdk
│ └── fbxsdk.h
├── Install_FbxPythonBindings.txt
├── Install_FbxSdk.txt
├── lib
│ └── gcc
├── License.txt
├── __pycache__
│ └── FbxUtils.cpython-38.pyc
├── PythonBindings.py
├── readme.txt
├── samples
│ ├── Animation
│ ├── Audio
│ ├── Camera
│ ├── CMakeSettings.txt
│ ├── UVSample
│ └── ViewScene
└── sip
├── fbxamatrix.sip
├── fbxanimcurvebase.sip
├── fbxanimcurvefilters.sip
├── fbxanimcurvenode.sip
├── fbxanimcurve.sip
├── fbxanimevaluator.sip
我直接直接全部放到一起了,所以看起来比较乱。接着我们看到那个 PythonBindings.py
,来执行一下。就剩下最后一个步骤了。
> python PythonBindings.py
Syntax: PythonBindings.py module module [buildsip] [test] [doc]
modules = Python2_x86 | Python2_ucs4_x86 | Python2_x64 | Python2_ucs4_x64 | Python3_x86 | Python3_x64 | Python2_ub | Python3_ub
然后我们就直接这样:
python PythonBindings.py Python3_x64
就可以了。然后就可以看到一大串输出编译:
pfbxFbxQuaternion.o sipfbxFbxVector4.o sipfbxFbxVector2.o sipfbxFbxLocalTime.o sipfbxFbxTimeSpan.o sipfbxFbxTime.o sipfbxFbxColor.o sipfbxFbxString.o sipfbxFbxFolder.o sipfbxFbxPathUtils.o sipfbxFbxReference.o sipfbxFbxDouble4x4.o sipfbxFbxDouble4.o sipfbxFbxDouble3.o sipfbxFbxDouble2.o sipfbxFbxDateTime.o sipfbxFbxDistance.o sipfbxFbxBlob.o -L/home/jintian/Documents/fbx_py/lib/gcc/x64/release -lz -lxml2 /home/jintian/Documents/fbx_py/lib/gcc/x64/release/libfbxsdk.a
/usr/bin/ld: /home/x/Documents/fbx_py/lib/gcc/x64/release/libfbxsdk.a(fbxutils.o): in function `fbxsdk::FbxPathUtils::GenerateFileName(char const*, char const*)':
(.text+0xc70): warning: the use of `tempnam' is dangerous, better use `mkstemp'
=> Copy the results to the folder:/home/x/Documents/fbx_py/build/Distrib/site-packages/fbx
可以看到这两个东西:
ls build/Distrib/site-packages/fbx 130
FbxCommon.py fbx.so
然后我们直接吧这个fbx文件夹拷贝到你的pip安装目录即可,不知道你的pip安装目录?直接这样查看:
Python 3.8.5 (default, Sep 4 2020, 07:30:14)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.__file__
'/home/x/anaconda3/lib/python3.8/site-packages/torch/__init__.py'
>>>
然后我们就可以import fbx了:
但是你以为这就完了吗???你错了,坑才刚刚开始。。。
这就是autodesk这家公司牛逼之处了。你会发现你编译之后,虽然可以导入了,但是很多模块并没有。。为什么?
此时你可以 pip list | grep sip
看看你的版本,你会发现官方已经不支持SIPv4了。而AutoDESK只支持SIPv4.。。。还能怎么说?人家牛逼呗,躺着收钱的买卖,何苦要动手去升级呢,又不是不能用。。
放弃了,遇到个这个错误。。
fbx.so: undefined symbol: xmlFree