0

我一直在开发网格库。我想添加一个功能,以便检测一个点是否位于 3D 网格内部。

我尝试过像光线投射算法这样的东西。

但问题是,在我的算法中,为了测试可能性,我将点沿 Z 轴投影到平面上。如果投影点在四边形/三边形内,并且投影点的 z 值大于原始点的 Z 值,我会数脸。如果不是,我不会。如果总计数是奇数,则表示该点位于 3D 体积内。

ispointinside3Dspace(point,facelist)
{
for faces in the object:
{
  project the point onto the face along Z axis;
  if( projected point is within the face):
  {
        if( projectedpoint->z > point->z ):
        {
           face_hit++;
        }
   }
}
if(face_hit%2==1)
{
   return(1);
}
else
{
   return(0);
}
}

如果这个算法中的投影点等于那个面上的顶点,它将被计算不止一次,因为相同的顶点将被 4 个四边形/许多 tris 共享。有没有更好的算法。我应该如何避免这种过度计数?如果我跳过投影点是脸上顶点的可能性。,我不会得到正确的结果。

4

1 回答 1

0

这种情况的常用方法是对整个系统应用一个小的变换(旋转或剪切变换)。在某些情况下(至少在 2d 中),您甚至不需要知道转换的确切数量,但您可以象征性地执行此操作并相应地调整算法。

在您的情况下,我可能会首先检查您的光线是否击中顶点(或边缘,这会造成同样的问题,因为该击中至少会被计算两次)。如果是这样,我会稍微修改您的投影方向并再次进行测试。由于更改投影方向可能需要对算法进行重大更改,因此您可以通过对系统的所有点应用小旋转(使用预先计算的旋转矩阵)来替代。

于 2011-06-20T09:54:38.027 回答