从头开始创建 3D 三角网格
Create 3D triangulated mesh from scratch
我想做的是创建一个 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()
它的作用:我创建了一个空数组,我用一个表示的正弦波填充它。我将该数组与定义大小的矩形数组进行卷积,这在 space 中为我提供了更粗的正弦波。然后将数组转换为坐标形式,以便可以使用 Delaunay 三角剖分对其进行三角剖分。我得到的是:
如您所见,三角测量有点奏效,但它填充了正弦波振幅之间的 space。有没有办法删除填充的spaced?还是从一开始就阻止它这样做?正弦波在末端看起来也是错误的,我不确定为什么。这甚至是实现我想要做的事情的最佳方法吗?
解析为 .vtk 文件应该不会出现问题,但我首先需要一个干净的结构。在此先感谢您提供任何帮助!
我不会重新发明轮子,我不会自己做所有的事情。而不是那样,使用 python-vtk 和 paraview(这是一个 post-处理 3D 数据的应用程序)为您进行三角测量。 "Just" 创建点并在该应用程序中完成其余部分。
我对 3D 打印知之甚少,但我对 STL 和 VTK 有一定的了解。手动操作很痛苦,而 VTK 库中的 has some nice Python examples and a dedicated STLWriter. You just need to wrap your head around the workflow of VTK and how it manages things internally. This is where paraview 非常方便。它使您能够记录您在 GUI 中执行的操作并显示它们并将它们显示在 Python 中。很高兴了解它的内部工作方式。
最后我得到了非常接近我想要的东西。如果有人对答案感兴趣:
我没有使用点云方法,而是使用 python 深入研究了 VTK(学习起来很痛苦,但有很多功能)。
我的算法基本上是这样的:
- 首先将正弦波近似为简单的三角波。
- 将波的 x、y 和 z 坐标输入 vtkPoints 对象
- 使用vtkParametricSpline得到平滑的波浪
- vtkSplineFilter 控制波形的平滑度
- vtkTubeFilter 从行
创建一个卷
- 用于网格划分的 vtkTriangleFilter
- vtkSTLWriter
我想做的是创建一个 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()
它的作用:我创建了一个空数组,我用一个表示的正弦波填充它。我将该数组与定义大小的矩形数组进行卷积,这在 space 中为我提供了更粗的正弦波。然后将数组转换为坐标形式,以便可以使用 Delaunay 三角剖分对其进行三角剖分。我得到的是:
如您所见,三角测量有点奏效,但它填充了正弦波振幅之间的 space。有没有办法删除填充的spaced?还是从一开始就阻止它这样做?正弦波在末端看起来也是错误的,我不确定为什么。这甚至是实现我想要做的事情的最佳方法吗?
解析为 .vtk 文件应该不会出现问题,但我首先需要一个干净的结构。在此先感谢您提供任何帮助!
我不会重新发明轮子,我不会自己做所有的事情。而不是那样,使用 python-vtk 和 paraview(这是一个 post-处理 3D 数据的应用程序)为您进行三角测量。 "Just" 创建点并在该应用程序中完成其余部分。
我对 3D 打印知之甚少,但我对 STL 和 VTK 有一定的了解。手动操作很痛苦,而 VTK 库中的 has some nice Python examples and a dedicated STLWriter. You just need to wrap your head around the workflow of VTK and how it manages things internally. This is where paraview 非常方便。它使您能够记录您在 GUI 中执行的操作并显示它们并将它们显示在 Python 中。很高兴了解它的内部工作方式。
最后我得到了非常接近我想要的东西。如果有人对答案感兴趣:
我没有使用点云方法,而是使用 python 深入研究了 VTK(学习起来很痛苦,但有很多功能)。
我的算法基本上是这样的:
- 首先将正弦波近似为简单的三角波。
- 将波的 x、y 和 z 坐标输入 vtkPoints 对象
- 使用vtkParametricSpline得到平滑的波浪
- vtkSplineFilter 控制波形的平滑度
- vtkTubeFilter 从行 创建一个卷
- 用于网格划分的 vtkTriangleFilter
- vtkSTLWriter