骨骼的绑定归根结底就是将目标骨骼的位置以及旋转数据,同步给要绑定的显示对象。

先来看BindingTag.as

package away3d.entities
{
    import away3d.arcane;
    import away3d.animators.SkeletonAnimator;
    import away3d.animators.data.JointPose;
    import away3d.containers.ObjectContainer3D;
 
    use namespace arcane
    
    public class BindingTag extends ObjectContainer3D
    {
        private var _skeletonAnimator:SkeletonAnimator;
        private var _skeletonIndex:int;
 
        /**
         *
         * @param skeletonAnimator
         * @param skeletonIndex 要绑定的骨骼索引
         *
         */    
        public function BindingTag(skeletonAnimator:SkeletonAnimator, skeletonIndex:int)
        {
            super();
            _skeletonAnimator = skeletonAnimator;
            _skeletonIndex = skeletonIndex;
        }
 
        public function notifyBindingTransformChange():void
        {
            invalidateTransform();
        }
 
        override protected function updateSceneTransform():void
        {
            if (_parent)
            {
                var jointPoses:Vector.<JointPose> = _skeletonAnimator.globalPose.jointPoses;
                if(jointPoses && jointPoses.length)
                {
                                        //取到骨骼数据并同步给当前对象
                    _sceneTransform.copyFrom( jointPoses[_skeletonIndex].toMatrix3D() );
                    _sceneTransform.append( _parent.sceneTransform );
                    _sceneTransform.prepend(transform);
                }
            }
            _sceneTransformDirty = false;
        }
 
        override public function dispose():void
        {
            //TODO:
        }
    }
}
BindingTag即是绑定在指定骨骼上的容器,假如你想绑定武器或特效,
只要将他们addChild到该BindingTag就可以了。
下面看怎样将BindingTag集成到Away3D里面。
为AnimatorBase添加Exit_Frame事件,至于为什么要加这个Exit_Frame事件,后面再来解释。
分别在start()以及stop()方法里添加、移除Exit_Frame事件
1
2
3
4
5
6
7
8
9
10
if(!_broadcaster.hasEventListener(Event.EXIT_FRAME))
    _broadcaster.addEventListener(Event.ENTER_FRAME, onExitFrame);
 
if(_broadcaster.hasEventListener(Event.EXIT_FRAME))
    _broadcaster.removeEventListener(Event.EXIT_FRAME, onExitFrame);
 
protected function onExitFrame(event:Event):void
{
    //Override
}
为SkeletonAnimator添加addBindingTagByName,addBindingTagByIndex方法
以及复写onExitFrame
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
         * 绑定至通过名字指定的骨骼上
         * @param boneName
         * @return
         *
         */    
        public function addBindingTagByName(boneName:String):BindingTag
        {
            var boneIndex : int = globalPose.jointPoseIndexFromName(boneName);
            if(boneIndex<0)//骨骼不存在
                return null;
            return addBindingTagByIndex(boneIndex);
        }
 
        /**
         * 绑定至通过骨骼索引指定的骨骼上
         * @param boneIndex
         * @return
         *
         */    
        public function addBindingTagByIndex(boneIndex:int):BindingTag
        {
            var bindingTag:BindingTag = new BindingTag(this, boneIndex);
 
            for(var i:int = 0; i < _owners.length; i++)
            {
                _owners[i].addChild(bindingTag);//将bindingTag添加至骨骼对应的Mesh
            }
 
            if(!_bindingTags)_bindingTags = new Vector.<BindingTag>();
            _bindingTags.push(bindingTag);         
            return bindingTag;
        }
 
        override protected function onExitFrame(event:Event):void
        {
            if(_bindingTags && _bindingTags.length)
            {
                for (var i:int = 0; i < _bindingTags.length; i++)
                {
                    _bindingTags[i].notifyBindingTransformChange();
                }
            }
        }
到这里就已经代码已经都修改添加完成了,下面来说下为什么要在Exit_Frame事件中通知
BindingTag更新.骨骼的更新是在skeletonAnimatior的updateGlobalProperties方法中
进行的,他的更新是在引擎执行完traverse后执行的,所以为了保证每次执行traverse时都能让
BindingTag根据骨骼更新,需在Exit_Frame时通知,否则BindingTag的更新总会延迟一帧,
从而导致跟随出现错位问题。
 

