0

我是 3D 计算的新手,我搜索了一段时间,但找不到任何解决方案(可能我使用了错误的搜索词)。

所以我有不同的 3D 点云——例如一个有 5 个点的“金字塔”:

在此处输入图像描述

数组如下所示:

pts = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0],
                [0.5, 0.5, 1], ])

现在我想提取所有“表面”——我的计划是计算凸包,但我找不到任何属性来获得表面——我用 scipy.spatial 进行了测试

hull = ConvexHull(pts) 

例如我想要以下输出:

surfaceCount: 5
surface[0]: [0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0] (yellow)
surface[1]: [0, 0, 0], [0, 1, 0], [0.5, 0.5, 1] (blue)
surface[2]: [0, 0, 0], [1, 0, 0], [0.5, 0.5, 1] (no color)
surface[3]: [1, 0, 0], [1, 1, 0], [0.5, 0.5, 1] (orange)
surface[4]: [1, 1, 0], [0, 1, 0], [0.5, 0.5, 1] (green)

在此处输入图像描述

我如何计算这些“表面”?

谢谢Dev先生

编辑:好的,我认为我的问题很具体-但这是我的下一次尝试(我找到了库“pyvista”)

我有以下代码:

import numpy as np
import pyvista as pv

points = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0],
                [0.5, 0.5, 1], ])


# points is a 3D numpy array (n_points, 3) coordinates of a sphere
cloud = pv.PolyData(points)


volume = cloud.delaunay_3d(alpha=5.)
shell = volume.extract_geometry()

surf = volume.extract_surface()
ug = surf.cast_to_unstructured_grid()
surf.plot()

pv.save_meshio("test.obj", surf)

这段代码为我生成了一个 *.obj 文件

# Created by meshio v5.2.2, 2022-01-16T16:44:24.834322
v 0.0 0.0 0.0
v 1.0 1.0 0.0
v 1.0 0.0 0.0
v 0.5 0.5 1.0
v 0.0 1.0 0.0
f 1 2 3
f 1 3 4
f 1 5 2
f 1 4 5
f 3 2 4
f 2 5 4

并向我展示了一个情节:

在此处输入图像描述

我希望在这个目标文件中找到 5 个“面”——但有 6 个——因为“地面”被分成两个三角形——条目:

f 1 2 3    
f 1 5 2

所以我的问题是:是否有可能(可能使用 pyvista)生成一个输出文件(不管它是 .obj 文件还是其他文件),我可以在其中找到金字塔的 5 个“面孔”?

谢谢

4

0 回答 0