我在GitHub存储库中找到了此射线三角相交函数,用于我的射线跟踪实现。我知道这就是“Möllerand Trumbore”算法。我在徘徊,如果有人可以给我一个暗示,此函数的out参数实际上是什么(我的意思是数学上的意思)。代码如下:
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)));
}
我知道重心坐标和三角形法线是什么,但是我在数学上不理解函数内的“命中”参数和“ e2”变量。
const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );
hit = dot( triangleNormal, e2 );
据我了解,命中变量是射线到三角形的命中位置吗?
link的存储库:
答案 0 :(得分:1)
我可以回答您的部分问题。我相信这里的输出如下:
out vec3 barycentricCoord
交点P以重心坐标给出。
out vec3 triangleNormal
三角形法线(垂直于三角形面的矢量)。
out float hit
从交点到射线的距离。
此页面上有一些非常有用的信息,非常清楚,并提供了更深入的说明:
它解释了很多有关计算以及数学表示的内容。但是从我所看到的那就是我对这些输出的解释。
我仍在细分这行:
const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );
但是这部分,
dot( triangleNormal, ray.Direction )
似乎正在检查射线和三角形法线是否垂直。如果它们是哪种,则表示该射线没有平行,因为射线与三角形平行。