CG: 2005年11月アーカイブ

2drace01.jpg

GAME PROGRAMMING GEMSのアルゴリズム。
水平な(すべての頂点のY座標が0な)4角形があるとして、ある点P(X,Z)がその4角形の各辺からどのぐらいの割合の位置にあるのかを高速に割り出せるものです。一度に一方向(縦横/前後)しか測定できませんが、それでも高速です。
とりあえず前後方向に調べるとして
P:調べたい位置
Pl:後方の辺上の任意の点
Pt:前方の辺上の任意の点
Nl:内側を向いた後方の辺上の単位法線
Nt:内側を向いた前方の辺上の単位法線
・:ベクトルの内積
Vlp=P-Pl
Vtp=p-pt
として求める値、D(0~1の浮動小数点数値)は
D=Vlp・Nl/(Vlp・Nl + Vtp・Nt)

このDは後方の辺から前方の辺への位置の割合を示していて、後方の辺上では0.0、前方の辺上では1.0になるばかりではなく、中間では0.5、4角形から前方にはみ出すと1.0以上、後方に出ると、0.0以下と適切な値を返してくれます。この関数が驚異的なのは早さもありますが、4角形がどんな形であっても使えるということです。もちろん後方の辺と前方の辺が平行でなくても全然かまいません。すごいっすねぇ

デバック用に頂点だとか辺法線を表示してますが、一応ちゃんと当たり判定してます。あたった後の処理は減速するだけなんですが。まぁとりあえず一息つけます。
でもよく考えてみたら、これは当たり判定に使うべきではない?この限定条件ならもっと高速なアルゴリズムがあるんだろうか?

GAME PROGRAMMING GEMSにレースゲームでのコース移動距離を調べる面白いアルゴリズムが載っていたので、それを使ってモデリングで作る当たり判定領域ができないか考えています。

んで、そのためには3角ポリゴンの塊であるコースを調べて、4角ポリゴンに分けなくてはいけません。これが思ってたより難しく、手間取りました。

やり方としては
1. 最初の4角形を決める
 1.1. 1番目の3角形を最初の4角形の1部とする。
 1.2. それに隣接する(2頂点を共有する)3角形を探す(必ず2つある)
 1.3. 2つの3角形をそれぞれ元の三角形と合わせて4角形を作り、その全長が短い方を正しい4角形とする。
 1.4. 最初の4角形に隣接する(2頂点を共有する)3角形を探す(必ず2つある)。そして、(どちらでもいいので)最初の3角形を次の4角形の一部とする。

2.2つ目以降の4角形を決める
 2.1. 今回の4角形の一部である3角形は決まっているので、これに隣接する3角形を探す
 2.2. そのうち、前回の4角形の一部ではないもの(1点しか共有しないもの)を選び、合わせて4角形を作る。
 2.3. この4角形に隣接する(2頂点を共有する)3角形を探す(必ず2つある)
 2.4. そのうち、前回の4角形の一部ではないもの(共有点を持たないもの)を次の4角形の1部とする。
 以下 2.1.〜2.4.を繰り返し

人間が物を見て何気なく判別してることって、コンピュータにやらせると難しいのだと改めて感じました。もっとシンプルなアルゴリズムがあるはずなので、なんか思いついたら教えてください、よろしく。

とりあえずMilkShape 3D でデータを作って、プログラムにかけました。それが次の画像。
collision01.gif

3角ポリゴンの並んだ面が、4角ポリゴンの面になっています、成功〜。

このアーカイブについて

このページには、2005年11月以降に書かれたブログ記事のうちCGカテゴリに属しているものが含まれています。

前のアーカイブはCG: 2005年10月です。

次のアーカイブはCG: 2005年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01a