文章:syun日付:2005/8/11目次1.はじめに2.バウンディングスフィア3.バウンディングボックス4.変位ベクトル(TODO)5.参考1.はじめに今回は3Dゲームの当たり判定の方法を解説します。3Dの場合には、以下の3つの方法があります。バウンディングスフィア(球)バウンディングボックス(箱)変位ベクトル(光線)それぞれのメリット、デメリットを書くと、こんな感じです。名称メリットデメリットバウンディングスフィア簡単・速い・回転してもOK球以外の形状はつらいバウンディングボックス正確に当たり判定を作れる面倒・コードが長くなる変位ベクトルそこそこ簡単・かなり精度がいい遅い変位ベクトルとは、レイ(光線)を飛ばして、それがポリゴンと交差する距離を判定する方法です。(レイトレーシングという3DCGの技術を応用したものです)例えば、地形に沿ってキャラが移動する場合に、キャラの重心から、地形にレイを飛ばして、その距離を比較することにより、衝突判定を行う方法です。変位ベクトルについては、私がまた使ったことがないため、解説はできません。́・ω・`)また、今回はOpenGLというライブラリを使っているため、サンプルを実行するには、GLUTをインストールしておく必要があります。サンプルソースが中心ですが、とりあえずC++が分かれば、なんてことはないと思います。「円の当たり判定」が理解できていれば、それを3次元(球)に拡張するだけです。ソースコードを見ればすぐ分かると思います。いうことで、手抜きっぽいですが、ソースコードだけのせておきます。0;}3.バウンディングボックスバウンディングボックスには2つのパターンがあります。矩形の当たり判定を3次元(箱)に拡張したAABBと、3D数学の技術を駆使したOBBです。AABBは、最小値となる頂点と最大値となる頂点を比較したものです。これも、矩形と原理は同じなので、詳しくは解説しません。AABBは矩形と同じように「回転すると使えない」というデメリットがあります。́Д`;なので、処理手順とソースコードだけ載せておきます。*OBBを使う理由AABBによる当たり判定は、回転した場合に使用することができません。そこで考えられた(かどうかは分からないのですが)のが、OBBです。OBBを使うことで、回転した箱同士の当たり判定を行なうことが可能になります。通常の境界箱による当たり判定は、x,y,zの各座標の「最大値と最小値」を基準に、その間に各頂点が含まれているかどうかで判定を行います。OBBでは、箱の中心座標x,y,zへの半径という、情報を持ちます。なんとなく、境界球に似てますね。OBBでは、さらに以下の情報を追加します。分離軸というのは、x,y,zそれぞれの単位軸に、その箱のx,y,z方向への回転を持たせたものです。以上の情報を元に当たり判定を行うのがOBBです。...通常の境界箱が「最大値と最小値」だけだったのと比べると、情報が多いですね。処理もややこしいです。・中心間の距離まず、中心間の距離ベクトルを算出します。それぞれの中心点が「PとQ」であれば、「P−Q」ですね。(まあ、書くまでもないですね...)この距離ベクトルをvLenとします。・分離軸の算出そして、分離軸を算出します。(vAxisとします)具体的には、軸の基底ベクトルに箱の回転行列を掛けてやります。1)*mRot=vAxisZのように求めることができます。以下のようにして長さを比較します。(実際には、2つの箱について行わなければならないので、3×2=6回処理を行う)vLenとvAxisP(パラメータとして渡した分離軸)との内積をとり、vLenをvAxisPに投影します。(これをlenとします)そして、vAxisPとx,y,zの分離軸との内積をとり、vAxisPをx,y,zの分離軸に投影します。投影後の半径(radius)を取得します。rZこのようにして半径を求めます。radiusBであれば、離れているので、当たっていないことになります。一度でも離れていれば、その2つの箱は離れていることになります。・分離軸同士の外積さらに分離軸同士で外積を行います。一度も離れていなかったら「当たり」となります。白オブジェクトのみ操作できます。緑オブジェクトに衝突すると、赤くなります。0;}4.変位ベクトル(TODO)すみません、書きかけです。́Д`;http://spin.s2c.ne.jp/news0301.html(ここの真ん中より上あたり)http://www.nomuraz.com/denpa/prog005.htm(ここの真ん中あたり)あ、あと、ゲームプログラミングのための3Dグラフィックス数学にものっています。