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 这两个包
参考:
FBX_Scene.py 其中涉及加载FBX,查找对象,修改重命名之类的操作,本文都是基于该基础代码修改实现.
注意
FBXSDK-ptyhon 基本上是个残废,很多C++ API 都是没有的!!!
多用 dir(object) 查看对象的可用属性。
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 对象,不是普通的数值
thetime = FbxTime()
thetime.SetFrame(帧数)
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 保存即可。
2.3 Global,Local - Transform转换
拿到 node 不同时间的 Transform。
glTm = node.EvaluateGlobalTransform(fbxtime)
lcTm = node.EvaluateLocalTransform (fbxtime)
写入动画曲线的是LocalTransform,分别GetT,GetR,GetS 的前3个值。
#伪代码
nodeLcTm=node.glTm * inverse node.parent.gltm
完整代码
链接:https://pan.baidu.com/s/1GITx2pw0ev9GL4_l7Wb52g
提取码:6y5f
SDK 路径下面的 samples 文件夹 有很多官方的演示了,我也只是看看 ImportScene 路径下 ImportScene.py 打印出来的FBX信息来学习的
将 ImportScene.py 如下这样修改,即可运行打印出FBX文件中的各种信息。