我一直在开发网格库。我想添加一个功能,以便检测一个点是否位于 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 共享。有没有更好的算法。我应该如何避免这种过度计数?如果我跳过投影点是脸上顶点的可能性。,我不会得到正确的结果。