Rayと三角形の交差判定

5/14 追記中

教科書

ゲームプログラミングのための3Dグラフィックス数学

ゲームプログラミングのための3Dグラフィックス数学

これのレイと三角形の交差のところ
4.2.1 直線と平面の交差
5.2.1 レイと三角形の交差
の理解が難航したので問題箇所に関してメモ。

texとか使ってみたかったしな。

平面の定義

P_{0}を通り方向Nに垂直な平面を
N\cdot (P-P_{0})=0

平面の式変形

N\cdot P-N\cdot P_{0}=0
から
N=(A, B, C)
P=(x, y, z)
として展開
Ax+By+Cz+D=0
D=-N\cdot P_{0}
ここで、
L=(A, B, C, D)
P'=(x, y, z, 1)
(ここでP'は位置を表す同次座標なので、w=1)
とすると
L\cdot P'=0
なんか同次座標が出てくるw

三角形平面

三角形の点を
P_{0}, P_{1}, P_{2}
とすると
N=(P_{1}-P_{0})\times (P_{2}-P_{0})
から法線が求められる。
e_{1}=P_{1}-P_{0}
e_{2}=P_{2}-P_{0}
とおいて外積を展開して
N=(e_{1y}e_{2z}-e_{1z}e_{2y}, e_{1z}e_{2x}-e_{1x}e_{2z}, e_{1x}e_{2y}-e_{1y}e_{2z})

Rayの定義

始点Q、方向Vのベクトル
P(t)=Q+tV
同次座標に拡張して
P(t)'=Q'+tV'
Q'=(q_{x}, q_{y}, q_{z}, 1)
V'=(v_{x}, v_{y}, v_{z}, 0)
Q'は位置ベクトルでV'は方向ベクトルなので4つ目の要素が1, 0になる

Rayと平面の交点

L\cdot P'=0
L\cdot (Q'+tV')=0
t=-\begin{eqnarray}\frac{L\cdot Q'}{L\cdot V'}\end{eqnarray}
LV=0の時は交差しない

交点が三角形の内側にあるかの判定

3点と交点を2次元に射影してそれで判定する。
平面法線の要素の大きさでどの平面に射影するか選ぶ(法線要素の一番大きい軸を捨てる)

三角形
P_{0}, P_{1}, P_{2}
交点
P
に対して
e=P_{1}-P{0}, f=P_{2}-P{0}, g=P-P{0}
とすると
eを90度回転(どっち向きでもいい)する
ne=()e

もし
(ne\cdot f)(ne\cdot g)<0
(基準の辺eの同じ側にないということ)
なら三角形の内側に無いことになる。
三辺に対して判定する。

これでとりあえず実装に入れるというものデス。
実際には、Tomas Moller方式などもっと高速な方法を使うところですがぼちぼち。

最近やっと、外積レベルの演算見てもひかなくなった。クォータニオンとかはあれだがw