Ray Tracing in WebGL » Triangle

Rendering of a Triangle

Equation of a triangle

三角形と直線の交点の求め方について確認しよう.三角形はp1, p2, p3の3点の座標で定められており,直線は以下の式で表されるものとする.

$$ \begin{equation} \left[ \begin{array}{c} x \\ y \\ z \end{array} \right] = \left[ \begin{array}{c} x_\mathrm{o} \\ y_\mathrm{o} \\ z_\mathrm{o} \end{array} \right] + t \left[ \begin{array}{c} u_l \\ v_l \\ w_l \end{array} \right] \tag{1} \end{equation} $$

三角形のローカルな基底を次のように定める.ただし\(\boldsymbol{R}_\mathrm{X}\)と\(\boldsymbol{R}_\mathrm{Y}\)は直交しておらず,いずれの基底も正規化されていない.

$$ \begin{equation} \boldsymbol{R}_\mathrm{X} = \boldsymbol{p}_2-\boldsymbol{p}_1, ~~ \boldsymbol{R}_\mathrm{Y} = \boldsymbol{p}_3-\boldsymbol{p}_1, ~~ \boldsymbol{R}_\mathrm{Z} = \boldsymbol{R}_\mathrm{X} \times \boldsymbol{R}_\mathrm{Y} \tag{2} \end{equation} $$

平面と直線が平行であるかどうかは,以下の条件で確認できる.

$$ \begin{equation} \boldsymbol{l} \cdot \boldsymbol{R}_\mathrm{Z} = 0 \tag{2} \end{equation} $$

Intersection of a ray and a triangle

平面と直線が平行でない場合,平面と直線の式を解けば交点が求められるが,ここでは直線を平面のローカル座標に変換してから解を求めよう. ローカル座標での直線および平面は,それぞれ以下のように表される.

$$ \begin{equation} \left[ \begin{array}{c} X \\ Y \\ Z \end{array} \right] = \left[ \begin{array}{c} X_\mathrm{o} \\ Y_\mathrm{o} \\ Z_\mathrm{o} \end{array} \right] + t \left[ \begin{array}{c} U_l \\ V_l \\ W_l \end{array} \right], ~~ \mathrm{where}~~ \left[ \begin{array}{c} X_\mathrm{o} \\ Y_\mathrm{o} \\ Z_\mathrm{o} \end{array} \right] = \left[ \begin{array}{ccc} \boldsymbol{R}_\mathrm{X} & \boldsymbol{R}_\mathrm{Y} & \boldsymbol{R}_\mathrm{Z} \end{array} \right]^\mathrm{-1} \left\{ \left[ \begin{array}{c} x_\mathrm{o} \\ y_\mathrm{o} \\ z_\mathrm{o} \end{array} \right] - \boldsymbol{p}_1 \right\}, ~~ \left[ \begin{array}{c} U_l \\ V_l \\ W_l \end{array} \right] = \left[ \begin{array}{ccc} \boldsymbol{R}_\mathrm{X} & \boldsymbol{R}_\mathrm{Y} & \boldsymbol{R}_\mathrm{Z} \end{array} \right]^\mathrm{-1} \left[ \begin{array}{c} u_l \\ v_l \\ w_l \end{array} \right] \tag{5} \end{equation} $$ $$ \begin{equation} \left[ \begin{array}{c} X \\ Y \\ Z \end{array} \right] \cdot \left[ \begin{array}{c} 0 \\ 0 \\ 1 \end{array} \right] = 0 \tag{6} \end{equation} $$

これより交点に対応するパラメタtは以下のように表される.

$$ \begin{equation} t = - \frac{Z_\mathrm{o}}{W_l} \tag{6} \end{equation} $$

上記の方法で求めた平面と直線の交点\((X,Y,0)\)が,三角形領域にに含まれるかどうかは,以下の条件を確認すればよい.

$$ \begin{equation} 0 \le X \le 1, ~~\mathrm{and}~~ 0 \le Y \le 1, ~~\mathrm{and}~~ 0 \le X+Y \le 1 \tag{11} \end{equation} $$