Away3D 4.1.4 中实现骨骼绑定的更多相关文章

  1. jQuery中的事件绑定方法

    在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...

  2. MVC中Action参数绑定的过程

    一.题外话 上一篇:MVC中Action的执行过程 ControllerContext 封装有了与指定的 RouteBase 和 ControllerBase 实例匹配的 HTTP 请求的信息. 二. ...

  3. activity中实现Spinner绑定

    (1)须要一个基本的布局文件activity_main <RelativeLayout xmlns:android="http://schemas.android.com/apk/re ...

  4. Jquery中的事件绑定$(&quot;#btn&quot;).bind(&quot;click&quot;,function(){ })

    Jquery中的事件绑定:$("#btn").bind("click",function(){  }) 由于每次都这么调用太麻烦,所以jquery就用$(&qu ...

  5. Asp.net Mvc 中的模型绑定

    asp.net mvc中的模型绑定可以在提交http请求的时候,进行数据的映射. 1.没有模型绑定的时候 public ActionResult Example0() { ) { string id ...

  6. AngularJS中数据双向绑定(two-way data-binding)

    1.切换工作目录 git checkout step-4 #切换分支,切换到第4步 npm start #启动项目 2.代码 app/index.html Search: <input ng-m ...

  7. jQuery 中的事件绑定

    一.事件概念 和数据库中的触发器一样,当操作了数据的时候会引发对应的触发器程序执行 一样,JS 中的事件就是对用户特定的行为作出相应的响应的过程,其实上就是浏览器 监听到用户的某些行为的时候会执行对应 ...

  8. js中this的绑定规则及优先级

    一.   this绑定规则 函数调用位置决定了this的绑定对象,必须找到正确的调用位置判断需要应用下面四条规则中的哪一条. 1.1 默认绑定 看下面代码: function foo() { cons ...

  9. React中的“双向绑定”

    概述 React并不是一个MVVM框架,其实它连一个框架都算不上,它只是一个库,但是react生态系统中的flux却是一个MVVM框架,所以我研究了一下flux官方实现中的"双向绑定&quo ...

随机推荐

  1. c++ undefined reference to mysqlinit

    Solved g++ $(mysql_config --cflags) file.cpp -o filename $(mysql_config --libs)

  2. JSP中用include标签动态引入其它文件报错

    <jsp:include page="<%=path %>/include.jsp"></jsp:include> 报错:attribute f ...

  3. excel poi 文件导出,支持多sheet、多列自动合并。

    参考博客: http://www.oschina.net/code/snippet_565430_15074 增加了多sheet,多列的自动合并. 修改了部分过时方法和导出逻辑. 优化了标题,导出信息 ...

  4. 深入解析.NET框架

    一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...

  5. 翻译-让ng的$http服务与jQuerr.ajax()一样易用

    Make AngularJS $http service behave like jQuery.ajax() 让ng的$http服务与jQuerr.ajax()一样易用 作者zeke There is ...

  6. nginx1.8+php5.6.10 服务器编译安装备忘2015-06

    又要重新装一台阿里云服务器.开始想用脚本,但发现脚本的程序版本都比较低  还是手动编译最新版本 开始前 更新服务器到最新版本 #yum makecache #yum update //分区挂数据盘 # ...

  7. linux下搭建svn服务器

    安装步骤如下: 1.yum install subversion   2.输入rpm -ql subversion查看安装位置,如下图:   我们知道svn在bin目录下生成了几个二进制文件. 输入 ...

  8. Sequoyah 本机开发Native Development: Invalid path for NDK(路径无效) 解决方案

    打开window菜单下的preference选项.选择Android,Native Development(本地开发) 选择你的NDK安装目录. 但是,这个插件目前仅支持ndk的r4和r5版本,更高版 ...

  9. Vim及VimScript资料总结《转载》

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   Vim教程 入门 Vim 实用技术 Learning the vi and Vim Editors A Byte of ...

  10. mysql的SQL_CALC_FOUND_ROWS 使用

    mysql的SQL_CALC_FOUND_ROWS 使用 标签: sqlmysqltable 2007-02-27 11:40 5073人阅读 评论(0) 收藏 举报  分类: Mysql数据库技术( ...