首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >凸包到体素网格

凸包到体素网格
EN

Stack Overflow用户
提问于 2020-05-12 17:53:43
回答 2查看 575关注 0票数 0

我有一个给定的3D网格,它是通过取一组随机点并找到这些点的凸壳来构建的。然后我使用open3d和trimesh将conex外壳转换为网格。我想知道如何将此网格或凸壳本身转换为布尔体素填充网格。

我可以使用三角网格来获得某种体素网格,但内部似乎是中空的。我想要一个布尔体素网格,它为凸壳内部的体积提供真,否则为假。

EN

回答 2

Stack Overflow用户

发布于 2020-05-18 14:53:42

简单地栅格化你的凸面多边形体。

  1. 计算任意内点c

对于凸包,它足以计算平均点,因此将所有面法线相加,除以每面的n

  • compute法线

每个三角形的面都有3个点p0,p1,p2,所以

nor =交叉( p1-p0,p2-p0 );

并选择方向,使其指向凸包之外,因此:

if (点( p0-c,nor )< 0) nor =-nor;

  • 循环遍历所有体素

所以3个嵌套的for循环遍历了你的网格。让我们将实际的迭代点称为凸包内部的q

  • test

如果q-face_pointface_normal之间的所有点积都为负或零,那么q就在凸包中。所以循环遍历所有的三角形/面并测试...在那之后,要么填充体素,要么不填充...

如果你想要更快的东西(以防你有太多的三角形),有像这样的方法:

  • 栅格化三角形和填充体积,并栅格化每个四面体separately
  • render深度图(从外接立方体和内嵌

的6个边)

票数 1
EN

Stack Overflow用户

发布于 2020-05-25 13:33:00

所以我想出了一个简单的解决方案,可以使用trimmesh来实现。其思想是生成一组大的坐标,并查询网格以确定坐标是否在网格/凸包内。如果坐标在网格内,则在网格中表示为1,否则为0。res是一个确定x,y,z轴分辨率的数组。较高的分辨率可提供更好的网格表示。

代码语言:javascript
复制
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)

还是留着这个,以防有人有更好的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61748710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档