【问题标题】:Create 3D triangulated mesh from scratch从头开始创建 3D 三角网格
【发布时间】:2016-03-01 10:14:17
【问题描述】:

我要做的是创建一个 3D 三角网格,可以将其解析为 .vtk 或 .stl 文件以用于 3D 打印应用程序。现在我被三角网格的创建困住了。我要创建的几何图形基本上是具有一定厚度并相互交叉的三维正弦波。到目前为止,我得到了一个正弦波。这是一个 MWE:

import matplotlib.pyplot as plt
import numpy as np
from scipy import ndimage
import scipy.spatial

# create empty 3d array
array = np.zeros((100, 100, 100))

# create 3D sine wave in empty array
strut = np.sin(np.linspace(1, 10, 100))*12
for k in enumerate(strut):
    y_shift = int(np.round(strut[k[0]]))
    array[k, 50 + y_shift, 50] = 1

pattern = np.ones((4, 4, 4))

# convolve the array with the pattern / apply thickness
conv_array = ndimage.convolve(array, pattern)

# create list with data coordinates from convolved array
data = list()
for j in range(conv_array.shape[0]):
    for k in range(conv_array.shape[1]):
        for l in range(conv_array.shape[2]):
            if conv_array[j, k, l] != 0:
                data.append([j, k, l])

data = np.asarray(data)

tri = scipy.spatial.Delaunay(data)

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
ax.hold(True)
ax.plot_trisurf(data[:, 0], data[:, 1], data[:, 2], triangles=tri.simplices)
plt.show()

它的作用:我创建了一个空数组,我用一个由 1 表示的正弦波填充该数组。我将该数组与一个定义大小的矩形数组进行卷积,这给了我一个更厚的空间正弦波。然后将数组转换为坐标形式,以便可以使用 Delaunay 三角剖分对其进行三角剖分。我得到的是这样的:

Plot

正如您所见,三角测量有点工作,但它填充了正弦波幅度之间的空间。有没有办法去除填充的空间?还是从一开始就阻止它这样做?正弦波在末端也看起来不对,我不知道为什么。这甚至是实现我想要做的最好的方法吗?

对 .vtk 文件的解析应该没有问题,但我首先需要一个干净的结构。提前感谢您的任何帮助!

【问题讨论】:

    标签: python multidimensional-array mesh triangulation delaunay


    【解决方案1】:

    我不会重新发明轮子并独自完成所有这些。而不是这样,使用 python-vtk 和 paraview(这是一个 3D 数据的后处理应用程序)为您进行三角测量。 “只需”创建点并在该应用程序中完成其余的工作。

    我对 3D 打印知之甚少,但我对 STL 和 VTK 有相当的了解。手动操作很痛苦,VTK 库有has some nice Python examples 和专用的STLWriter。您只是需要了解 VTK 的工作流程以及它如何在内部进行管理。这就是paraview 派上用场的地方。它使您能够记录您在 GUI 中执行的操作并显示它们并在 Python 中显示它们。了解它的内部工作方式非常棒。

    【讨论】:

    • 感谢您的洞察!我之前考虑过使用 VTK,但无法完全理解如何创建我想要的几何图形。但是您基本上是说,我创建点云的方式还可以,但是 VTK 可以更好地处理三角剖分?
    • 说实话,我还没有深入研究过你的方法。但我知道科学计算界有人使用 VTK 和 paraview(完全基于 VTK)来可视化比你的数量级大的点云,并用它做比三角测量更复杂的事情。我会试一试,因为它已经准备好使用,您不必重新实现轮子。如果它不起作用,您可以无论如何都回退。三角测量在 VTK 中工作得非常好。也许您必须将点云分成不同的输入。
    • 好的,我试试VTK。如果我有任何进展,我会更新我的帖子并将您的帖子标记为答案。
    【解决方案2】:

    最后我得到了非常接近我想要的东西。如果有人对答案感兴趣:

    我没有使用点云方法,而是使用 Python 深入研究了 VTK(学习起来很痛苦,但有很多功能)。

    我的算法基本上是这样的:

    1. 首先将正弦波近似为简单的三角波。
    2. 将波的 x、y 和 z 坐标输入到 vtkPoints 对象中
    3. 使用 vtkParametricSpline 获得平滑波
    4. vtkSplineFilter 控制波浪的平滑度
    5. vtkTubeFilter 从线路创建卷
    6. vtkTriangleFilter 用于网格划分
    7. vtkSTLWriter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 2020-08-07
      • 2012-01-08
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 2013-02-25
      相关资源
      最近更新 更多