(转载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
/ \ Group3
Shp1 Group2 |
/ \ Shp4
Shp2 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的操作更加底层,需要熟悉位运。

nape.dynamics.InteractionGroup的更多相关文章

  1. nape.dynamics.InteractionFilter

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

  2. Nape 获取碰撞点加特效

    package { import nape.phys.Body; import nape.shape.Shape; import nape.shape.Circle; import flash.dis ...

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

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

  4. Dynamics CRM 2015-超大Solution导入问题

    我们在将比较大的solution导入CRM的时候,经常会遇到超时的问题,这是因为CRM的本身的优化限制导致的,那么如何解决呢? 官方已经有了解决方案了. 在浏览完两种解决方法之后,我们要知道的是: 1 ...

  5. Dynamics CRM导出数据到Excel

    原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...

  6. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

  7. Step by Step 创建一个新的Dynamics CRM Organization

    原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...

  8. Step by step Dynamics CRM 2013安装

    原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处   SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...

  9. Session for SSRS Report of Microsoft Dynamics AX

    Session for SSRS Report of Microsoft Dynamics AX 版权声明:本文为博主原创文章,未经博主允许不得转载. Contract •A data contrac ...

随机推荐

  1. WPF程序中处理Windows消息

    首先通过WindowInteropHelper类,我们可以获取WPF Window的Handle. WindowInteropHelper helper = new WindowInteropHelp ...

  2. C# Process.Kill() 拒绝访问(Access Denied) 的解决方案

    需求:很多时候我们需要后台运行几个Console来不停的计算数据,那么部署到客户服务器后,如果出现突发异常,程序挂掉了,那...? 解决方案:封装了一个对后台运行程序不停监测的功能,如果发现程序有异常 ...

  3. Windows如何安装自定义服务

    系统:Windows8 开发环境:Visual Studio 2012 开发平台 .Net Framework 4.5 找到系统盘的 C:\Windows\Microsoft.NET\Framewor ...

  4. PASCALmath库

    noi上是让用,noip让用么?貌似不让— — 反正是好东西.在FP中,Math库为我们提供了丰富的数学函数.以下介绍在OI中可能会用到的Math库中一些函数.过程. 使用方法:在程序头用Uses语句 ...

  5. windows获取窗口句柄

    1.使用FindWindow函数获取窗口句柄 示例:使用FindWindow函数获取窗口句柄,然后获得窗口大小和标题,并且移动窗口到指定位置. #include <Windows.h> # ...

  6. ZOJ 2760 How Many Shortest Path (不相交的最短路径个数)

    [题意]给定一个N(N<=100)个节点的有向图,求不相交的最短路径个数(两条路径没有公共边). [思路]先用Floyd求出最短路,把最短路上的边加到网络流中,这样就保证了从s->t的一个 ...

  7. RMAN 备份与恢复深入解析(二)

    RMAN 备份与恢复深入解析(一)  http://space.itpub.net/26686207/viewspace-760869 更多精彩内容尽在 www.leonarding.com < ...

  8. Ramdisk文件系统的制作与调试运行

    开发环境:Fedora 9交叉编译工具链:arm-linux-gcc 4.3.2 with EABI嵌入式Linux内核版本:2.6.29.4-FriendlyARM.昨天写贴子的时候具体记不清了,今 ...

  9. HDU 5603 the soldier of love 离线+树状数组

    这是bestcorder 67 div1 的1003 当时不会做 看了赛后官方题解,然后翻译了一下就过了,而且速度很快,膜拜官方题解.. 附上官方题解: the soldier of love 我们注 ...

  10. 关于.jar的文件在cmd中无法连接数据库的问题

    我使用一个.jar的文件,想在cmd中以“java -jar *.jar”的格式运行,方便system.println()一些信息,该jar包中包含数据库连接内容,在我关闭comodo防火墙和wind ...