阿赵的MaxScript学习笔记分享十一《动画关键帧的设置和获取》

MaxScript学习笔记目录
大家好,我是阿赵。继续分享MaxScript学习笔记,这是第十一篇,动画关键帧的操作。
在这里想先和大家说明一下,关于动画的问题。

1、动画基础知识

3D动画是阿赵我最早的本职工作,我是从2007年开始成为一名游戏动画师的。不过后来转做了程序之后,反而比较少做动画了。

这里先来用比较简单的方式介绍一下3DsMax或者游戏引擎里面是怎样实现动画的。
引擎的动画,首先有时间轴的概念,然后每个物体的各种属性,比如位移、旋转、缩放、颜色等等的属性,可以在时间轴里的不同时间点的数值不同。这样多个设置了时间点属性的整个时间轴一起播放的时候,就形成了动画。那些在时间轴上面标记的属性改变,就是关键帧。然后每个关键帧之间,一般可以设置曲线作为过渡的方式。

所以引擎动画的原因其实很简单,需要获取的数据就是关键帧,再详细一点,就是关键帧的时间、影响了哪个物体,具体影响的属性值是多少,然后关键帧之间的曲线详情。

上面所说的内容,获取和解析都简单,不过由于有曲线的存在,会导致很多问题变得复杂。所以在多年之前我自己写的引擎里面,我都是没有支持曲线功能的,只是单纯的关键帧之间做时间线性插值。

2、动画关键帧的设置

boxt1 = box() $Box:Box001 @ [0.000000,0.000000,0.000000]

–获取时间轴的开始和结束帧 AnimationRange.start 0f animationRange.end 100f

–设置一个物体的动画,at time 帧数 需要做动画的属性 animate on ( at time 0 boxt1.pos = [-100,0,0] at time 100 boxt1.pos = [100,0,0] ) [100,0,0]

ballt1 = sphere() $Sphere:Sphere001 @ [0.000000,0.000000,0.000000]

–同时设置多个物体的动画 animate on ( at time 0 ( boxt1.pos = [-200,0,0] ballt1.pos = [300,0,0] ) at time 100 ( boxt1.pos = [200,0,0]
ballt1.pos = [-400,0,0] ) ) [-400,0,0]

–获取某个物体某一帧的属性 pos1 = at time 3 ballt1.pos [298.148,0,0]

3、获取物体身上的关键帧

--获取物体第一层的动画属性数量,得到7
boxt1.numSubs
7
--遍历这些动画属性,如果动画控制器不为空,则打印key列表的长度
for i in 1 to 7 do
(
tempSubAnim = GetSubAnim boxt1 i
print tempSubAnim
tempController = tempSubAnim.Controller
if tempController != undefined do
(
tempKeyList = tempController.Keys
print tempKeyList.count
)
)
SubAnim:Visibility
SubAnim:Space_Warps
SubAnim:Transform
-1
SubAnim:Object__Box
SubAnim:Material
SubAnim:Image_Motion_Blur_Multiplier
SubAnim:Object_Motion_Blur_On_Off
OK
--从上面的打印可以看到,只有第3个控制器不为空,但长度是-1,证明这个控制器当前层没有动画
--理论上说这里应该写一个递归的函数继续往下遍历,这里只是为了演示,所以只获取第三个
tempSubAnim = GetSubAnim boxt1 3
SubAnim:Transform
--发现这一层有3个动画属性
tempSubAnim.numSubs
3
--获得第一个,看到是Position,也就是位移
GetSubAnim tempSubAnim 1
SubAnim:Position
--于是获得他身上的控制器和key列表
tempSubAnim2 = GetSubAnim tempSubAnim 1
SubAnim:Position
tempController2 = tempSubAnim2.Controller
Controller:Position_XYZ
tempKeyList = tempController2.Keys
#keys(0f, 50f, 100f)
--这里就可以知道,我在这个boxt1的物体上做了位移动画,总共打了3个关键帧,分别是0帧,50帧和100帧
--可以通过上面介绍过的方法,获取物体这三帧的position了

猜你喜欢

转载自blog.csdn.net/liweizhao/article/details/129330442