RealTime-Rendering23-Möller–Trumbore Triangle-Ray intersection
Möller–Trumbore Triangle-Ray intersection
Möller–Trumbore
射线定义: $Ray(t) = E + t * D$. 其中$E$为射线起点,$\vec{D}$为射线方向.

三角形定义:$Triangle(u,v) = A + u (C-A) + v (B-A)$。 其中$uv$是三角形的其中两个重心坐标,$ABC$为三角形的三个顶点。

如果射线和三角形相交,必须满足:
$Ray(t) = Triangle(u, v)$.即:
$E+ t D = A + u (C-A) + v * (B-A)$;
$E - A = t -D + u (C-A) + v * (B-A);$

这样通过构造以$-\vec{D}$ $\vec{B-A}$ $\vec{C-A}$三个向量为基构成矩阵的逆矩阵, 一次性既可以解出$t,u,v$.
最后通过判断$tuv$的范围即可确定三角形和射线是否相交, 需要满足以下几个条件:
$t > 0$
$u > 0$
$u < 1$
$v > 0$
$v < 1$
$u + v < 1$
解释: $t$表示射线行进的距离, 首先需要满足$t > 0$, 射线向正向前进; $uv$是三角形的重心坐标, 如果判断一个点在三角形内部, 必须满足, $1 > u > 0, 1 > v > 0$. 同时 $u + v < 1$;
Conclustion
- 基于$-\vec{D} \vec{(B-A) } \vec{(C-A)}$三个baseVector构造矩阵$M$
- 尝试计算$M$的逆矩阵, 如果逆矩阵不存在,说明射线和三角形平行, 返回false
- 使用$M^{-1}$和$\vec{(E-A)}$相乘,得到$tuv$
判断$tuv$的范围进一步判断是否相交, 判定规则如下:
$t > 0$
$u > 0$
$u < 1$
$v > 0$
$v < 1$
$u + v < 1$