我有一个给定的3D网格,它是通过获取一组随机点并找到这些点的凸包而构造的。然后,我使用open3d和trimesh将conex船体转换为网格。我想知道如何将这个网格或凸包本身转换为一个填充的布尔体素网格。
我可以使用trimesh来获得某种体素网格,但是内部似乎是空心的。我想要一个布尔体素网格,它对于凸包内的体积为true,否则为false。
简单地栅格化您的凸多边形体积...
计算任何内点c
对于凸包,其足以计算平均点,因此将所有n
点相加并除以n
按面部法线计算
每个三角形面都有3个点p0,p1,p2
,所以
nor = cross( p1-p0 , p2-p0 );
并选择方向,使其指向凸包,因此:
if ( dot( p0-c , nor ) < 0) nor = -nor;
循环遍历所有体素
因此3个嵌套循环遍历您的网格。让我们调用实际的迭代点q
测试凸包内部
q
在凸包内,如果q-face_point
和face_normal
之间的所有点积均为负或零...那么遍历所有三角形/面并进行测试...之后,是否填充体素...
如果您想要更快的速度(如果您有太多的三角形),可以使用以下方法: