0
点赞
收藏
分享

微信扫一扫

away3d 4x骨骼控制器用法详解

青鸾惊鸿 2022-03-11 阅读 98
3d游戏as3

终于将away3d的SkeletonAnimator弄懂了。这里记下使用SkeletonAnimator的具体步骤作;
1:骨骼动画的制作:使用3dmax 制作一个简短动画;并通过格式插件/脚本导出到文件;这里使用的是max的md5导出脚本;做好动画后,选择菜单栏——MAXScript->运行脚本;选择下载的MD5Exporter.ms将会打开一个类似命令面板的对话框;在Mesh&Animation卷展栏的Frame option标签中设置start frame和end frame为动画的起始帧数;然后点击add按钮在场景中点选添加好skin修改器的模型;在export option标签下选择Export both单选框;之后点击Export按钮。首先会弹出保存对话框,提示保存一个扩展名md5mesh的文档;保存后会进一步弹出保存对话框,提示保存另一个文件为md5anim格式;md5mesh格式文件包含了导出对象的顶点和uv数据而md5anim则保存了动画的骨骼和帧数据;需要注意的是,如果导出的模型没有任何贴图,脚本将会报一个导出贴图为空的错误。这时需要打开材质编辑器,随便将某个材质球的材质赋予模型;
2:加载动画需要的文件:接下来需要将生成的文件作为资源导入到项目中;在代码中使用Embed标签分别嵌入两个文件;

[Embed(source="box.md5mesh", mimeType="application/octet-stream")]
var box:Class;
[Embed(source="box2.md5anim", mimeType="application/octet-stream")]
var boxanime:Class;

由于是嵌入型的文档所以这里只需要new关键字就可得到数据;当然,这个数据仅仅是数据,这个数据必须进行解析才能进行使用。所以使用AssetLibrary的loadData方法;

AssetLibrary.loadData(new box(), null, null, new MD5MeshParser()); 

下面必须设置加载资源的事件处理器;

AssetLibrary.addEventListener(AssetEvent.ASSET_COMPLETE, onAssetComplete);
AssetLibrary.addEventListener(LoaderEvent.RESOURCE_COMPLETE,all_com); 

3:生成SkeletonAnimator需要的数据:
SkeletonAnimator需要 SkeletonAnimationSet(骨骼动画集)Skeleton(骨骼定义)而生成SkeletonAnimationSet需要SkeletonClipNode(骨骼片段节点)作为规划动画集内容;下面的处理方法对以上需求的资源进行了配给;

function onAssetComplete(event:AssetEvent):void
{
if(event.asset.assetType==AssetType.ANIMATION_NODE){//这里加载的是md5anim文档得到的SkeletonClipNode对象
var skn:SkeletonClipNode=event.asset as SkeletonClipNode;
skn.name="anime1";//保存前必须设置一个名称(例如,跑,跳等)
skn.looping=true;//设置为节点为true则认为循环播放,循环播放的动画是不调度AnimationStateEvent.PLAYBACK_COMPLETE事件的
skn.looping=false;//设置false可进行动画段的控制
animatorSet.addAnimation(skn);//最后将节点添加到动画集中(如此一来就可根据刚才设置的名称访问特定的动作了)
skn.addEventListener(AnimationStateEvent.PLAYBACK_COMPLETE,node_com);
                //为了使用动画结束控制的功能还需要给节点增加一个AnimationStateEvent事件回调;当然通过调用SkeletonAnimationSet对象的getAnimation方法同样可获得节点,从而再任何想加入回调的时候进行设置; 
}else if (event.asset.assetType == AssetType.ANIMATION_SET) {
                //这里是从md5anim文件中得到SkeletonAnimationSet对象; 
animatorSet=event.asset as SkeletonAnimationSet;
        } else if (event.asset.assetType == AssetType.MESH) {
        //这里用于加载模型数据 
              mesh = event.asset as Mesh;
            v3D.scene.addChild(mesh);
AssetLibrary.loadData(new boxanime(), null,null, new MD5AnimParser());
        }else if(event.asset.assetType==AssetType.SKELETON){
//这里获得Skeleton定义
                 skl=event.asset as Skeleton;
}
}

4:绑定SkeletonAnimator并控制
当完成所有的数据对象解析后,就可着手进行SkeletonAnimator的创建和使用了;

function all_com(e:LoaderEvent){
if(animatorSet!=null && animatorSet.hasAnimation("anime1")){
//这里进行判断是因为程序中使用了同一个解析方法对资源进行处理; 
addEventListener(Event.ENTER_FRAME,run);
animator=new SkeletonAnimator(animatorSet,skl);//创建SkeletonAnimator对象;
mesh.animator=animator;//将对象绑定给模型
mesh.scaleX=mesh.scaleY=mesh.scaleZ=3;
stage.addEventListener(MouseEvent.CLICK,_c);//这个回调方法使得用户能够通过点击屏幕来控制动画的播放与停止;
}
} 
var played:Boolean=false;//播放状态
//
import away3d.animators.transitions.CrossfadeTransition;
var cft:CrossfadeTransition=new CrossfadeTransition(0.5); //差值计算单元
// 
function _c(e:MouseEvent){
if(!played){
    animator.play("anime1",cft,0);//play的第一参数为SkeletonClipNode的名称 第二参数为一个CrossfadeTransition对象,这里理解为包含骨骼差值计算的功能代理;第三参数是动画播放的帧数(这里是从0开始,如果不写则会从当前帧开始,但如果节点的looping属性为false那么当动画已经播放到最后一帧后,执行play将始终显示最后一帧)
      played=true;
}else{
animator.stop();
                played=false;
}
} 
举报

相关推荐

0 条评论