LWCOLLADA |
果たしてニーズはあるのか |
---|---|
Write: 04/11/11 UpDate: --/--/-- | |
COLLADAは最近出てきた3Dフォーマットの一つで、有名メーカが協賛している点は |
OBBで衝突判定な話・後編
|
最後に美味しいところをいただきましょう |
---|---|
Write: 04/04/08 UpDate: --/--/-- | |
ちょっと困ったバグがあるので修正記事をお待ち下さい(04/12/27) |
OBBで衝突判定な話・中編
|
衝突判定のコア部分です |
---|---|
Write: 04/03/23 UpDate: --/--/-- | |
前回OBBツリーを作る所まで行ったので、続いて2つのOBBツリー間で衝突判定を行ってみます。 |
OBBで衝突判定な話・前編
|
分かってしまうと大した事ありません | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Write: 04/03/01 UpDate: --/--/-- | |||||||||||||||||||||
3Dを扱う上で頭の痛い問題の一つに衝突判定があります。 色々と研究されているものの、今ひとつ決定打に欠けます。 定番の3手法として、AABB(Axis Aligned Bounding Box)、OBB(Oriented Bounding Box)、 バウンディング球を使うものがありますが、一般的にはOBBが一番リーズナブルな手だと思います。 その辺の話は識者の皆様の意見を拝聴するとして(1,2,3)、 今回は OBBにチャレンジすることにしましょう。 野村XXに似合わずアカデミックなお話なので間違っていたらご愛嬌。 なお、お勉強好きな貴方はこちらの論文を一読すると良いかと。 英語が苦手な貴方&私は狩野さんの「3Dグラフィックス数学」を読むのが楽です。 簡単に言うと、あるポリゴン群に対してどんな方向を向いていてもかまわないので、 それをすっぽりと囲む、できる限り小さな直方体を作りましょうというのがOBBの手法です。 この直方体をいかにして作るのかという所が腕の見せ所になります。 とりあえずここでは、上記論文で紹介されている主成分分析を使うことにしましょう。 主成分分析の詳しい話は、googleで引っ掛けるなり、本屋で統計解析の本を買ってくるなりしてください。 要は、あるデータ群に対して、その現象を良く表す軸を見つけ出すというのが主成分分析です。 古典的手法なので、問題の解き方も良く知られています。 OBBではデータとはポリゴンの頂点群なので、x,y,zの3次元のデータが頂点の個数分存在します。 それを使って分散共分散行列を作って、その行列の固有ベクトルを計算すると、 OBBを表す3つの軸が得られます。 ああっ、そこの人逃げないで(笑) 大して難しい話ではありません。 ソースにするとこんな感じ。 Vertex配列に頂点データが入っていて、配列の長さがSizeになります。 mは全頂点の平均値です。 float C11 = 0, C22 = 0, C33 = 0, C12 = 0, C13 = 0, C23 = 0; for( int i = 0; i < Size; ++i ){ C11 += ( Vertex[i].x - m.x ) * ( Vertex[i].x - m.x ); C22 += ( Vertex[i].y - m.y ) * ( Vertex[i].y - m.y ); C33 += ( Vertex[i].z - m.z ) * ( Vertex[i].z - m.z ); C12 += ( Vertex[i].x - m.x ) * ( Vertex[i].y - m.y ); C13 += ( Vertex[i].x - m.x ) * ( Vertex[i].z - m.z ); C23 += ( Vertex[i].y - m.y ) * ( Vertex[i].z - m.z ); } C11 /= Size; C22 /= Size; C33 /= Size; C12 /= Size; C13 /= Size; C23 /= Size; float Matrix[3][3] = { { C11, C12, C13 }, { C12, C22, C23 }, { C13, C23, C33 }, }; こうして得られる分散共分散行列ことMatrix[3][3]は、 実対称行列なのでjacobi法で固有ベクトルを求めることができます。 ああっ、そこの人逃げないで(笑^2) 数値解析で困った時は本屋で「NUMERICAL RECIPES in C」を開きましょう。 オンライン版(英語)はこちら。 英語版とはいえ、無料でこの本が読めるのはありがたいですね。 5000円位なんで日本語版さくっと買って、本棚に載せておくと賢く見えて素敵です。 色々小難しい理屈が書いてありますが、jacobi法のソースだけを拝借します。 先ほどの行列をjacobi法のソースに食わせると、3つの固有値と3つの固有ベクトルを吐き出してくれます。 固有値が大きい固有ベクトルほどOBBの長い辺を表します。 続いて、全頂点に対して固有ベクトルとの内積を計算して、その中から最大値と最小値を見つけ出します。 固有ベクトルは単位ベクトルなので頂点と内積を取ると、固有ベクトルに頂点を射影した時の長さになります。 よって最大値から最小値を引くとOBBの辺の長さが得られます。 ついでに最大値と最小値を足して2で割ったものに固有ベクトルを掛けてあげれば辺の中点が得られます。 3つの固有ベクトル全てで上記計算を行った結果、OBBの3つの辺の向きと長さ、中心が求まります。 最後にこのOBBを使うために一つ行列を作っておきます。 それはOBBを回転させて3辺をXYZ軸に平行にし、OBBの一つの頂点を原点に移動させるためのものです。 3つの固有ベクトルをr=(rx,ry,rz),s=(sx,sy,sz),t=(tx,ty,tz)、中心をq、とするとq-(r+s+t)/2で表される頂点gは
という行列で原点に移動され、3辺はXYZ軸に平行になります。 |
DirectX 9.0
SDK Update (Summer 2003)な話 |
MSさんのいけず |
---|---|
Write: 03/10/13 UpDate: --/--/-- | |
そろそろシェーダを導入しようかと考えていた矢先、DirectX
9.0 SDK Update (Summer 2003)という、 いまいちバージョンの分かりづらい最新版SDKが出てきたので思わずインストールしてしまいました。 本当は現在作成中の魔砲都市が完成するまでアップデートする気はなかったのですが、 今回のSDKには色々とHLSLのサンプルが入っていて、その魅力に勝てなかったらしいです。 で、念のため魔砲都市のソースをコンパイルしなおすと、 … コンパイルできません。 マイナーアップデートでさえ下位互換を取らないとは思いませんでした。 今回引っかかったコードはアニメーション関係ばかりでしたが、もしかすると他の部分もこっそり変更されているかも知れませんね。 ざっとID3DXAnimationControllerを眺めるとかなり関数が増えたり、変更を受けたりしています。 CreateMeshContainerの引数にconstが付きました。 GetMaxNumMatricesがなくなりました。 D3DXTRACK_DESCが変わりました。 SetTimeがなくなりました。 SetTrackAnimTimeがなくなりました。 追記 04/11/25 以上の変更を取り込んだDirectX 9.0 SDK (October 2004)版のソースを公開 |