(转载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;}

图示:

ABC交互关系
  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相关推荐

  1. nape.dynamics.InteractionFilter

    (转载http://tomyail.com/blog/1123) Nape定义了三种交互方式: Collision(碰撞) Sensor(感应) Fluid(浮力) 默认情况下两个物体只会发生Coll ...

  2. Nape实现坐标旋转角度回弹

    乒乓球以一个向量运动,碰到障碍后反弹以一个新的向量运动,如下图: 要实现回弹只需要求出向量v1,把向量v0取反,再旋转(a+b)度就可以得到向量v1. 向量取反: var v:vec2 = new V ...

  3. iOS中的动力学:Dynamics【1】

    iOS7建议我们创建的界面具有物理特性,而不只是像素的集合,可以响应触摸.手势.屏幕方向改变等事件,让用户与界面之间有更深入的交互,而不是像iOS6那样在软件界面上模仿现实世界的纹理而已.或许你会认为 ...

  4. Microsoft Dynamics Marketplace

    微软对一些产品提供网上销售第三方插件/解决方案的站点叫做 Marketplace,比如 Windows Phone Marketplace, Dynamics Marketplace. 这样可以帮助合 ...

  5. Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式

    Microsoft Dynamics CRM server 2013  中业务规则,我的理解就是有点像C#的正则表达式, 如方某个字段,必须输入什么范围的数值,其它字符不能乱输入. 打开方式有二种: ...

  6. 系统动力学_System Dynamics

    1 系统动力学概述 系统动力学的创建标志是Jay.W.Forrester教授的Industrial Dynomics专著于1961年的出版. 1.1 系统动力学的基本概念(Basic Concept ...

  7. 为什么获取crm服务器信息失败,为 Outlook 配置 Microsoft Dynamics CRM 客户端时出现 与 Microsoft Dynamics CRM 服务器通信时出现问题 错误...

    症状 当您尝试配置 microsoft Office Outlook 的 Microsoft Dynamics CRM 客户端时,收到以下错误消息: 与 Microsoft Dynamics CRM ...

  8. Microsoft Dynamics CRM 2013 试用之系统篇 正式安装 Microsoft Dynamics CRM Server 2013

    想学习Microsoft Dynamics CRM, 建议从本人博客CRM中从早到晚日期,完整看一遍,然后再安装. 安装需要的文件直接到微软官方下载 1. 下载  Microsoft Dynamics ...

  9. Dynamics 365 for CRM: Sitemap站点图的可视化编辑功能

    Dynamics 365 for CRM 提供了Sitemap站点图的可视化编辑功能 在之前的所有版本中,我们只能通过从系统中导出站点图的XML进行编辑后再导入(容易出错),或使用第三方的Sitema ...

最新文章

  1. mysql 的文件介绍_mysql 数据文件介绍
  2. 【Linux系统编程】特殊进程之孤儿进程
  3. Service生命周期
  4. SpringBoot 读取资源文件
  5. Vue学习(watch、computed、生命周期、filter)- 学习笔记
  6. python程序详细描述_如何逐行描述Python代码?
  7. VB中使用GDI+进行图像缩放的实例
  8. ajax 分页 评论刷新,评论:js无刷新分页(原创)
  9. 计算机科学速成课36:自然语言处理
  10. java io 文件路径_【IO流】java中文件路径(相对路径、绝对路径)相关类及方法...
  11. UVa 10118 免费糖果(记忆化搜索+哈希)
  12. Heap与Stack的区别(转载,刚看到的)
  13. Connect() 2016 大会的主题 ---微软大法好
  14. java安全管理器视频_安全管理器 (Security Manager)
  15. VCS带UPF的RTL低功耗仿真介绍
  16. flowplayer设置视频logo
  17. YOLO系列模型,yolov3-yolov7全方位对比实验参照,包括参数量Params,计算量GFLOPs,复杂度,mAP以及FPS等参照
  18. 2021-泛微OA V8 SQL注入漏洞
  19. mysql用户名密码忘了怎么办_mysql用户密码忘了怎么办
  20. running_mean和running_var

热门文章

  1. 题目 1460: 2n皇后问题
  2. 上下取整函数的关系以及一些重要性质(附证明)
  3. sql范围年龄分组查询人数
  4. kubeadm修改证书有效期
  5. 如果到来,会是怎样情况,fuck,
  6. 小米手环8和苹果S8哪款好 小米手环8和苹果S8区别
  7. 计算机相关的文章,关于计算机的论文精选范文
  8. STM32F4时钟系统
  9. sqlitespy可以打开MySQL吗_SQLite 数据库访问
  10. vue-transitionslotmixinfilterplugin