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 ...
随机推荐
- ubuntu系统安装的MySql数据库,远程不能访问的几种可能问题
安装MySQL数据库后一般会遇到远程计算机不能连接的问题,具体问题需要我们排查.可能一:MySql数据库是否提供了外部访问的用户以及权限?可能二:MySql的配置文件是否只绑定了本机ip(ubuntu ...
- cas的url中去掉jsessionid
Servlet3.0规范中的<tracking-mode>允许你定义JSESSIONID是存储在cookie中还是URL参数中.如果会话ID存储在URL中,那么它可能会被无意的存储 在多个 ...
- Java Swing 使用总结(转载)
随笔转载自:此去经年ぢ 地址:http://www.cnblogs.com/FLFL/p/5369756.html 1. GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在 ...
- WampServer修改端口及菜单Localhost
一.修改Apache端口 1.在界面中选Apache,弹出隐藏菜单选项,打开配置文件httpd.conf: 2.找到 Listen 80: 3.将 80 改成 8080(当然自己也可以设定别的不使用的 ...
- Ubuntu1404+Django1.9+Apache2.4部署配置1安装
关于Ubuntu环境下的文章很少,搜索一些问题比较麻烦,这里将别人的做法和自己做的整合一下.这篇文章主要讲解基础的安装,至于Django1.9如何部署到Apache2.4请转到下一篇博文http:// ...
- SGU 131.Hardwood floor
时间限制:0.25s 空间限制:4M 题意: 给出 n*m (1≤n.m≤9)的方格棋盘,用 1*2 的矩形的骨牌和 L 形的(2*2 的 去掉一个角)骨牌不重叠地覆盖,求覆盖满的方案数. Solut ...
- 谈谈 jQuery 中的防冲突(noConflict)机制
许多的 JS 框架类库都选择使用 $ 符号作为函数或变量名,jQuery 是其中最为典型的一个.在 jQuery 中,$ 符号只是 window.jQuery 对象的一个引用,因此即使 $ 被删除,w ...
- python学习第五天 List和tuple类型介绍及其List切片
List 和tuple: python提供一种类似C语言数组的类型,但是使用起来确是相当的简洁.那就讲讲这神奇的python中list 和tuple吧. List类型: 1.直接贴代码: L = [' ...
- MVC身份验证及权限管理
MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供了三种方式,其中最常用的就是我们的Form认证,需要配置相应的信息.例如下面的配置信息: < ...
- MATLAB中多行注释的三种方法
MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...