您的位置:首页 > 其它

Box2d的碰撞筛选

2016-03-08 13:09 267 查看
Box2D通过种群跟组索引支持碰撞筛选。

组索引比较简单,设置其shapeDef的groupIndex值即可,例如boxDef.filter.groupIndex =1。

通过groupIndex值的正负来确定同一个组的所有形状总是发生碰撞(正)或永远不发生碰撞(负),需要特别注意的是两个不同的付索引是依然会发生碰撞的,例如一个圆的GroupIndex值为-1,一个矩形GroupIndex值为-2。因为不同组索引之间是按照种群跟掩码来筛选的,也就是讲,组索引是有着更高的优选权的。

Box2D支持16个种群,因此我们可以指定任何一个形状属于哪个种群,同时也可以指定这一形状和哪些其它的种群发生碰撞。这一过程就是通过设置其shapeDef的categoryBits值与maskBits值完成的。

categoryBits用于定义自己所属的碰撞种类,maskBits则是指定碰撞种类。

举个例子讲,如果body1的boxDef.filter.categoryBits =0x0002,body2的boxDef.filter.categoryBits =0x0004,则如果另外一个body想与他们两个都发生碰撞,则其boxDef.filter.maskBits =0x0006;简单讲,一个body要与其它种群的body发生碰撞,则其maskBits值应该为其它种群的body的categoryBits之和。

但是同时也不是那么简单,如果三个body的categoryBits分别为0x0001,0x0002,0x0003,那另外一个body的maskBits值如果是0x0003的话,那它是跟categoryBits值为0x0001和0x0002的两个body碰撞呢,还是单独只跟categoryBits值0x0003的body发生碰撞呢,亦或是跟三个body都发生碰撞呢?

一个游戏中的种群一般有多少种呢?

现在我们就做一个测试,具体要求:四个刚体。

矩形:只跟自身,圆形,三角形发生碰撞。

圆形:只跟自身,矩形,五边形发生碰撞。

三角形:只跟自身,矩形发生碰撞。

五边形:只跟自身,圆形碰撞。

categoryBits值:矩形[0x0001],圆形[0x0002],三角形[0x0003],五边形[0x0004]。

maskBits值:矩形[1+2+3=6=0x0006]

         圆形[1+2+4=7=0x0007]

         三角形[1+3=4=0x0004]

         五边形[2+4=6=0x0006]

这个碰撞具体会怎样呢?矩形跟五边形竟然一样!6跟7少说也有两种组合方法,还是直接看Demo好了。

 

结果:

矩形:只跟圆形发生碰撞。6跟2有什么关系?

圆形:只跟自身,矩形,五边形发生碰撞。符合要求。赞一个!

三角形:只跟五边形发生碰撞。4跟4,是不是单一比组合优先?

五边形:只跟自身,圆形,三角形发生碰撞。6 = 2+3+4??我勒个去!

 

还是先看看正确的把!

 
一切一切的错误就是categoryBits值有些取值是违规的,categoryBits值是必须为2的倍数的。
即有如下的16个种群:
0x0000 = 0
0x0001 = 1
0x0002 = 2
0x0004 = 4
0x0008 = 8
 
0x0010 = 16
0x0020 = 32
0x0040 = 64
0x0080 = 128
 
0x0100 = 256
0x0200 = 512
0x0400 = 1024
0x0800 = 2048
 
0x1000 = 4096
0x2000 = 8192
0x4000 = 16384
0x8000 = 32768
这样子,6就只能跟2+4配对,8就只能跟8自己配对。

原文链接:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: