nape.dynamics.InteractionGroup
(转载http://tomyail.com/blog/1123)
说明:
Filter只是Shape的属性,Nape为Interactor类提供了group属性,这个属性是一个InteractionGroup类型.Shape,Body和Compound都是Interactor的子类,所以它们都能使用InteractionGroup的一些特性.
过滤规则:
把需要一起控制的对象指向同一个group,并且改变这个group的ignore(布尔值)属性来控制这些对象是否需要交互,true是不交互,false(默认)是交互.
group版本小球碰撞的源码:
private function testSimpleGroup():void{var group:InteractionGroup = new InteractionGroup();var ball:Body = createCircleBody(BodyType.DYNAMIC, 60, 40, 30);ball.shapes.at(0).material = new Material(Number.POSITIVE_INFINITY);var box:Body = createRectBody(BodyType.KINEMATIC,110, 150, 200,20);ball.group = box.group = group;var btn:PushButton = new PushButton(this, 400, 100, "group.ignore=false(交互)", clickCallback);btn.width = 200;function clickCallback(e:MouseEvent):void{group.ignore = !group.ignore;if (group.ignore) btn.label = "group.ignore=true(不交互)";if (!group.ignore) btn.label = "group.ignore=false(交互)";}}
控制三组对象碰撞关系的group版本源码:
private function testMultiGroup():void{var groupA:InteractionGroup = new InteractionGroup(true);var groupB:InteractionGroup = new InteractionGroup(false);var groupC:InteractionGroup = new InteractionGroup(true);var groupAB:InteractionGroup = new InteractionGroup(false);var groupBC:InteractionGroup = new InteractionGroup(true);var groupAC:InteractionGroup = new InteractionGroup(false);groupA.group = groupAB;groupA.group = groupAC;groupB.group = groupAB;groupB.group = groupBC;groupC.group = groupAC;groupC.group = groupBC;var Ba1:Body = createCircleBody(BodyType.DYNAMIC,50,100,120);var Ba2:Body = createCircleBody(BodyType.DYNAMIC,150,100,120);Ba1.group = groupA;Ba2.group = groupA;var Bb1:Body = createCircleBody(BodyType.DYNAMIC,250,100,80);var Bb2:Body = createCircleBody(BodyType.DYNAMIC,250,100,80);Bb1.group = groupB;Bb2.group = groupB;var Bc1:Body = createCircleBody(BodyType.DYNAMIC,300,100,30);var Bc2:Body = createCircleBody(BodyType.DYNAMIC,300,100,30);Bc1.group = groupC;Bc2.group = groupC;}
图示:
A(a1a2) | B(b1b2) | C(c1c2) | |
A(a1a2) | 0 | 1 | 1 |
B(b1b2) | 1 | 1 | 0 |
C(c1c2) | 1 | 0 | 0 |
0代表不交互:group.ignore=true;
1代表不交互:group.ignore=false;
比如:MRCA(a1,b2)==groupAB,而groupAB.ignore=false,这样a1,b2就有交互;(由大到小对应abc)
在这个例子中用到了InteractionGroup的一个树结构的特征.也就是任何InteractionGroup都有一个group属性说明这个group的父group是什么.这个group是一个列表所以支持
groupA.group = groupAB;
groupA.group = groupAC;
这种多重赋值,意思就是groupA有两个父节点分别是groupAB和groupAC.
对于多次嵌套树结构,需要通过查找他们的最近共同祖先(MRCA)来确定是属于哪一个group的.这里拿官方手册上的例子好了.
Group1/ |/ Group2 Group3/ | \ |Body1 / Cmp1 |/ \ / / \ | Shp1 Shp2 Body2 Cmp2| |Shp3 Body3|Shp4
这是它们的原始结构关系,这里着重看看shape之间的关系.
shape4 | shape3 | shape2 | shape1 | |
shape4 | g3(单独) | 无共同组 | 无共同组 | 无共同组 |
shape3 | 无共同组 | g2 | g2 | g1 |
shape2 | 无共同组 | g2 | g2 | 同一刚体 |
shape1 | 无共同组 | g1 | 同一刚体 | g1 |
要确定两两shape的关系.
1:先要确定每个shape属于哪一个group,所以
Shp1依次往上递归得到碰到的第一个group是G1.
Shp2依次往上递归得到碰到的第一个group是G2.
Shp3依次往上递归得到碰到的第一个group是G2.
Shp4依次往上递归得到碰到的第一个group是G3.
2:结合这几个Group的关系就能确定最终得到的Group关系图:
Group1/ \ Group3Shp1 Group2 |/ \ Shp4Shp2 Shp3
Shp1和Shp2属于同一个刚体,所以他们是一起运动的也就不存在交互作用了.
MRCA(Shp1, Shp3) == Group1;
MRCA(Shp2, Shp3) == Group2;
Shp4是孤立的,所以不存在Shp1和Shp4之类的交互控制,所以Shp4和所有其他对象默认都是发生碰撞的.
在确定了各个Shape的MRCA之后就能很容易的看出他们的碰撞关系了.
比如
Group1.ignore = true && Group2.ignore = false就能得出:Shp1和Shp3不会交互,Shp2和Shp3会交互.由大到小对应shp4、shp3、shp2、shp1
Group1.ignore = false&& Group2.ignore = true就能得出:Shp1和Shp3会交互,Shp2和Shp3不会交互.由大到小对应shp4、shp3、shp2、shp1
总结
1:Filter是Shape的属性,在一开始就创建好了,Group是所有Interactor的属性,但默认是null的.需要自己new
2:创建的数量区别,filter很多,但是group是无限的
3:Filter有特定类型的Filter,比如Collision有对应的group和mask,Sensor又有对应的group和mask,但Group是不需要这么指定的.
4:Filter的操作更加底层,需要熟悉位运。
转载于:https://www.cnblogs.com/ddw1997/p/3166805.html
nape.dynamics.InteractionGroup相关推荐
- nape.dynamics.InteractionFilter
(转载http://tomyail.com/blog/1123) Nape定义了三种交互方式: Collision(碰撞) Sensor(感应) Fluid(浮力) 默认情况下两个物体只会发生Coll ...
- Nape实现坐标旋转角度回弹
乒乓球以一个向量运动,碰到障碍后反弹以一个新的向量运动,如下图: 要实现回弹只需要求出向量v1,把向量v0取反,再旋转(a+b)度就可以得到向量v1. 向量取反: var v:vec2 = new V ...
- iOS中的动力学:Dynamics【1】
iOS7建议我们创建的界面具有物理特性,而不只是像素的集合,可以响应触摸.手势.屏幕方向改变等事件,让用户与界面之间有更深入的交互,而不是像iOS6那样在软件界面上模仿现实世界的纹理而已.或许你会认为 ...
- Microsoft Dynamics Marketplace
微软对一些产品提供网上销售第三方插件/解决方案的站点叫做 Marketplace,比如 Windows Phone Marketplace, Dynamics Marketplace. 这样可以帮助合 ...
- Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式
Microsoft Dynamics CRM server 2013 中业务规则,我的理解就是有点像C#的正则表达式, 如方某个字段,必须输入什么范围的数值,其它字符不能乱输入. 打开方式有二种: ...
- 系统动力学_System Dynamics
1 系统动力学概述 系统动力学的创建标志是Jay.W.Forrester教授的Industrial Dynomics专著于1961年的出版. 1.1 系统动力学的基本概念(Basic Concept ...
- 为什么获取crm服务器信息失败,为 Outlook 配置 Microsoft Dynamics CRM 客户端时出现 与 Microsoft Dynamics CRM 服务器通信时出现问题 错误...
症状 当您尝试配置 microsoft Office Outlook 的 Microsoft Dynamics CRM 客户端时,收到以下错误消息: 与 Microsoft Dynamics CRM ...
- Microsoft Dynamics CRM 2013 试用之系统篇 正式安装 Microsoft Dynamics CRM Server 2013
想学习Microsoft Dynamics CRM, 建议从本人博客CRM中从早到晚日期,完整看一遍,然后再安装. 安装需要的文件直接到微软官方下载 1. 下载 Microsoft Dynamics ...
- Dynamics 365 for CRM: Sitemap站点图的可视化编辑功能
Dynamics 365 for CRM 提供了Sitemap站点图的可视化编辑功能 在之前的所有版本中,我们只能通过从系统中导出站点图的XML进行编辑后再导入(容易出错),或使用第三方的Sitema ...
最新文章
- mysql 的文件介绍_mysql 数据文件介绍
- 【Linux系统编程】特殊进程之孤儿进程
- Service生命周期
- SpringBoot 读取资源文件
- Vue学习(watch、computed、生命周期、filter)- 学习笔记
- python程序详细描述_如何逐行描述Python代码?
- VB中使用GDI+进行图像缩放的实例
- ajax 分页 评论刷新,评论:js无刷新分页(原创)
- 计算机科学速成课36:自然语言处理
- java io 文件路径_【IO流】java中文件路径(相对路径、绝对路径)相关类及方法...
- UVa 10118 免费糖果(记忆化搜索+哈希)
- Heap与Stack的区别(转载,刚看到的)
- Connect() 2016 大会的主题 ---微软大法好
- java安全管理器视频_安全管理器 (Security Manager)
- VCS带UPF的RTL低功耗仿真介绍
- flowplayer设置视频logo
- YOLO系列模型,yolov3-yolov7全方位对比实验参照,包括参数量Params,计算量GFLOPs,复杂度,mAP以及FPS等参照
- 2021-泛微OA V8 SQL注入漏洞
- mysql用户名密码忘了怎么办_mysql用户密码忘了怎么办
- running_mean和running_var