Преобразование массива 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.
3 ответа
Лучший ответ:
Я согласен с использованием OpenSCAD, но, поскольку в OpenSCAD сложно программировать, я бы использовал SolidPython, который является интерфейсом OpenSCAD с полным набором возможностей программирования на Python.
В качестве альтернативы вы можете использовать любой язык программирования для декодирования ваших массивов и генерации кода OpenSCAD для небольшой сети кубов (или вокселов).
Последняя возможность-напрямую сгенерировать файл STL. Я помог кое-кому сделать это, но мы обнаружили, что правила немного неинтуитивны. Мы использовали инструменты сетки для проверки результатов, как путем поиска сообщений об ошибках, так и путем отображения результата, чтобы увидеть, выглядит ли он так, как мы задумали.
Также возможно создавать файлы STL на Python с помощью [numpy-stl](https://pypi.org/project/numpy-stl/)., @Anderson Green
Подход OpenSCAD подойдет, если вы собираетесь использовать модель в стиле minecraft с низким разрешением и небольшим количеством кубов. Если воксели должны приближаться к гладкой поверхности с наилучшим разрешением принтера, то OpenSCAD потребуется несколько дней, чтобы отрисовать ее. Должен быть лучший способ сделать это!, @Nathaniel
Попробуйте 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
Вы можете попробовать 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.
Примечание
Есть некоторые недостатки:
Появится окно, вы должны очистить его в своем коде, если хотите создать несколько моделей.
Восстановленная модель имеет формат .obj и может быть очень большой. Если вы присмотритесь к модели повнимательнее, то увидите, что на бодере сетка имеет 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
- Почему заполняется эта центральная область STL?
- Экспорт STL как ASCII или двоичный?
- Объединение нескольких файлов STL
- Разделить/редактировать часть в FreeCAD?
- Как создавать файлы изображений PNG из файлов STL?
- Можно ли преобразовать файл Las /Laz в файл STL или OBJ?
- Как конвертировать STL-файлы в PDF-чертежи?
- Файл слишком большой, чтобы открыть его в Tinkercad. Как уменьшить его?
Не могли бы вы расширить свой вопрос, пожалуйста?.., @Greenonline
@Greenonline мне трудно понять, чего не хватает в моем вопросе (это мой первый вопрос здесь). Конечная цель, которую я хотел бы достичь, состоит в том, чтобы напечатать 3D-форму, которую представляет массив numpy ("True" кодирование для "fill this voxel", "False" для "leave it empty"). Дайте мне знать, если я все еще неясен., @Stephane Bersier
объясните в своем вопросе, что вы хотите, как формируется ваш логический массив, что помогает нам понять проблему., @Trish
@Trish Я добавил пример. Помогает ли это?, @Stephane Bersier
Похоже, OpenSCAD подойдет для этого., @T. M.
Вы также можете попробовать voxelfuse, @Konchog