Преобразование 3D-модели в воксельное поле

Мне нужно написать код для преобразования массива квадов в воксельное поле. Заставить его работать должно быть легко, но сделать это быстро будет не так уж и тривиально.

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

редактирование: алгоритм должен также заполнить внутреннюю часть модели вокселями. Просто оболочка не подойдет.


person Hannesh    schedule 27.11.2010    source источник
comment
Может быть полезно уточнить, что вы подразумеваете под quad.   -  person Sven Marnach    schedule 27.11.2010
comment
Некоторый быстрый google для «вокселизации» показывает много вещей. Посмотрите на это cs.princeton.edu/~min/binvox   -  person Alexandre C.    schedule 27.11.2010
comment
@Sven в графике quad обычно означает форму, определяемую четырьмя копланарными вершинами.   -  person 3Dave    schedule 27.11.2010


Ответы (2)


Ссылка на вокселяцию, опубликованная @Alexandre C., выглядит хорошо.

Вот краткий обзор того, как мы решили эту проблему при преобразовании обычных четырехугольных/треугольных моделей в кубический массив значений индексов преломления/эпсилон для моделирования фотоники/ЭМ.

  1. Создайте BSP-дерево вашей сцены. (Да, действительно)
  2. Повторяйте с регулярными интервалами по X, Y, Z в вашей модели или пространстве решения. (Интервал по каждой оси должен быть равен желаемым размерам вокселя.)
  3. В каждой точке вашего цикла x/y/z сверяйте точку с BSP-деревом. Если он находится внутри объекта, создайте воксель в этой точке и установите его атрибуты (цвет, координаты текстуры и т. д.) на основе исходной модели (как указано в вашем узле BSP). (Совет по оптимизации: если ваш самый внутренний цикл расположен вдоль оси Y (вертикальной оси) и вы создаете ландшафт или поверхность, ориентированную по оси XZ, вы можете выйти из цикла Y всякий раз, когда вы создать воксель.)

  4. Сохранять

  5. Выгода!

Построение BSP — единственная полусложная часть (и она намного проще, чем кажется на первый взгляд), но она документирована во всей сети. Это будет работать практически для любой формы модели, а также даст вам красивое дерево, которое вы можете использовать, среди прочего, для обнаружения столкновений и определения видимости.

Также обратите внимание, что весь этот процесс должен происходить во время компиляции или с использованием специального инструмента (который, очевидно, создаст файл, содержащий дерево и поле вокселя, которые вы будете использовать во время выполнения). Если вы используете XNA, импортировать что-либо в конвейер контента довольно просто.

person 3Dave    schedule 27.11.2010
comment
Я должен был упомянуть ранее, но внутренняя часть модели также должна быть заполнена вокселями. Хотя могу ли я просто продолжать добавлять воксели после удара по полигону, пока мы не наткнемся на другой полигон, предполагая, что поверхность закрыта? - person Hannesh; 27.11.2010
comment
@ Ханнеш, да. BSP даст вам внутренний или внешний результат для каждой точки, которую вы проверяете. Нет необходимости прекращать создание вокселей, когда вы находитесь внутри модели, и вам не нужно знать, где заканчивается одна модель и начинается следующая. Преимущество этого подхода заключается в том, что для данного значения XYZ вам не нужно ничего знать о том, что происходит вокруг него. - person 3Dave; 27.11.2010
comment
Да неужели?! :D Это единственное, о чем я беспокоился больше всего. Мне также нужно иметь возможность генерировать небольшие фрагменты воксельного поля, с большой вероятностью, что этот фрагмент полностью лежит внутри модели. Раньше я не использовал BSP-деревья, но думаю, что они станут моим новым лучшим другом! - person Hannesh; 27.11.2010

Проверьте Марширующие кубы алгоритм. Я думаю, вам нужно изменить это в контексте вашей проблемы!;)

person Edward83    schedule 27.11.2010
comment
Я не могу представить, чтобы это работало для чего-то другого, кроме внешней оболочки модели. - person Hannesh; 27.11.2010