Opengl es opengles中的三角形相交测试

Opengl es opengles中的三角形相交测试,opengl-es,glsl,shader,intersection,Opengl Es,Glsl,Shader,Intersection,我在GitHub存储库中为我的光线跟踪实现找到了这个光线三角形相交函数。我知道这就是“Möller and Trumbore”算法。我想知道是否有人能给我一个关于这个函数的外参数是什么的提示(我是指数学上的)。代码如下: bool IntersectTriangle(Ray ray, vec3 p0, vec3 p1, vec3 p2, out float hit, out vec3 barycentricCoord, out vec3 trian

我在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)));
}
bool相交三角形(光线、vec3 p0、vec3 p1、vec3 p2、,
外飘命中,外vec3重心坐标,外vec3三角法)
{
常数vec3 e0=p1-p0;
常数vec3 e1=p0-p2;
三角形法线=交叉(e1,e0);
常数vec3 e2=(1.0/点(三角法线,射线方向))*(p0-射线原点);
常数vec3 i=交叉(光线方向,e2);
重心坐标y=点(i,e1);
重心坐标z=点(i,e0);
重心坐标x=1.0-(重心坐标z+重心坐标y);
hit=点(三角形法线,e2);
return/*(hitINTERSECT_EPSILON)和&all(greaterThanEqual(重心坐标,vec3(0.0));
}
我知道什么是重心坐标和三角形法线,但我不懂数学上的“hit”参数和函数中的“e2”变量

  • const vec3 e2=(1.0/点(三角法线,射线方向))*(p0-射线原点)

  • hit=dot(三角形法线,e2)

  • 据我所知,命中变量是射线对三角形的命中位置吗


    存储库:我可以回答你的部分问题。我认为这里的产出如下:

    out vec3 barycentricCoord
    
    重心坐标中给出的交点p

    out vec3 triangleNormal
    
    三角形法线(垂直于三角形面的向量)

    从交点到光线的距离

    本页包含一些非常棒的信息,非常清晰,并提供了更深入的解释:

    它解释了很多关于计算和数学所代表的东西。但从我所看到的,这就是我对这些输出的理解

    我仍在打破这条线:

    const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );
    
    但是这一部分呢,

    dot( triangleNormal, ray.Direction )
    

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

    您知道此函数是否有效吗?我有点担心你可能会看到一个不完整的函数。你测试过了吗?我测试过了,当我计算命中位置vec3 intersect=R_g.orig+R_u.dir*hit;它没有给我命中的位置所有的三角形都是黑色的。不知怎的,我不明白这一点:|我用scratchapixel ofc实现了一个,但这个函数说它“更好”了。谢谢你的回答
    dot( triangleNormal, ray.Direction )