将射线定义为一个基点和向量,那么射线上的任意点可以表示为P = P0 + tV,其中P0为基点,V为向量,t满足 t>=0.采用重心坐标定义三角形,三角形上的任意点可以表示为:P = w V0 + u V1 + v V2, 其中u+v+w = 1. 由此,将射线方程代入上式,则:
P0 + tV = (1 - (u+v)) V0 + uV1+vV2.
利用克莱姆法则计算得出t,u,v. 交点位于三角形内的条件为: 0 <= u <= 1, 0 <= v <= 1, 0 <= u+v <= 1. 否则位于三角形外部的平面上。
该方法是Moller, Trumbore与1997年提出的。
下面我们用代码实现(c++):