Opengl es opengles中的三角形相交测试
我在GitHub存储库中为我的光线跟踪实现找到了这个光线三角形相交函数。我知道这就是“Möller and Trumbore”算法。我想知道是否有人能给我一个关于这个函数的外参数是什么的提示(我是指数学上的)。代码如下: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
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 )