我在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”变量。
const vec3 e2 = ( 1.0 / dot( triangleNormal, ray.Direction ) ) * ( p0 - ray.Origin );
hit = dot( triangleNormal, e2 );
至于我的理解,正在热播的变量射线三角形的命中位置?
仓库的link:
我可以回答你的问题的一部分。我相信这里的输出情况如下:
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 )
看起来像是做了检查,看是否射线和三角正常是垂直的。其中,如果它们是这意味着没有发生交叉点,因为射线平行于三角形。