Преобразование массива 3D NumPy вокселов в файл STL

Учитывая 3D-логический массив, представляющий воксели, как он может быть преобразован в готовый к 3D-принтеру файл?

Конечная цель , которую я хотел бы достичь, состоит в том, чтобы напечатать 3D-форму, которую представляет массив numpy (True coding for fill this voxel, False for leave it empty).

Например, массив

[
    [
        [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.

, 👍4

Обсуждение

Не могли бы вы расширить свой вопрос, пожалуйста?.., @Greenonline

@Greenonline мне трудно понять, чего не хватает в моем вопросе (это мой первый вопрос здесь). Конечная цель, которую я хотел бы достичь, состоит в том, чтобы напечатать 3D-форму, которую представляет массив numpy ("True" кодирование для "fill this voxel", "False" для "leave it empty"). Дайте мне знать, если я все еще неясен., @Stephane Bersier

объясните в своем вопросе, что вы хотите, как формируется ваш логический массив, что помогает нам понять проблему., @Trish

@Trish Я добавил пример. Помогает ли это?, @Stephane Bersier

Похоже, OpenSCAD подойдет для этого., @T. M.

Вы также можете попробовать voxelfuse, @Konchog


3 ответа


Лучший ответ:

2

Я согласен с использованием OpenSCAD, но, поскольку в OpenSCAD сложно программировать, я бы использовал SolidPython, который является интерфейсом OpenSCAD с полным набором возможностей программирования на Python.

В качестве альтернативы вы можете использовать любой язык программирования для декодирования ваших массивов и генерации кода OpenSCAD для небольшой сети кубов (или вокселов).

Последняя возможность-напрямую сгенерировать файл STL. Я помог кое-кому сделать это, но мы обнаружили, что правила немного неинтуитивны. Мы использовали инструменты сетки для проверки результатов, как путем поиска сообщений об ошибках, так и путем отображения результата, чтобы увидеть, выглядит ли он так, как мы задумали.


,

Также возможно создавать файлы STL на Python с помощью [numpy-stl](https://pypi.org/project/numpy-stl/)., @Anderson Green

Подход OpenSCAD подойдет, если вы собираетесь использовать модель в стиле minecraft с низким разрешением и небольшим количеством кубов. Если воксели должны приближаться к гладкой поверхности с наилучшим разрешением принтера, то OpenSCAD потребуется несколько дней, чтобы отрисовать ее. Должен быть лучший способ сделать это!, @Nathaniel


1

Попробуйте voxelfuse.

    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')
,

Здорово, что вы опубликовали ответ с примером кода, тем самым расширив свой комментарий. Тем не менее, я не могу не задаться вопросом, поможет ли небольшое объяснение кода значительно, т. Е. Краткая информация о каждой строке (особенно о последних трех строках). Просто чтобы избавить людей от необходимости выходить и гуглить "Воксельмодель", чтобы понять, что происходит в коде., @Greenonline

@greenonline, иногда у меня мало времени, и мои ответы поспешны - вы правы, что это было минимально. Но Python (как правило) так прост в установке пакетов, и Google-наш друг для получения более подробной информации, в этом случае я подумал, что, возможно, это поможет спрашивающему. Я бы также предложил больше, если бы у меня было больше опыта работы с voxelfuse, но я обычно использую другие модули для своей 3D - работы.., @Konchog


1

Вы можете попробовать 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 может задавать ширинустроки, но я не вижу смысла использовать ее для двоичных данных.

Тем не менее, mayavi очень быстр, по крайней мере, по сравнению с voxelfuse. Возможно, для решения проблемы с размером потребуется некоторая постобработка.

Док

Эта функция также позволяет настраивать цвет и непрозрачность и т.д. См. Раздел Функции построения графиков - contour3d:

контур3d

mayavi.mlab.contour3d(*args, **kwargs)

Строит изоповерхности для трехмерного объема данных, предоставленных в качестве аргументов.

Сигнатуры функций:

контур3d(скаляры, ...) контур3d(x, y, z, скаляры, ...) скаляры-это трехмерные массивы чисел, дающие данные в сетке.

Если передаются 4 массива (x, y, z, скаляры), 3 первых массива задают позицию, а последний-скалярное значение. Затем предполагается, что массивы x, y и z были сгенерированы numpy.mgrid, другими словами, это 3D-массивы, позиции которых лежат на трехмерной ортогональной и равномерно распределенной сетке с ближайшим соседом в пространстве, соответствующим ближайшему соседу в массиве. Функция строит скалярное поле, предполагая , что точки расположены равномерно.

Аргументы ключевого слова:

  • цвет цвет объекта vtk. Переопределяет цветовую карту, если таковая имеется, если она указана. Это указано как триплет с плавающей точкой в диапазоне от 0 до 1, например (1, 1, 1) для белого цвета.

  • цветовая карта тип используемой цветовой карты.

  • контуры Целое число/список, задающее число/список контуров. Указание списка значений даст только запрошенные контуры , которые запрашиваются.

  • экстент [xmin, xmax, ymin, ymax, zmin, zmax] По умолчанию используется экстент массивов x, y, z. Используйте это, чтобы изменить размер создаваемого объекта.

  • рисунок Рисунок для заполнения.

  • ширина линии Ширина линий, если они используются. Должно быть, это поплавок. Значение по умолчанию: 2.0

  • назовите имя созданного объекта vtk.

  • непрозрачность Общая непрозрачность объекта vtk. Должно быть, это поплавок. По умолчанию: 1.0

  • reset_zoom Сбросит масштаб, чтобы разместить данные, недавно добавленные в сцену. По умолчанию установлено значение True.

  • прозрачность делает непрозрачность актера зависящей от скаляра.

  • vmax vmax используется для масштабирования цветовой карты. Если нет, будет использоваться максимум данных

  • vmin vmin используется для масштабирования цветовой карты. Если нет, будет использоваться минимум данных

Пример (запустите в ipython --gui=qtили в интерактивной оболочке mayavi2, дополнительную информацию смотрите в разделе Запуск сценариев 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 ```
,

Добро пожаловать в компанию 3D Printing SE и благодарим вас за ваш вклад. Не могли бы вы обобщить "Документ", на который вы ссылались, поскольку ссылки могут "умереть" со временем? Кроме того, когда у вас появится возможность, пожалуйста, пройдите [экскурсию], чтобы понять, как работает сайт и чем он отличается от других., @agarza