2008年1月11日

ゲームプログラム・衝突判定

ゲームプログラミング・衝突判定

ゲームカレッジの授業「ゲームプログラム」では、ゲームプログラム専攻の2年生が、リアルタイム3DCGを使ったゲーム作りのための要素技術を学んでいます。

 ゲームにおいて、二つ以上のもの(キャラクターなど)がある時、それらが衝突しているか、していないかを判定することはとても重要です。

 この判定を「衝突判定」または「当たり判定」といいます。

 今回の授業では1年生の時にも学んだ長方形同士の当たり判定を3Dに応用しました。3Dに応用するだけでなく、長方形の向きを変えても衝突判定ができるようになりました。ここでは少しだけ授業内容を紹介します。

 

衝突判定の方法

 判定を行う2つの長方形をそれぞれ長方形A、長方形Bとします。

border=0border=0
図1 横軸(長方形B)での判定 図2 縦軸(長方形B)での判定

 図1では、長方形Bを横に切る軸(以下「長方形Bの横軸」というふうに呼びます)で判定を行っています。長方形Aの右端が長方形Bの左端より左側にあるので、衝突していないことになります。

 図2は長方形Bの縦軸での判定です。長方形Aは長方形Bの上端より上にあり、衝突していないと判定できます。

 

border=0 border=0
図3 問題発生 図4 長方形Aを基準に判定

 図3は長方形Bの横軸での判定ですが、長方形Aの右端が長方形Bに食い込んでいて、衝突していないという判定ができません。

 長方形Bの縦軸で判定しても結果は同じです。

 この場合は図4のように長方形Aを基準とした判定を行います。図4の長方形Aの横軸を基準として判定を行うと、長方形Bの左端は長方形Aの右端より右側にあり、衝突していないと判定できます。

 

3Dへの応用

3Dの場合も2Dの場合と同様に、任意の方向を向いた直方体同士の衝突判定ができますが、特殊なケースがあるので注意が必要です。以下少し見てみましょう。

border=0border=0
図5 問題発生 図6 解決・・・できない

 図5は、2Dの場合の図3と同様の問題が発生するケースです。しかしながら図6のように直方体Aを基準にしても不具合が発生してしまいます。

 どうやらそれぞれの直方体が持つ軸の全てで判定しても充分ではないようです。

 

問題の解決

border=0border=0
図7 図8

 このケースではまず、図7のように、直方体Aの一つの軸に着目します。この軸が図8のように、縦または真横になるように座標軸の基準をとりなおします。

 図8の横軸を基準とすると、図9のように衝突していないという判定が可能になります。

border=0
図9 外積による分離軸での衝突判定

 ここで判定の基準とした軸の方向は、直方体Aの図7で着目した軸と直方体Bが持つ奥行きの軸との外積から求める事ができます。

 それぞれの直方体が持つ3本の軸の合計で6本の軸、ABお互いの軸それぞれの外積で求められる9本の軸、合計15本の軸で衝突判定を行い、いずれも衝突していないと判定できなければ衝突していると判断する、このアルゴリズムで当たり判定を行う事ができます。

 

新技術を学ぶ

 3DCGモデル(の一部)を囲むように作成した直方体を任意に回転させたもの (OBB:Oriented Bounding Box)同士をモデル同士の当たり判定に応用する事は比較的新しい技術ですが、現在市販ゲームでも良く使われています。

 ヒューマンアカデミーでは新しい技術も身につけられるよう積極的に取り入れています。興味を持たれた人はいつでもお問い合わせください。



ad131210 at 18:24│ Comments(0)TrackBack(0)