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 ...
随机推荐
- kafka监控
做kafka相关项目,需要用到监控的东东,找到了两个方法 第一个: http://quantifind.com/KafkaOffsetMonitor/ 非常容易上手,效果也直观,可以显示各个topic ...
- shell之sort
转http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html) sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟 ...
- 浏览器兼容性判定写法格式(ie)
条件注释判断浏览器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]> <!- ...
- CSS负边距自适应布局三例
单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head> <meta charset=”UTF-8″> <title& ...
- phpcms V9利用num++实现多样形式列表标签调用
在首页或者频道页调用文章列表的时候,经常会使用到左右对称或者每五行出现一条横线的调用形式. 其实代码很简单,利用num++的循环方式,以及{if}{/if}进行样式判断即可.代码如下: {pc:con ...
- ASP.Net数据导出Excel的几种方法
方法一 通过GridView(简评:方法比较简单,但是只适合生成格式简单的Excel,且无法保留VBA代码),页面无刷新 aspx.cs部分 代码如下: using System; using Sys ...
- opencv之图像腐蚀
最近准备好好学习opencv 这博客就是我的学习笔记. #include <cv.h> #include <highgui.h> using namespace std; vo ...
- python路径相关
import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 将当 ...
- Kendo UI for Angular 2 控件
Kendo UI for Angular 2 控件 伴随着 Angular 2 的正式 release,Kendo UI for Angular 2 的第一批控件已经发布了,当前是 Beta 版本,免 ...
- 舍伍德(Sherwood)算法学习笔记
一.概念引入 设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x).设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为.这显然不能排除存在x∈ ...