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}$为射线方向.

01.png

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

02.png

如果射线和三角形相交,必须满足:

$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);$

03.png

这样通过构造以$-\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

  1. 基于$-\vec{D} \vec{(B-A) } \vec{(C-A)}$三个baseVector构造矩阵$M$
  2. 尝试计算$M$的逆矩阵, 如果逆矩阵不存在,说明射线和三角形平行, 返回false
  3. 使用$M^{-1}$和$\vec{(E-A)}$相乘,得到$tuv$
  4. 判断$tuv$的范围进一步判断是否相交, 判定规则如下:

    • $t > 0$

    • $u > 0$

    • $u < 1$

    • $v > 0$

    • $v < 1$

    • $u + v < 1$