AutoDesk推出的FBX的python API,目前只有某个特定的版本,官方是Python37. 如果我们要python38或者python39就得自己编译。

但是这块网上教程比较少,这里记录一下如何在Ubuntu下,来编译带有Python39的FBX python API。顺便图草一下autodesk的FBX,都特马2022年了,装个python SDK这么麻烦。不过也理所应当,毕竟人家制定的标准,现在估计整个团队都只需要坐着收钱就行,谁还想着怎么方便给你用。

下载文件

先把需要的文件下载一下,主要是FBX SDK:
image.png

以及Python Binding:
image.png
请注意,由于我们不要官方的python sdk了,那么官方的那个就不用下载了,只需要下载SDK和Binding即可,我们将利用这两个编译我们自己的Python SDK.

最新版本从这里看:
image.png
https://www.autodesk.com/developer-network/platform-technologies/fbx-sdk-archives

编译

首先,先把FBX的SDK, 下载解压,然后运行一下安装程序,先不管安装到了,就解压到当前目录也行。我们需要的就是 libinclude。就可以了

  1. export FBX_ROOT=`pwd`

然后执行一下 Python Binding的执行程序,这一步会生成sip以及对应的 PythonBindings.py 文件。此时你的文件树应该是这样的:

  1. .
  2. ├── common
  3. └── FbxCommon.py
  4. ├── compile
  5. ├── Makefile.template
  6. └── profile.xml
  7. ├── configure.py
  8. ├── fbx202001_fbxpythonbindings_linux
  9. ├── fbx202001_fbxpythonbindings_linux.tar.gz
  10. ├── fbx202001_fbxsdk_linux
  11. ├── fbx202001_fbxsdk_linux.tar.gz
  12. ├── FBX_SDK_Online_Documentation.html
  13. ├── FbxUtils.py
  14. ├── include
  15. ├── fbxsdk
  16. └── fbxsdk.h
  17. ├── Install_FbxPythonBindings.txt
  18. ├── Install_FbxSdk.txt
  19. ├── lib
  20. └── gcc
  21. ├── License.txt
  22. ├── __pycache__
  23. └── FbxUtils.cpython-38.pyc
  24. ├── PythonBindings.py
  25. ├── readme.txt
  26. ├── samples
  27. ├── Animation
  28. ├── Audio
  29. ├── Camera
  30. ├── CMakeSettings.txt
  31. ├── UVSample
  32. └── ViewScene
  33. └── sip
  34. ├── fbxamatrix.sip
  35. ├── fbxanimcurvebase.sip
  36. ├── fbxanimcurvefilters.sip
  37. ├── fbxanimcurvenode.sip
  38. ├── fbxanimcurve.sip
  39. ├── fbxanimevaluator.sip

我直接直接全部放到一起了,所以看起来比较乱。接着我们看到那个 PythonBindings.py,来执行一下。就剩下最后一个步骤了。

  1. > python PythonBindings.py
  2. Syntax: PythonBindings.py module module [buildsip] [test] [doc]
  3. modules = Python2_x86 | Python2_ucs4_x86 | Python2_x64 | Python2_ucs4_x64 | Python3_x86 | Python3_x64 | Python2_ub | Python3_ub

然后我们就直接这样:

  1. python PythonBindings.py Python3_x64

就可以了。然后就可以看到一大串输出编译:

  1. 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
  2. /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*)':
  3. (.text+0xc70): warning: the use of `tempnam' is dangerous, better use `mkstemp'
  4. => Copy the results to the folder:/home/x/Documents/fbx_py/build/Distrib/site-packages/fbx

可以看到这两个东西:

  1. ls build/Distrib/site-packages/fbx 130
  2. FbxCommon.py fbx.so

然后我们直接吧这个fbx文件夹拷贝到你的pip安装目录即可,不知道你的pip安装目录?直接这样查看:

  1. Python 3.8.5 (default, Sep 4 2020, 07:30:14)
  2. [GCC 7.3.0] :: Anaconda, Inc. on linux
  3. Type "help", "copyright", "credits" or "license" for more information.
  4. >>> import torch
  5. >>> torch.__file__
  6. '/home/x/anaconda3/lib/python3.8/site-packages/torch/__init__.py'
  7. >>>

然后我们就可以import fbx了:
image.png

但是你以为这就完了吗???你错了,坑才刚刚开始。。。
这就是autodesk这家公司牛逼之处了。你会发现你编译之后,虽然可以导入了,但是很多模块并没有。。为什么?

image.png
此时你可以 pip list | grep sip看看你的版本,你会发现官方已经不支持SIPv4了。而AutoDESK只支持SIPv4.。。。还能怎么说?人家牛逼呗,躺着收钱的买卖,何苦要动手去升级呢,又不是不能用。。

放弃了,遇到个这个错误。。

  1. fbx.so: undefined symbol: xmlFree