Получение гладкого solid .stl из voxel data
У меня есть (желательно в matlab) 3D-массив логических значений, описывающих воксельную структуру. Я хочу превратить это в файл .stl, но я не хочу, чтобы конечный результат имел неровные кубы.
Я попытался поместить массив вокселей в алгоритм маршевого куба, но результирующий STL не является сплошным, некоторые части представляют собой бесконечно тонкие листы. Я хочу, чтобы каждый воксел был представлен чем-то твердым.
Есть ли способ добиться этого?
@Gappy Hilmore, 👍1
Обсуждение1 ответ
Лучший ответ:
Воксели - это в значительной степени интерполяция точек данных, и вы можете сгладить их, только снизив точность воспроизведения. Почему? Потому что, приобретая воксель, вы уже потеряли верность. Позвольте мне привести вам пример.
Основы
Для наших основ мы возьмем окружность радиусом $R$. Это можно полностью описать следующим образом: $$x^2+y^2=R$$ Все решения этого дают нам точки на окружности.
Его представление в виде одного вокселя с разрешением $r$ - это представление квадрата. Квадрат с центром на $\{0,0\}$ мы будем называть вокселем разрешения $r$ вокруг этой координаты. Он определяется как $$x =\{0.5r,-0.5r\} \land y=\{-0.5r \to 0.5r\}$$ $$y=\{0.5r,-0.5r\}\land x=\{-0.5r \to 0.5r\}$$ Затем можно создать другие квадраты, просто добавив координаты центра соответствующей ячейки $\{a,b\}$ для $$x' =\{0.5r,-0.5r\}+a \land y'=\{-0.5r \to 0.5r\}+b$$ $$y'=\{0.5r,-0.5r\}+b\land x'=\{-0.5r \to 0.5r\}+a$$
Выглядит сложно? Верно, но вы видите: первая формула представляет собой окружность с радиусом $R$, содержащую площадь $A=\pi*R^2$. Последние два блока определяют квадрат длины $r$ и площади $A=r^2$. Благодаря продуманному позиционированию сетка с $R=r$ имеет свой $\{0,0\}$ Воксель, полностью содержащийся в этом круге. Или на картинке это выглядит так, используя $r=R=50$ (и, следовательно, диаметр 100).
Как вы видите, между кругом и квадратом есть область - это точность, которая теряется при преобразовании в воксели. В типичном преобразовании вокселей есть только один выбор: в какой момент заполнения воксель заполняется до 100%, а в какой - до 0%. Давайте предположим, что окружность там на самом деле представляет собой цилиндр высотой 50 единиц. В зависимости от того, где мы устанавливаем ограничение, теперь мы получаем одно из трех решений. Мы могли бы закончить с одним вокселем, используя 50% в качестве точки отсечения. Мы могли бы закончить фигурой с плюсом, используя 45% в качестве точки отсечения, или квадратом, используя любое заполнение выше 0% в качестве точки отсечения, как показано на следующем рисунке.
Это становится еще сложнее, если у вас нет перекрытия окружности и центра сетки, как в примере выше: существует воксельное решение "2x2x1", которое отражает по-разному выровненный круг с той же точкой отсечения, что и решение "1x1x1"! Этот круг (на следующем рисунке) центрирован вокруг $\{3.5 r,0.5 r\}$ и, таким образом, сдвинут на половину единицы вверх и вправо, так что его центр перекрывается с углом вокселей.
Утраченная верность не может быть восстановлена
Видите ли, вы потеряли большую точность при вокселизации. Все круги превратились в квадраты. Все квадраты также являются квадратами. Аналогично, все кривые между ними превратились в квадраты.
В чем проблема
Таким образом, для компьютера практически невозможно определить, что когда-то было квадратом круга или квадратом до того, как все стало квадратами. Подумай... Цвета: Я фотографирую смайлик. Я разделяю его пополам, а затем обесцвечиваю верхнюю половину правой стороны до черно-белой и полностью насыщаю нижнюю. Это два разных способа полностью потерять информацию о цвете. В верхнем регистре вы сохраняете на одну информацию больше, потому что алгоритм преобразования всех цветов, кроме черного, в белый, сохраняет информацию о черном, в то время как алгоритм нижних частей сохраняет только внешнюю форму.
Если у вас был только черно-белый смайлик, вы полностью потеряли информацию о его цвете. Если у вас есть только черный контур, вы потеряли также информацию о лице.
Вокселизация действительно теряет так много информации, в зависимости от настроек.
Реверсивная вокселизация - это интерпретация структуры вокселей
Компьютерный алгоритм не может просто инвертировать процесс. Однако существуют способы интерпретировать вокселизированный объект и попытаться воссоздать один из возможных объектов, которые привели к этому элементу, предполагая, что был использован алгоритм "любая заливка - это воксель".
Для этого вы импортируете модель в программное обеспечение, такое как Blender, уплотняете ее так, чтобы она представляла собой одну сетку без внутренних граней, а затем выполняете операцию сглаживания. Вы не получаете объект, который сгенерировал эту воксельную структуру, но вы получаете объект, который будет генерировать эту воксельную структуру.
Насколько хороша интерпретация вокселей, зависит от разрешения, выбранного в начале. Если $r$ достаточно мал, то результирующая интерпретация вместе с некоторым художественным определением того, какие углы являются острыми, и некоторой ручной постобработкой (для которой требуется человеческий глаз) может привести к довольно хорошему приближению фактического объекта, который, по вашему мнению, приведет к структуре вокселей.
- Экспорт STL как ASCII или двоичный?
- Объединение нескольких файлов STL
- Разделить/редактировать часть в FreeCAD?
- Файл слишком большой, чтобы открыть его в Tinkercad. Как уменьшить его?
- Как вычислить поверхность и объем большого количества файлов STL?
- Как уменьшить толщину стенки в файле STL?
- Как преобразовать 2d-изображение (карту глубины) в изогнутый браслет (и файл STL)?
- Эффективный способ создания "слепка" твердого объекта в мешмиксере?
Я бы сказал, что с вашим алгоритмом марширующих кубов что-то не так. Из него должен получиться твердый предмет. Затем вы можете сгладить треугольники в этом твердом объекте., @bubba
@bubba Я думаю, что так оно и было. Мне нужно было окружить структуру символом 0, чтобы код распознал границу как грань твердого тела., @Gappy Hilmore