通过闭环平面轮廓数组创建三角形网格的Python实现

问题描述

我有点被困住了。

我有一个3D点云(由(n,3)个顶点组成的数组),我试图在其中生成3D三角形网格。到目前为止,我还没有运气。

数据的格式为:

  • (x,y)值以规则间隔(z)间隔。可以将数据视为在z方向上逐片存储的闭环平面轮廓。
  • 数据中的顶点必须是网格三角形的绝对位置(即,我不希望它们平滑以使体积开始改变形状,但是层之间的线性插值很好)。

插图:

Z=2. : ..x-------x...   <- Contour 2
Z=1.5: ...\......|...   <- Join the two contours into a mesh.
Z=1. : .....x----x...   <- Contour 1
Repeat for n slices,end up with an enclosed 3D triangular mesh.

我尝试过的事情:

  • 使用Open3D
    • The rolling ball (pivot) method只能完成75%的网格,并且留下较大的区域不完整(尽管有各种大小的球)。在顶部和底部切片中存在一些特别的问题,在这些切片中,中间的缝隙往往比较大(即平坦的表面)。
    • The Poisson reconstruction method使音量过大,我不再能准确表示音量。这种情况发生在3至12点的所有深度。
  • CGAL
    • 我无法让它为我的一生工作。 SWIG不是很好,使用SWIG的CGAL实施也不是很好。
    • 有两种CGAL的PyBind实现,但是它们尚未并入CGAL的3D三角测量库。
  • 探索了其他模块,例如PyMesh,TriMesh,TetGen,Scikit-Geometry,Shapely等。我可能一直错过答案。

鉴于我的数据是一个闭环平面轮廓的列表,似乎必须要有一些简单的解决方案才能将相邻的切片轮廓“连接”到一个大的3d网格中。就像您在搅拌机中一样。 有一些非python解决方案(例如MeshLab)可以很好地解决这些问题,但是我需要一个python解决方案。有人有什么想法吗?我对VTK和ITK进行了一些了解,但到目前为止还没有找到我真正想要的东西。

我也开始考虑也许可以对切片之间的中间轮廓进行插值,并用顶点填充顶部和底部的轮廓,以使数据对“枢轴球”方法更加友好。

在此先感谢您的帮助。 如果有一个好的方法尚未进行编码,我保证会对其进行编码,并使其适用于我所处的环境:)

解决方法

实际上,有两种方法可以在python中具有meshlab功能:

  1. 第一个是第三方的MeshLabXML(https://github.com/3DLIRIOUS/MeshLabXML),是Meshlab脚本接口的Python脚本接口。
  2. 第二个是PyMeshLab(https://github.com/cnr-isti-vclab/PyMeshLab),这是MeshLab作者(目前处于Alpha阶段)正在进行的一项工作,旨在将Python直接绑定到所有meshlab过滤器
,

《医学物理学杂志》上有一篇标题为"Technical Note: an algorithm and software for conversion of radiotherapy contour‐sequence data to ready‐to‐print 3D structures"的整洁论文,很好地描述了这个问题。不需要python软件包,但是使用numpy更容易实现。不需要任何3D软件包。

提供了一个有用的摘录: ...

  1. 确定构成指定结构的切片(2D轮廓)的数量。
  2. 确定每个切片中的点数。
  3. 提取每个切片中每个点的笛卡尔坐标并将其存储在专用数据结构中...
  4. 重新排列每个切片(曲线)中的点数,以使起点(索引为0的点)是后续切片之间的最接近点。重新计数从点0开始,切片0(z坐标最低的切片)。
  5. 确定每个曲线的方向(即,由点相对于曲线的内部/外部的增加的索引确定的方向)。如果发现切片之间存在差异,则不匹配曲线中的点编号(以及方向)将相反。
  6. 所考虑结构的侧面是离散的。相邻层的点排列成三份,构成STL文件的三角形小平面。对于每个三角形,最接近的点与每个图层的后续索引都被连接。
  7. 所考虑结构的上下基础表面是离散的。程序对曲线上的每三个后续点进行迭代,并检查它们是否属于边的凸部。如果是,则将它们连接到一个构面,然后从进一步的迭代中删除中间点。

因此,基本上,这是将每个切片中的数据集与每个切片的最近值对齐的问题。然后对齐每个轮廓的方向。然后根据距离将两层之间的点连接起来。

本文还提供了执行此操作的代码(用于DICOM文件),但是我自己重新编写了该代码,它很吸引人。

我希望这对其他人有帮助!确保在使用此功能的任何工作中都赞誉作者。

,

pymadcad的最新功能可以做到这一点,不确定是否符合“旋转球”之类的确切期望,请检查doc for blending

从轮廓列表开始,它可以生成混合曲面以将它们连接起来:

出于您的目的,我认为最好的方法之一是:

  • blendpair(line1,line2)
  • junction(*lines)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...