1

我在 python 中生成二维二进制形状。之后,我希望将它们转换为 3D STL 文件以进行 3D 打印。这种作品,但仅限于“简单”的形状,如三角形和正方形。对于更复杂的形状,我得到以下 Shape : 形状(我想要这个在 3D 模型/STL 中)

我的代码生成的 STL 模型

所以我们可以看到它有点像二进制图像,但有更多的“伪影”。我用:

  • delaunay三角剖分(来自scipy)
  • numpy-stl 用于生成 stl 文件(需要顶点 + 面来生成,这就是三角剖分的原因)
  • numpy 保存/加载我的形状

这是我的代码:

import numpy as np
from scipy.spatial import Delaunay
from stl import mesh

from numpy import loadtxt

def load_shape(id):
    return loadtxt("../shapes/shape_{}.shape".format(id))

def extract_vertices(shape):
    arr = []
    for ix, x in enumerate(shape):
        for iy, y in enumerate(x):
            if y == 0:
                arr.append([ix, iy])
    return np.array(arr)

def vertices_2d_to_3d(vertices, z=10):
    x, y = vertices.shape
    new = np.zeros((x*2, y + 1))
    for i, v in enumerate(vertices):
        new[i] = [v[0], v[1], 0]
        new[x+i] = [v[0], v[1], z]
    return new

shape = load_shape(4)
vertices = extract_vertices(shape)
vertices = vertices_2d_to_3d(vertices, 10)

tri = Delaunay(vertices)
faces = tri.convex_hull

ms = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(faces):
    for j in range(3):
        ms.vectors[i][j] = vertices[f[j],:]

ms.save('shape.stl')

谁能给我一些关于如何摆脱这些“伪影”并告诉 delaunay 三角剖分不要连接不在形状中的顶点的提示?

4

2 回答 2

3

Delaunay 的一个特点是它总是会从一组样本点产生一个凸多边形。因此,如果您使用 Delaunay,您将需要某种方式来了解哪些三角形在您感兴趣的区域内,哪些在您感兴趣的区域之外。

为此,您可能会研究的一件事是约束德劳内三角剖分 (CDT)。一些 Delaunay 实现允许您根据非自相交多边形指定约束,这些多边形可用于指定约束的“内部三角形”和“外部三角形”。我不确定 scipy 是否支持这一点,但它的实现通常非常出色,所以如果它支持我也不会感到惊讶。

此外,您可能会发现 Delaunay 在您的多边形中产生了很多“瘦”三角形。由于您正在进行 3D 打印,因此您可能想找到一些修复这些问题的方法。您可以通过在网格中插入人工点(Steiner 点)来实现。这些可以从常规网格中任意获取,或者,如果您有支持它的 API,您可以将某种 Delaunay Refinement 应用于您的三角剖分。

除此之外,我想知道您要解决的问题是否不是真正构建 Delaunay,而是对多边形进行三角剖分。较早答案中引用的维基百科文章应该让您开始了解这一点。

于 2020-04-30T12:21:34.523 回答
1

您将必须编辑或预处理 2D 形状才能使三角测量起作用。请参阅有关多边形三角剖分的 Wikipedia 页面,并阅读有关单调和非单调多边形的部分。

于 2020-04-28T15:24:36.717 回答