Получение гладкого solid .stl из voxel data

У меня есть (желательно в matlab) 3D-массив логических значений, описывающих воксельную структуру. Я хочу превратить это в файл .stl, но я не хочу, чтобы конечный результат имел неровные кубы.

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

Есть ли способ добиться этого?

, 👍1

Обсуждение

Я бы сказал, что с вашим алгоритмом марширующих кубов что-то не так. Из него должен получиться твердый предмет. Затем вы можете сгладить треугольники в этом твердом объекте., @bubba

@bubba Я думаю, что так оно и было. Мне нужно было окружить структуру символом 0, чтобы код распознал границу как грань твердого тела., @Gappy Hilmore


1 ответ


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

2

Воксели - это в значительной степени интерполяция точек данных, и вы можете сгладить их, только снизив точность воспроизведения. Почему? Потому что, приобретая воксель, вы уже потеряли верность. Позвольте мне привести вам пример.

Основы

Для наших основ мы возьмем окружность радиусом $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).

50 unit radius circle, overlay of a 50 unit square grid

Как вы видите, между кругом и квадратом есть область - это точность, которая теряется при преобразовании в воксели. В типичном преобразовании вокселей есть только один выбор: в какой момент заполнения воксель заполняется до 100%, а в какой - до 0%. Давайте предположим, что окружность там на самом деле представляет собой цилиндр высотой 50 единиц. В зависимости от того, где мы устанавливаем ограничение, теперь мы получаем одно из трех решений. Мы могли бы закончить с одним вокселем, используя 50% в качестве точки отсечения. Мы могли бы закончить фигурой с плюсом, используя 45% в качестве точки отсечения, или квадратом, используя любое заполнение выше 0% в качестве точки отсечения, как показано на следующем рисунке.

3 different voxel representations of the same cylinder of 50 unit radius using 50 unit wide cells

Это становится еще сложнее, если у вас нет перекрытия окружности и центра сетки, как в примере выше: существует воксельное решение "2x2x1", которое отражает по-разному выровненный круг с той же точкой отсечения, что и решение "1x1x1"! Этот круг (на следующем рисунке) центрирован вокруг $\{3.5 r,0.5 r\}$ и, таким образом, сдвинут на половину единицы вверх и вправо, так что его центр перекрывается с углом вокселей.

a shifted circle in the same grid

Утраченная верность не может быть восстановлена

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

В чем проблема

Таким образом, для компьютера практически невозможно определить, что когда-то было квадратом круга или квадратом до того, как все стало квадратами. Подумай... Цвета: Я фотографирую смайлик. Я разделяю его пополам, а затем обесцвечиваю верхнюю половину правой стороны до черно-белой и полностью насыщаю нижнюю. Это два разных способа полностью потерять информацию о цвете. В верхнем регистре вы сохраняете на одну информацию больше, потому что алгоритм преобразования всех цветов, кроме черного, в белый, сохраняет информацию о черном, в то время как алгоритм нижних частей сохраняет только внешнюю форму.

A Smiley, left side yellow and with a face, right side upper half desaturated to black and white, lower half oversaturated to only black.

Если у вас был только черно-белый смайлик, вы полностью потеряли информацию о его цвете. Если у вас есть только черный контур, вы потеряли также информацию о лице.

Вокселизация действительно теряет так много информации, в зависимости от настроек.

Реверсивная вокселизация - это интерпретация структуры вокселей

Компьютерный алгоритм не может просто инвертировать процесс. Однако существуют способы интерпретировать вокселизированный объект и попытаться воссоздать один из возможных объектов, которые привели к этому элементу, предполагая, что был использован алгоритм "любая заливка - это воксель".

Для этого вы импортируете модель в программное обеспечение, такое как Blender, уплотняете ее так, чтобы она представляла собой одну сетку без внутренних граней, а затем выполняете операцию сглаживания. Вы не получаете объект, который сгенерировал эту воксельную структуру, но вы получаете объект, который будет генерировать эту воксельную структуру.

Example of a solidified voxel-object undergoing a smoothing operation to generate one possible parent.

Насколько хороша интерпретация вокселей, зависит от разрешения, выбранного в начале. Если $r$ достаточно мал, то результирующая интерпретация вместе с некоторым художественным определением того, какие углы являются острыми, и некоторой ручной постобработкой (для которой требуется человеческий глаз) может привести к довольно хорошему приближению фактического объекта, который, по вашему мнению, приведет к структуре вокселей.


,