基于 FBXSDK-Python 的动画操作

PythonFBXSKD 01 - 基础的动画操作

1.0 下载安装 FBXSDK

我这里演示的是 FBXSDK_2020.2 只有 py37 版本的 ,FBXSDK_2020.1.1 版本有 py27 和py33 两个版本,根据自己的python环境选择合适的FBXSDK版本即可

在这里插入图片描述


1.1 引用 FBXSDK

  • 先将 FBXSDK 的安装路径添加到 sys.path 中
  • 然后导入 FbxCommon,fbx 这两个包
    在这里插入图片描述

参考:

GitHub-FBX_Scene.py

FBX_Scene.py 其中涉及加载FBX,查找对象,修改重命名之类的操作,本文都是基于该基础代码修改实现.

知乎-FBX SDK 介绍

FBX SDK Help

注意

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文件中的各种信息。

在这里插入图片描述

在这里插入图片描述

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值