FBXSDK动画操作
# PythonFBXSKD 01 - 基础的动画操作
# 1.0 下载安装 FBXSDK
我这里演示的是 FBXSDK_2020.2 只有 py37 版本的 ,FBXSDK_2020.1.1 版本有 py27 和py33 两个版本,根据自己的python环境选择合适的FBXSDK版本即可
- 默认安装路径 C:\Program Files\Autodesk\FBX\FBX Python SDK
# 1.1 引用 FBXSDK
- 先将 FBXSDK 的安装路径添加到 sys.path 中
- 然后导入 FbxCommon,fbx 这两个包
参考:
GitHub-FBX_Scene.py (opens new window)
FBX_Scene.py 其中涉及加载FBX,查找对象,修改重命名之类的操作。本文都是基于该基础代码修改实现
知乎-FBX SDK 介绍 (opens new window)
# 2.1 Node 的动画曲线 - take ,动画层 ,曲线
curve_type 参数 1 :位置,2:旋转,3:缩放 ,curves_name 就是XYZ 各轴曲线了,
先是遍历FBX中的 take ,3ds max 导出的fbx资源都只要一条take 001.
for i in range(self.scene.GetSrcObjectCount(FbxCriteria.ObjectType(FbxAnimStack.ClassId))):
# Take 001 遍历 take
lAnimStack = self.scene.GetSrcObject(FbxCriteria.ObjectType(FbxAnimStack.ClassId), i)
print("Take: %s" % lAnimStack.GetName())
然后在take 取动画层, 下面代码中,我就不遍历动画了,直取 0 : BaseLayer 基础动画层
lAnimLayer = lAnimStack.GetSrcObject(FbxCriteria.ObjectType(FbxAnimLayer.ClassId), 0)
有了动画层就可以直取 对象的动画曲线了,代码写的很清楚了,
位移曲线:
lAnimCurve = node.LclTranslation.GetCurve(lAnimLayer, KFCURVENODE_T_X)
旋转曲线:
lAnimCurve = node.LclRotation.GetCurve(lAnimLayer, KFCURVENODE_T_X)
缩放曲线:
lAnimCurve = node.LclScaling.GetCurve(lAnimLayer, KFCURVENODE_T_X)
# 2.2 Node 修改动画曲线
这个测试的是把 role_node 对象的Y轴位移动画 转移到 root_node 对象的 Z轴
先取得动画曲线上的帧数
role_KeyCount = role_node_y_AnimCurve.KeyGetCount()
然后遍历这些帧
for lCount in range(role_KeyCount):
lKeyValue = role_node_y_AnimCurve.KeyGetValue(lCount)
lKeyTime = role_node_y_AnimCurve.KeyGetTime(lCount)
start_key_value 是role_node 对象的第零帧动画位移数值 ,KeySetValue 是给帧设置新数值
new_value = lKeyValue - start_key_value
role_node_y_AnimCurve.KeySetValue(lCount,start_key_value)
给root_node 对象Z轴曲线添加帧,lKeyTime 是 FbxTime 对象,不是普通的数值,KeySetInterpolation 是设置帧的贝兹曲线类型
lKeyIndex = root_node_y_AnimCurve.KeyAdd(lKeyTime)[0]
root_node_y_AnimCurve.KeySetValue(lKeyIndex, new_value * -1 )
root_node_y_AnimCurve.KeySetInterpolation(lKeyIndex, FbxAnimCurveDef.eInterpolationCubic)
修改完成之后,SaveScene 保存即可。
完整代码 链接:https://pan.baidu.com/s/1GITx2pw0ev9GL4_l7Wb52g 提取码:6y5f
SDK 路径下面的 samples 文件夹 有很多官方的演示了,我也只是看看 ImportScene 路径下 ImportScene.py 打印出来的FBX信息来学习的
将 ImportScene.py 如下这样修改,即可运行打印出FBX文件中的各种信息了