Away3D 4.1.4 中实现骨骼绑定
骨骼的绑定归根结底就是将目标骨骼的位置以及旋转数据,同步给要绑定的显示对象。
先来看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 中实现骨骼绑定的更多相关文章
- jQuery中的事件绑定方法
		
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
 - MVC中Action参数绑定的过程
		
一.题外话 上一篇:MVC中Action的执行过程 ControllerContext 封装有了与指定的 RouteBase 和 ControllerBase 实例匹配的 HTTP 请求的信息. 二. ...
 - activity中实现Spinner绑定
		
(1)须要一个基本的布局文件activity_main <RelativeLayout xmlns:android="http://schemas.android.com/apk/re ...
 - Jquery中的事件绑定$("#btn").bind("click",function(){  })
		
Jquery中的事件绑定:$("#btn").bind("click",function(){ }) 由于每次都这么调用太麻烦,所以jquery就用$(&qu ...
 - Asp.net Mvc 中的模型绑定
		
asp.net mvc中的模型绑定可以在提交http请求的时候,进行数据的映射. 1.没有模型绑定的时候 public ActionResult Example0() { ) { string id ...
 - AngularJS中数据双向绑定(two-way data-binding)
		
1.切换工作目录 git checkout step-4 #切换分支,切换到第4步 npm start #启动项目 2.代码 app/index.html Search: <input ng-m ...
 - jQuery 中的事件绑定
		
一.事件概念 和数据库中的触发器一样,当操作了数据的时候会引发对应的触发器程序执行 一样,JS 中的事件就是对用户特定的行为作出相应的响应的过程,其实上就是浏览器 监听到用户的某些行为的时候会执行对应 ...
 - js中this的绑定规则及优先级
		
一. this绑定规则 函数调用位置决定了this的绑定对象,必须找到正确的调用位置判断需要应用下面四条规则中的哪一条. 1.1 默认绑定 看下面代码: function foo() { cons ...
 - React中的“双向绑定”
		
概述 React并不是一个MVVM框架,其实它连一个框架都算不上,它只是一个库,但是react生态系统中的flux却是一个MVVM框架,所以我研究了一下flux官方实现中的"双向绑定&quo ...
 
随机推荐
- Debug your C# project more efficiently
			
I am a very beginner working with C# and Visual Studio 2013. When I debug my project, I always reope ...
 - 226. Invert Binary Tree(C++)
			
226. Invert Binary Tree Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 ...
 - Android 学习手札(备注)
			
1.在Android 应用程序中不能使用System.out.println(..)来输出信息,而要使用Log类中的静态方法输出调试信息. Log.d("onStart", &qu ...
 - 用Python高亮org-mode代码块
			
文章同时可在我的github blog上阅读:http://cheukyin.github.io/python/2014-08/pygments-highlight-src-export-html.h ...
 - python - StringIO文本缓冲
			
参考:http://pymotwcn.readthedocs.org/en/latest/documents/StringIO.html 类StringIO提供了一个在内存中方便处理文本的类文件(读, ...
 - ajax jsonp 原理 以及对数据的处理
			
ajax请求 var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xml ...
 - 关于浮动float属性和position:absolute属性的区别
			
最近返回头看了很多书籍,一直在纠结float属性和absolute绝对定位的区别和使用的情况,给大家分享一下自己的心得和体会吧. 1,float属性 float属性意义是让元素拜托独占一行的霸道总裁, ...
 - 【技术宅11】php入门运算
			
//1.空bool $a=''; $b=NULL; $c=false; $d=0; $e='0'; $f=array(); $g=array(array()); $h='NULL'; var_dump ...
 - php——composer 1、安装使用
			
Composer 是PHP中用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装这些依赖的库文件. 系统要求 运 ...
 - hdu不要62
			
Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来, ...