Physics2DのQueryContactScene
PS Suite SDKの話。
Physics2Dのサンプルとしてある、Physics2DSample。
その中の、
QueryContactScene(Contact Queryを用いて衝突情報を得るサンプルシーンです。)
について。
使用するのは
PhysicsScene.QueryContact(..)
bool QueryContact (uint index1, uint index2)
2つの剛体の間に衝突があったかどうかの記録を調べる
index1 剛体ペアの一方 index2 剛体ペアのもう一方 戻り値 剛体ペアに衝突があった記録があれば真を返す
indexは剛体のindexなので
sceneBodies[ index ]のindexを使用する。
サンプルでは
184行目からのInitSceneの中で
coll_target1 = numBody; sceneBodies[numBody] = new PhysicsBody(sceneShapes[2], 1.0f); //色々設定 numBody++;
202行目から
coll_target1 = numBody; sceneBodies[numBody] = new PhysicsBody(sceneShapes[2], 1.0f); //色々設定 numBody++;
278行目のDrawAllBodyの中で
bool isCollision = QueryContact((uint)coll_target1, (uint)coll_target2); //trueなら色を変えている
といった形で使用している。
補足
PhysicsSceneには
int numPhysicsSolverPair = 0
narrow phase衝突判定により衝突するペア数
PhysicsSolverPair[] solverPair = new PhysicsSolverPair[maxContacts]
シーン中の衝突ペアリスト
がある。
Physics2Dのサンプルでは
DrawAdditionalInfo(..)の中で
for (uint i = 0; i < numPhysicsSolverPair; i++) { //solverPair[ i ].resAなどで衝突点の描画をしている。 }
そして、
PhysicsSolverPairは
uint GetIndexA ()
ペアの剛体Aのインデックスを返す
uint GetIndexB ()
ペアの剛体Bのインデックスを返す
といった関数もあるので、これで特定の剛体の衝突を検出することも可能。
実際に、
QueryContactの中を見ると工夫はしてあるが、
solverPairを使用して結果を返している。