我一直在开发网格库。我想添加一个功能,以便检测点是否位于3D网格内部。
我尝试过类似光线投射的算法。
但问题是。, 在我的算法中,为了测试可能性,我将点投影到沿Z轴的平面上。如果投影点在四边形/三角形内,并且投影点的z值大于原点Z值的值,我将计算face.If我不会。如果总计数是ODD那么这意味着该点在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共享。是否有更好的算法。 我应该如何避免这种过度计算?如果我跳过投影点作为一个顶点的可能性,我就不会得到正确的结果。
答案 0 :(得分:0)
这种情况的常用方法是对整个系统应用小的变换(旋转或剪切变换)。在某些情况下(至少在2d内),您甚至不需要知道转换的确切数量,但您可以象征性地执行此操作并相应地调整算法。
在你的情况下,我可能会首先检查,如果你的光线击中一个顶点(或一个边缘,这会造成同样的问题,因为这个命中至少会被计算两次)。如果是这样,我会稍微修改您的投影方向并再次进行测试。由于改变投影方向可能需要对算法进行重大更改,因此您可以通过对系统的所有点应用小旋转(使用预先计算的旋转矩阵)来执行此操作。