问题描述
我目前正在做一个光线追踪器项目,我刚刚发现三角形相交的问题。
有时,我不明白什么时候以及为什么,三角形的某些像素没有出现在屏幕上。相反,我可以看到它后面的物体。它只发生在三角形的一维上,取决于相机和三角形的位置(例如下图)。
我使用 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 做过这个——盒子里面有一些“黑色”像素,因为在边缘上没有三角形被击中。这是由浮点不精确引起的常见问题。