Box2d碰撞篩選

碰撞篩選就是一個防止某些形狀發生碰撞的系統。按照具體需求設置哪些物體跟那些物體發生碰撞,跟哪些物體不發生碰撞。
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自己配對。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章