2013.3.7 Havok Animation2

今天看了一下Demo的代码,大致明白了项目需要使用的那些功能该怎么用。


在Demo中,动画分为两种,全身动画和上身动画。

任何时候,人物身上都有一个全身动画在循环播放,全身动画的切换通过NormalizeMixer的Easeout和EaseIn函数完成,即将旧动作传人Easeout函数,将新动作传人EaseIn函数,然后人物就会平滑地从一个动作过度到另一个动作。

上身动画并不是循环播放的,它只在做出某些一次性动作的时候发生作用,例如拔剑。上身动作的发生和结束是通过LayerMixer的Easeout和Easein函数完成的,首先调用Easein,然后动作结束的时候,调用Easeout。


以人物拔剑这个动作为例,函数调用如下

NormalizeMixer::Easeout( "NotDrawSwordFullBody", 0.3);

NormalizeMixer::EaseIn( "DrawSwordFullBody", 0.3);

LayerMixer::EaseIn("DrawSwordUpBody", 0.2);

上面的数字为时间,即全身动作由非拔剑状态变为拔剑状态用了0.3秒。而上身骨骼由全身动画控制到完全由上身动画控制,用了0.2秒,而拔剑这个上身动作的总时长为1.8秒,所以在拔剑这个动作里面,大部分时间,骨骼是由上身拔剑动作完全控制的。

在拔剑完成的时候,再调用

LayerMixer::Easeout("DrawSwordUpBody", 0.2);

0.2秒后拔剑上身动作对骨骼的影响就全部消失了。


上面有两个疑问,程序是怎么知道拔剑动作完成了的呢。原来在AnimSequence类里面有一个映射表,记录时间点和需发送的事件,在程序初始化的时候,往拔剑这个动作的事件时间表中加入【1.8, DrawSwordFinished】,即拔剑动作播放1.8秒后,发射DrawSwordFinished事件,这样系统就知道拔剑完成,从而可以Easeout拔剑动作了。


还有一个疑问,为什么需要上身动作,为什么不能只进行全身动作的切换。全身非拔剑动作就是手放在腿两边,整个身子轻轻晃,全身拔剑动作就是手放在胸前,整个身子轻轻晃,如果只是通过这两个动作来切换,那么手是无论如何不会伸到剑鞘旁的,这样也就不可能有拔剑这个动作了。


上一篇文章说我还没有细看代码,对LayerMixer还不是很理解,现在就比较清楚了。在程序初始化的时候,要设置LayerMixer,告诉它,它只能影响上半身的骨骼。


最后再说说武器,把武器粘到人物身上时,要指定是相对于那一块骨骼,以及武器和骨骼的相对位置,以后的每一帧,武器都会根据那块骨骼的当前位置更新自己的位置。所以武器的动作并不由某个动作文件直接驱动,而是由身体的动作文件间接驱动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值