代码改变世界

【Away3D代码解读】(五):动画模块及骨骼动画

2014-12-30 16:18  阿诚de窝  阅读(1325)  评论(0编辑  收藏  举报

动画模块核心存放在away3d.animators包里;

Away3D支持下面几种动画格式:

  • VertexAnimator:顶点动画
  • SkeletonAnimator:骨骼动画
  • UVAnimator:UV动画
  • SpriteSheetAnimator:二维切换动画
  • ParticleAnimator:粒子动画
  • PathAnimator:路径动画

这几种动画都有各自的特点及应用场景,一般而在3D游戏中应用得最广泛的是骨骼动画,因为骨骼动画是人物动画的核心,我们下半段会专门详解这个动画;

 

动画简介

核心类

IAnimator

提供控制动画播放的接口,具体的动画类型对应具体的实现类,如骨骼动画使用SkeletonAnimator类;

将该对象赋值到对应的Mesh的animator属性既可以控制该Mesh对象播放动画;

对于播放的所有动画都应该存放到IAnimationSet对象中;

IAnimationSet

提供管理多个动画的容器,多个动画如奔跑或攻击都需要添加到对应的Set容器后才能进行播放;

data包

动画所需的数据对象元变化(帧)信息;

nodes包

一串变化组成的一个独立动画节点;

states包

动画当前状态,从Nodes提取以供当前显示的动画元(帧)信息;

 

渲染流程

Away3D中的动画渲染是双线更新渲染的,一个更新位于AnimatorBase类的方法update中,负责更新动画数据,一个更新位于MaterialBase类的renderPass方法中,负责渲染绘制;

具体的更新都是更具当前时间来更新对应的State对象,更新具体流程可以具体的打断点查看,这里就不深入解读了。

 

骨骼动画

骨骼动画在网络上有大量的资料,大家可以去网上搜搜看,这里主要说一下Away3D中是如何处理骨骼动画的数据的;

SkeletonJoint

由于多个关节之间是可以相互链接的(父关节变化时会影响到子关节),该对象用来保存关节的链接信息;

Skeleton

骨骼对象包含了所有关节的链接信息(SkeletonJoint);

JointPose

保存一个关节的信息,包括3个数据:名称、四元数(用于旋转)和转换信息;

SkeletonPose

记录一个关键帧下所有的关节的信息(每个关节的位置及旋转数据),包含所有的关节对象(JointPose)列表;

SkeletonClipNode

包含了一个骨骼动画的所有关键帧数据(SkeletonPose列表),同时还可以为每个关键帧指定一定的间隔;

SkeletonClipState

更新特定时间点的骨骼数据,骨骼动画的插值运算;

SkeletonAnimationSet

存放多个骨骼动画(SkeletonClipNode)的容器,使骨骼动画(SkeletonClipNode)和其name属性关联起来,配合SkeletonAnimator的play方法可以指定播放哪个骨骼动画(SkeletonClipNode);

SkeletonAnimator

骨骼动画的播放类,可以设定到指定Mesh上,需要指定一个骨骼容器(SkeletonAnimationSet)和对应的骨骼对象(Skeleton);