この記事のURL

http://www.dango-itimi.com/blog/archives/2011/001082.html


FLASH tips update Box2DFlash v2.1a 調査3 : b2Manifold 調査

前回の記事「Box2DFlash v2.1a 調査2 : 斜面に対して平行に移動する箱」からの続きです。

二つの物質が衝突した際 得ることが可能な b2Manifold というクラスインスタンスがあります。b2Manifold クラスインスタンスのプロパティ値をどのように見れば「斜面に衝突したかどうか」「どの斜面に衝突したのか」を判別できるのかの調査を行いました。

調査用 サンプル swf

 http://www.dango-itimi.com/blog/swf/141/preloader.swf

上下左右キーで回転しない箱(以後プレイヤー)を操作する事ができます。斜面に接地時は、斜面に対して平行に移動します。
プレイヤーが背景オブジェクト(緑色の物質)に衝突すると、m_type と m_localPlaneNormal テキストフィールドに衝突時のデータが表示されます。


b2Manifold.m_type

まず、m_type プロパティの値に注目します。サンプルから以下のデータを得ることができます。

(1)
プレイヤーの上下左右の面が多角形(box or polygon)の背景オブジェクトにぶつかる
あるいはプレイヤーのどこかが円の背景オブジェクトにぶつかると
b2Manifold.m_type は 2 の値(b2Manifold.e_faceA) を返却する

(2)
プレイヤーの四隅が背景オブジェクトにぶつかると
b2Manifold.m_type は 4 の値(b2Manifold.e_faceB) を返却する

プレイヤーの角度は常に一定であり、プレイヤー上下左右の面が背景オブジェクトの斜面に衝突する事はありません。背景オブジェクト斜面に衝突するのはプレイヤーの四隅のみです。
よって、b2Manifold.m_type の値が 4 の時に、プレイヤーが斜面に衝突していることになります。


b2Manifold.m_localPlaneNormal

m_localPlaneNormal は「ローカル座標軸を元とした衝突面の単位法線ベクトル」といった意味でしょうか。b2Manifold.m_type プロパティと合わせて見ます。

(1)
m_type の値が 2 で プレイヤーが多角形(box or polygon)に衝突した場合
プレイヤー衝突面の単位法線ベクトルを返却する

(2)
m_type の値が 4 の場合
背景オブジェクトのローカル座標軸を元とした
背景オブジェクト衝突面の単位法線ベクトルを返却する

(3)
m_type の値が 2 で プレイヤーが円に衝突した場合は
今回の斜面衝突判定とは関係ないため説明略

ローカル座標軸を元としたデータの取得となるため、画面上に表示されている物質の角度がなんであれ、角度を 0 とした単位法線ベクトルが返却されます(多分)。box の角度が 15度、-30度の背景オブジェクトいずれも、上面にプレイヤーをぶつけると m_localPlaneNormal の値は (0, -1) となります。

これより今回のサンプルでは、以下の条件(a)~(c)いずれかの時 プレイヤーは斜面に衝突していることになります。

(a)
衝突した長方形(box)背景オブジェクトの角度が正で
m_localPlaneNormal の値が(-1, 0) または (0, -1)

(b)
衝突した長方形(box)背景オブジェクトの角度が負で
m_localPlaneNormal の値が(-1, 0) または (1, 0)

(c)
衝突した背景オブジェクトが多角形(polygon)で
m_localPlaneNormal の y 値が負

多角形(polygon)の角度が 0 ではない場合、斜面に衝突したかどうかの判定処理は複雑になりそうです。

参考)
Box2DFlash Documentation : b2Manifold
http://www.box2dflash.org/docs/2.1a/reference/Box2D/Collision/b2Manifold.html

Box2D 2.1a Tutorial – Part 4 (Collision Detection)
http://blog.allanbishop.com/box2d-2-1a-tutorial-–-part-4-collision-detection/

[ FLASH ] [ tips ] [ update ] 投稿者 siratama : 2011年08月05日 02:14

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/1042

» Box2D: B2Contact.getFixtureA, B2Contact.getFixtureB メソッドの内容順序に注意 from X-LABO
ox2D での衝突判定処理を行なっていたところ、どうもたびたび実行結果が異なる、... [続きを読む]

トラックバック時刻: 2013年04月12日 14:21

コメント

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]