三角ポリゴンと三角ポリゴン最も基本的な形である三角ポリゴン。この衝突は、実は結構大変です。三角ポリゴンは「1面・3辺・3頂点」と要素が割とみっしり詰まっています。まともにやると7要素×7要素=49通りな衝突をチェックしないといけないわけです。ポリゴンのような「閉じた図形」は平面のような開いた図形よりも「無限大」と「陰関数」を使えない分ずっと面倒なんです。非常に基本的なプリミティブなので色々研究されています。ここではMollerさんが1997年に発表した論文の衝突判定を噛み砕いてみます。頂点が片方に偏っていたら衝突は起こらない三角ポリゴンが空中にふよふよと浮いている事を想像してみて下さい:この場合、三角ポリゴンは絶対に平面に接しません。一方の三角形がこの平面上にあるならば、もちろんその三角形とも衝突しないわけです。一方の三角形の頂点がもう一方の三角形を含む平面の片方に偏っていたら、衝突判定をすぐに終了できるわけです。この判定は両方の三角形でテストする必要があります。上の三角形が地面にめり込んでいたとしても、もう一方の三角形がやはり片方に偏っていたら、初めて「衝突の可能性はない」と判断できます:三角形ポリゴン同士が衝突する可能性があるのは「双方の含有平面にそれぞれがぶすっと刺さっている時」のみです:この時、2つの平面の交差線上を見れば、衝突しているのか、やっぱり衝突していないかがわかります。上の図の赤丸で囲んだ部分です。結局三角ポリゴン同士の衝突は「双方の三角ポリゴンと交差している線上の交差範囲が重なっているか否か」という問題に帰着します。この直線を双方の三角ポリゴンは含んでいます。その含まれる範囲を求めるには、含有直線と三角形の辺との交点を求めれば良いんです。直線上の交点を比で求める含有直線と三角形の辺の交点を求める時、論文ではうまい方法を用いています。下の図を御覧下さい:平面に三角形がぷすっと刺さっている状態です。平面上の直線を三角形も含んでいます。今、三角形の頂点v1とv2から平面に向かって垂線を下ろし、その距離をd1、d2とします。この時、d1を辺に持つ三角形と、d2を辺に持つ三角形が相似なのは明らかです。言う事は、赤い線で示した元の三角形の辺をd1対d2に分割する点が、求めたい交点になるわけです。d1もd2も求めるのは簡単ですし、内分点を求めるのも簡単です。上の平面はもう一方の三角形を含む平面ですから、その法線はもう一方の三角形の頂点座標から、で求められます。d2)ですから、求めたい交点p12は、となります。一方(p13)も全く同様に求められます。この2点p12、p13が直線に含まれる三角形の交差領域です。同じことを反対側の三角形について行うと含有直線上に4つの点(p12、p13、p22、p23)が並ぶことになります。後はp12-p13領域とp22-p23領域が重なっているかを調べるだけです。これはもちろんp12-p13の長さを求めて云々とやっても良いのですが、XYZのどれかの軸に各点を投影してしまったと考えて点の1成分だけで比較しても実は構いません。p12-p13領域とp22-p23領域が重なっている事がわかれば、2つの三角ポリゴンは衝突していると判定できます。以上のアイデアを組み込んだ関数を公開します。true;}意外と大変なんですよ〜(^-^;。