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 上被击中了。这是一个常见的问题,源于浮点不精确。
我目前正在做一个 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 上被击中了。这是一个常见的问题,源于浮点不精确。