我有一个给定的3D网格,它是通过取一组随机点并找到这些点的凸壳来构建的。然后我使用open3d和trimesh将conex外壳转换为网格。我想知道如何将此网格或凸壳本身转换为布尔体素填充网格。
我可以使用三角网格来获得某种体素网格,但内部似乎是中空的。我想要一个布尔体素网格,它为凸壳内部的体积提供真,否则为假。
发布于 2020-05-18 14:53:42
简单地栅格化你的凸面多边形体。
c对于凸包,它足以计算平均点,因此将所有面法线相加,除以每面的n
每个三角形的面都有3个点p0,p1,p2,所以
nor =交叉( p1-p0,p2-p0 );
并选择方向,使其指向凸包之外,因此:
if (点( p0-c,nor )< 0) nor =-nor;
所以3个嵌套的for循环遍历了你的网格。让我们将实际的迭代点称为凸包内部的q
如果q-face_point和face_normal之间的所有点积都为负或零,那么q就在凸包中。所以循环遍历所有的三角形/面并测试...在那之后,要么填充体素,要么不填充...
如果你想要更快的东西(以防你有太多的三角形),有像这样的方法:
的6个边)
发布于 2020-05-25 13:33:00
所以我想出了一个简单的解决方案,可以使用trimmesh来实现。其思想是生成一组大的坐标,并查询网格以确定坐标是否在网格/凸包内。如果坐标在网格内,则在网格中表示为1,否则为0。res是一个确定x,y,z轴分辨率的数组。较高的分辨率可提供更好的网格表示。
x, y, z = np.indices((res[0], res[1], res[2]))
total_voxels = np.product(res)
coords = np.concatenate((np.reshape(x/res[0], [total_voxels, 1]),
np.reshape(y/res[1], [total_voxels, 1]),
np.reshape(z/res[2], [total_voxels, 1])), axis=1)
out = mesh.contains(coords)
voxel = np.reshape(out, res)还是留着这个,以防有人有更好的解决方案。
https://stackoverflow.com/questions/61748710
复制相似问题