我要做的是创建一个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三角剖分对其进行三角测量。我得到的是:
正如你所看到的那样,三角测量有点起作用,但它填补了正弦波振幅之间的空间。有没有办法去除填充的间隔?或者首先阻止它做这些?正弦波在最后也看起来不对,我不知道为什么。这是否是实现我想做的最佳方法?
解析.vtk文件应该不会出现问题,但我首先需要一个干净的结构。提前感谢您的任何帮助!
答案 0 :(得分:1)
我不会重新发明轮子并自己做所有这些。而不是使用python-vtk和paraview(这是一个3D数据的后处理应用程序)来为您进行三角测量。 "只是"创建积分并在该应用程序中完成其余工作。
我对3D打印知之甚少,但我知道我对STL和VTK的公平分享。手动执行并且VTK库具有has some nice Python examples和专用STLWriter是一件痛苦的事。 只是需要围绕VTK的工作流程及其内部管理方式。这是paraview非常方便的地方。它使您能够记录您在GUI中执行的操作并显示它们并在Python中显示它们 。这非常适合学习它内部工作的方式。
答案 1 :(得分:0)
最后,我得到了一些非常接近我想要的东西。如果有人对答案感兴趣:
我没有采用点云方法,而是使用python将自己挖到了VTK(这是一个很难学,但有很多功能)。
我的算法基本上是这样的: