从头开始创建3D三角网格

时间:2016-03-01 10:14:17

标签: python multidimensional-array mesh triangulation delaunay

我要做的是创建一个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文件应该不会出现问题,但我首先需要一个干净的结构。提前感谢您的任何帮助!

2 个答案:

答案 0 :(得分:1)

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

我对3D打印知之甚少,但我知道我对STL和VTK的公平分享。手动执行并且VTK库具有has some nice Python examples和专用STLWriter是一件痛苦的事。 只是需要围绕VTK的工作流程及其内部管理方式。这是paraview非常方便的地方。它使您能够记录您在GUI中执行的操作并显示它们并在Python中显示它们 。这非常适合学习它内部工作的方式。

答案 1 :(得分:0)

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

我没有采用点云方法,而是使用python将自己挖到了VTK(这是一个很难学,但有很多功能)。

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

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