将 3D NumPy 体素数组转换为 STL 文件

3D打印 stl Python
2021-05-14 03:16:58

给定一个表示体素的 3D 布尔数组,如何将其转换为 3D 打印机就绪文件?

我想实现的终极目标是打印的3D形状的numpy的阵列代表(True编码填补了该体素False将其留空)。

例如,数组

[
    [
        [T, T, T],
        [T, F, T],
        [T, T, T]
    ],
    [
        [T, F, T],
        [F, F, F],
        [T, F, T]
    ],
    [
        [T, T, T],
        [T, F, T],
        [T, T, T]
    ]
]

将编码 1级 Menger 海绵

3个回答

我同意使用 OpenSCAD,但由于在 OpenSCAD 中编程很困难,我会使用SolidPython,它是OpenSCAD的前端,具有 Python 的完整编程能力。

或者,您可以使用任何编程语言来解码您的数组并为小立方体(或体素)网络生成 OpenSCAD 代码。

最后一种可能是直接生成一个 STL 文件。我曾帮助某人这样做过,但我们发现规则有点不直观。我们使用网格工具来检查结果,既通过查找错误消息,也通过显示结果来查看它是否符合我们的预期。

尝试体素。

    from voxelfuse.voxel_model import VoxelModel
    from voxelfuse.mesh import Mesh
    from voxelfuse.primitives import generateMaterials
    
    if __name__=='__main__':
    sponge = [
        [
            [1, 1, 1],
            [1, 0, 1],
            [1, 1, 1]
        ],
        [
            [1, 0, 1],
            [0, 0, 0],
            [1, 0, 1]
        ],
        [
            [1, 1, 1],
            [1, 0, 1],
            [1, 1, 1]
        ]
    ]

    model = VoxelModel(sponge, generateMaterials(4))  #4 is aluminium.
    mesh = Mesh.fromVoxelModel(model)
    mesh.export('mesh.stl')

你可以试试mayavi.mlab

用法

from mayavi import mlab
import numpy as np


def draw3d_mayavi(array, path):
    mlab.contour3d(array.astype(np.int32)) # a window would pop up
    mlab.savefig(path)
    mlab.clf() # clear the scene to generate a new one

mayavi 的重构是为了生成数组的 3D 热图模型,所以你必须输入一个带有 1 和 0 的数字。

笔记

有一些缺点:

  1. 将弹出一个窗口,如果您想制作多个模型,您必须在代码中清除它。

  2. 重建的模型是 .obj 并且可能非常大。如果您仔细观察模型,您会看到边界上的网格有 3 层。我猜这个程序假设有一些梯度。

  3. contour3d函数可以 set line_width,但我看不出将它用于二进制数据的任何意义。

然而,mayavi 非常快,至少与体素相比是这样。也许需要一些后处理来解决尺寸问题。

文件

此功能还可以设置颜色和不透明度等。请参阅绘图功能 - contour3d

轮廓3d

mayavi.mlab。轮廓3d ( *args, **kwargs )

为作为参数提供的 3D 数据量绘制等值面。

函数签名:

contour3d(scalars, ...) contour3d(x, y, z, scalars, ...) 标量是一个 3D numpy 数组,在网格上提供数据。

如果传递了 4 个数组 (x, y, z, scalars),则前 3 个数组给出位置,最后一个数组给出标量值。x、y 和 z 数组应该是由numpy.mgrid生成的,换句话说,它们是 3D 数组,其位置位于 3D 正交且规则间隔的网格上,空间中的最近邻与数组中的最近邻匹配. 该函数建立一个标量场,假设点是规则间隔的。

关键字参数:

  • colorvtk 对象的颜色。指定时覆盖颜色图(如果有)。这被指定为范围从 0 到 1 的浮点数三元组,例如 (1, 1, 1) 表示白色。

  • colormap 要使用的颜色图类型。

  • contours指定轮廓数/列表的整数/列表。指定值列表只会给出所要求的轮廓。

  • extent[xmin, xmax, ymin, ymax, zmin, zmax] 默认为 x, y, z 数组范围。使用它来更改创建的对象的范围。

  • figure 要填充的图。

  • line_width线条的宽度,如果有的话。必须是浮点数。默认值:2.0

  • name 创建的 vtk 对象的名称。

  • opacityvtk 对象的整体不透明度。必须是浮点数。默认值:1.0

  • reset_zoom重置缩放以适应新添加到场景中的数据。默认为真。

  • transparent 使演员的不透明度取决于标量。

  • vmaxvmax 用于缩放颜色图。如果没有,将使用数据的最大值

  • vminvmin 用于缩放颜色图。如果没有,将使用数据的最小值

示例(在ipython --gui=qt或 mayavi2 交互式 shell 中运行,有关详细信息,请参阅运行 mlab 脚本):


def test_contour3d():
    x, y, z = np.ogrid[-5:5:64j, -5:5:64j, -5:5:64j]

    scalars = x * x * 0.5 + y * y + z * z * 2.0

    obj = contour3d(scalars, contours=4, transparent=True)
    return obj ```