Möller-Trumbore 算法在三角形的一维上的交集问题

Intesection problem with Möller-Trumbore algorithm on 1 dimension of the triangle

我目前正在做一个 raytracer 项目,我刚刚发现三角形相交的问题。

有时,我不明白什么时候以及为什么,三角形的某些像素不会出现在屏幕上。相反,我可以看到它后面的物体。它只发生在三角形的一个维度上,它取决于相机和三角形的位置(例如下图)。

Triangle with pixels missing

我正在使用 Möller-Trumbore 算法来计算每个交叉点。这是我的实现:

t_solve s;
t_vec   v1;
t_vec   v2;
t_vec   tvec;
t_vec   pvec;

v1 = vec_sub(triangle->point2, triangle->point1);
v2 = vec_sub(triangle->point3, triangle->point1);
pvec = vec_cross(dir, v2);
s.delta = vec_dot(v1, pvec);
if (fabs(s.delta) < 0.00001)
    return ;
s.c = 1.0 / s.delta;
tvec = vec_sub(ori, triangle->point1);
s.a = vec_dot(tvec, pvec) * s.c;
if (s.a < 0 || s.a > 1)
    return ;
tvec = vec_cross(tvec, v1);
s.b = vec_dot(dir, tvec) * s.c;
if (s.b < 0 || s.a + s.b > 1)
    return ;
s.t1 = vec_dot(v2, tvec) * s.c;
if (s.t1 < 0)
    return ;
if (s.t1 < rt->t)
{
    rt->t = s.t1;
    rt->last_obj = triangle;
    rt->flag = 0;
}

目前唯一的线索是通过使用不同的方法计算我的光线(在代码中称为 dir),结果是我丢失的像素更少。 此外,当我转动相机向后看时,我看到错误发生在三角形的另一侧。所有这些让我认为问题主要与射线有关..

看看Watertight Ray/Triangle Intersection。如果您能提供一个光线应该击中三角形但未击中三角形的最小示例,我将非常合适。很久以前,我在 Cornel Box 上就有过这个——在盒子里面有一些“黑色”像素,因为在三角形的边缘 none 上被击中了。这是一个常见的问题,源于浮点不精确。