opengl es,glsl中的三角形相交测试

Triangle intersection test in opengl es, glsl

我在我的光线追踪实现的 GitHub 存储库中找到了这个光线-三角形相交函数。我知道那是“Möller and Trumbore”算法。我在徘徊,是否有人可以给我一个关于这个函数的输出参数实际上是什么的提示(我的意思是数学上)。代码如下:

bool IntersectTriangle(Ray ray, vec3 p0, vec3 p1, vec3 p2,
                        out float hit, out vec3 barycentricCoord, out vec3 triangleNormal)
{
    const vec3 e0 = p1 - p0;
    const vec3 e1 = p0 - p2;
    triangleNormal = cross( e1, e0 );

    const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );
    const vec3 i  = cross( ray.Direction, e2 );

    barycentricCoord.y = dot( i, e1 );
    barycentricCoord.z = dot( i, e0 );
    barycentricCoord.x = 1.0 - (barycentricCoord.z + barycentricCoord.y);
    hit   = dot( triangleNormal, e2 );

    return  /*(hit < ray.tmax) && */ (hit > INTERSECT_EPSILON) && all(greaterThanEqual(barycentricCoord, vec3(0.0)));
}

我知道重心坐标和三角形法线是什么,但我不明白函数内的“hit”参数和“e2”变量的数学含义。

  1. const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );

  2. hit = dot( triangleNormal, e2 );

据我理解,hit变量是射线到三角形的命中位置吗?

存储库的

link

我可以回答你的部分问题。我相信这里的输出如下:

out vec3 barycentricCoord

以重心坐标给出的交点 P。

out vec3 triangleNormal

三角形法线(垂直于三角形面的向量)。

out float hit

交点到射线的距离

这个页面有一些非常棒的信息,非常清晰,并给出了更深入的解释:

https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-rendering-a-triangle/moller-trumbore-ray-triangle-intersection

它解释了很多关于计算和数学代表的内容。但据我所知,这就是我对这些输出的解释。

我还在打破这条线:

const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );

但是这部分行,

dot( triangleNormal, ray.Direction )

看起来它正在检查射线和三角形法线是否垂直。如果是,则表示没有发生交点,因为射线与三角形平行。