ActionScript 3.0 学习(十八) away3D学习3 away3d骨骼动画相关笔记

            1.怎么为一个Mesh设置各个不同部位的皮肤?
调用Mesh的subMeshes,但前提是你的Mesh里有SubMesh...
mesh.subMeshes[index].material = new TextureMaterial(new BitmapTexture(bitmapData));

2.怎么才知道Mesh中是否有SubMesh?
trace(mesh.subMeshes.length);
结果非0则说明有SubMesh

3.3DS文件无法成功加载怎么办?
1.先用3dsMAX之类的软件打开你的3DS文件,删掉camera,保存,
2.清除项目编辑器缓存(如Flash Builder的缓存),再次加载并测试

4.3D对象上的Mouse事件为什么无效?
需先允许Mouse事件,然后侦听MouseEvent3D
mesh.mouseEnabled = true;
mesh.addEventListener(MouseEvent3D.CLICK, mesh_clickHandler);

3.跟随人物的血条与名字怎么做?
可使用Sprite3D类,当然,你也可以参照它自己实现一个类来解决

4.怎么才能让一个模型看上去像玻璃或是水晶?
将Material设置为半透明,然后调用addMethod方法添加EnvMapMethod

5.有没有简单的办法可以画路径动画的路线?
可以使用旧版的preFab(最新支持away3d4的preFab3D目前还没有此功能),先将就用吧

6.怎样才能让贴图的某部分变透明?
使用png图片,然后...
textureMaterial.alphaBlending = true;
textureMaterial.blendMode = BlendMode.LAYER;  

7.有没有办法显示MovieClip?
目前官方暂时没有提供现成的办法,但....
可以继承BitmapTexture,自己实现一个
在继承的类中添加一个Sprite,并不需要添加到stage上
然后侦听它的Event.ENTER_FRAME事件
在每次事件触发时,draw一个新的BitmapData出来

8.怎么为一个Cube每个面贴上不同的贴图?
1.自己用6个PlaneGeometry+6个Mesh来实现一个新的Cube类,以达到每个面不同的贴图
2.用SkyBox实现
(推荐使用第一种方法,灵活度更高)

9.怎样才能让模型变的更平滑?
Weld.apply(mesh);

10.怎样计算2点之间的距离?
var v1:Vector3D = new Vector3D(0,100,0)
var v2:Vector3D = new Vector3D(100,0,0);

trace(v1.subtract(v2).length);


4.1版本对骨骼动画做了一些修改,记录一下:


//动作相关属性获取

var animator:SkeletonAnimator;
animator.updatePosition = false;   //这个可以防止骨骼动作引起的位移
var animatorSet:SkeletonAnimationSet = animator.animationSet as SkeletonAnimationSet; //获取动作集
var animationNode:AnimationNodeBase = animatorSet.getAnimation("stateName"); //获取动作节点
var animationState:AnimationStateBase = animator.getAnimationState(animationNode); //获取动作状态


//播放动作

var stateTransition:CrossfadeTransition = new CrossfadeTransition(0.5);
animator.play("stateName", stateTransition, 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);


猜你喜欢

转载自blog.csdn.net/BoRenLiang/article/details/52425390