在OpenGL ES的三角形相交测试,GLSL

问题描述 投票:2回答:1

我在GitHub的仓库为我的光线追踪执行发现这个光线 - 三角形相交功能。我知道,是“默勒和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)));
}

我知道什么是重心COORDS和三角形正常的,但我不理解数学的“打”的说法,并在函数内部的“E2”变量。

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

至于我的理解,正在热播的变量射线三角形的命中位置?

仓库的link

opengl-es glsl shader intersection
1个回答
1
投票

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

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 )

看起来像是做了检查,看是否射线和三角正常是垂直的。其中,如果它们是这意味着没有发生交叉点,因为射线平行于三角形。

© www.soinside.com 2019 - 2024. All rights reserved.