注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mississippi的博客

学习使人进步

 
 
 

日志

 
 

Alternativa 3D 动画  

2010-11-22 14:25:01|  分类: FLEX学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

A3D动画概念较多,稍有些复杂(可对比MAX中的骨骼动画过程)。

 

A3D动画涉及到的概念

1Skin:是包含了骨骼的Mesh的子类。

2Joint:是Skin的内在对象,Skin可添加或者删除之。用skin.getJointAt()可获得骨骼链;用joint.getJointAt()可获得骨骼链中的关节。joint必须绑定skin的顶点才起作用。

3Animation:动画。有几种子类:BoundBoxAnimationMatrixAnimationTransformAnimation;一般用来动画joint,也可以动画其他Object3D对象,如skinmeshcamera3D等。

4Track:动画轨迹。有几种不同类型的轨迹:BoundBoxmatrix、基本变换等。用于确定动画什么内容。

5Key:轨迹中的关键帧。用(时刻,值)这种形式设置。不同的轨迹有不同的值:Matrix3Dvector3DNumber

6AnimationController:动画控制器。用于确定动画内容和它们的混合。

7AnimationTimer:定时更新器。一般在enterframe中时定(每帧)刷新动画内容。使动画按一定的帧速播放出来。

 

 

●几种构造动画的方式

1、在MAX中做好皮肤和骨骼,设置好骨骼动画,导出DAE(用A3D自带插件),然后在FLEX中导入。A3D自动解析出SkinJointAnimationGroup等对象。只要添加进动画控制器中即可产生动画。这是最简单的构造方式。

2、在MAX中做好皮肤和骨骼,但不做动画。然后在FLEX中使用解析出来的joint重新定义动画内容。

3、完全用代码创建皮肤和骨骼。以下为示例代码:

 

//创建皮肤,且将其外形设置为Sphere

var skin:Skin = new Skin();

skin.takeGeometryFrom(new Sphere().geometry);

 

//创建一个关节joint1,并将之添加到skin中;

var joint:Joint = new Joint();   

skin.addJoint(joint);

 

//绑定顶点。每个顶点都必须绑定到某个关节,否则不能显示。

for each(var v:Vertex in skin.vertices){

         joint.bindVertex(v, 1);

}

 

//计算初始绑定,这步很重要,A3D不会自动计算,必须手动加上这段。

//每调用这个计算,相当于是让动画复位。

skin.calculateBindingMatrices()

 

//Skin添加进场景,使之呈现出来。这里使用debug呈现方式。

camera.addToDebug(Debug.EDGES, skin);

container.addChild(skin);

 

//创建一个基本变换动画。且设置一个位移轨迹,指定长度为3秒;

//以每秒60帧计,3秒表示为60×3=180帧。

var tAnim:TransformAnimation = new TransformAnimation(joint1);

tAnim.translation = new Track();

tAnim.length = 3;

 

//设置几个变换轨迹中的关键帧。这里使用PointKey帧类型,可以在XYZ三个分量上设置值。

var tk1:PointKey = new PointKey(0,0,0,0);        
var tk2:PointKey = new PointKey(1,0,250,0);
var tk3:PointKey = new PointKey(2,0,0,0);            

tAnim.translation.addKey(tk1);
tAnim.translation.addKey(tk2);
tAnim.translation.addKey(tk3);

//帧插值,使动画平滑过渡。好像A3D中只有线性插值。

tAnim.translation.sortKeys();


//创建动画控制器

var animCtrl:AnimationController = new AnimationController();

var state:AnimationState = animCtrl.addAnimation("action", tAnim, true);

animCtrl.play("action");

 

 

//添加到定时刷新列表中

animationTimer = new AnimationTimer()

animationTimer.addController(animCtrl)

animationTimer.start();

 

 

//以上代码即为动画创建完成;

//以后,在enterframe中加入:

animationTimer.update()

  评论这张
 
阅读(1239)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017