2015-10-29 7 views
0

Этот сайт объясняет, как это сделать. http://drububu.com/miscellaneous/voxelizer/index.html Но я не могу понять, как его реализовать в коде.Может ли кто-нибудь предложить мне способ для voxelize 3d-модели?

+0

вы можете попытаться «растеризовать» объект в 3D, пересекая его с помощью плоскостей и заполняя плоскости кубами (так же, как растеризационный треугольник). –

+0

@willywonka_dailyblah это как разрезающий объект с разной плоскостью и нарисовать раздел на время и сохранение значений пикселей для расчета, где должны быть сделаны кубы? – spuemaacne

+0

вид, да. вызовет ответ в месяц –

ответ

0

Процедура:

1) Указать дваперпендикулярные направления, которые определяют ориентацию ваших кубов. Для удобства в этом контексте я буду выбирать их как оси X и Z соответственно. X будет нормалью плоскостей пересечения, а Y, Z будут двумерными координатными осями внутри плоскости.

enter image description here

2) Найти наименьшее аксиально-ориентированной кубоид (AABB), который окружает вашу сетку. Я уверен, что это будет довольно легко. В этом случае это даст вам 6 чисел, [X1, X2, Y1, Y2, Z1, Z2].

3) Скажите, что вы выбираете свои кубы для измерения S; пусть H = S/2. Начиная с X X = X1 + H, построим плоскость, имеющую нормальные (1, 0, 0) и центр (X, 0, 0).

enter image description here

4) Intersect сетку с ней. См. Здесь подробности о математике & реализация в C++: http://www.geometrictools.com/Documentation/ClipMesh.pdf

5) Возьмите края, которые являются результатом пересечения. Соедините их с, найдя пары, которые разделяют общую конечную точку, и вставляя их в некоторый двусвязный список. Таким образом, их можно упорядочить по пути.

enter image description here

6) Найти наименьший ограничивающий прямоугольник для этой формы, что дает вам [Y1, Y2, Z1, Z2]

7) Начиная с Z = Z1 + H, создать линию, которая идет от (X, Y1, Z) до (X, Y2, Z). Пересечь эту строку со всеми краями на пути, чтобы получить точки. Пройдите по списку ссылок, чтобы избежать повторного тестирования.

enter image description here

8) Сортировка очков, чтобы их Y-координаты. Вставка рода будет делать: https://en.wikipedia.org/wiki/Insertion_sort

9) для смежных пар точек, с Y-координаты А и В, начиная с Y = A + H, поместите куб размером S в (X, Y, Z) где X и Z относятся к предыдущим шагам.

10) Повтор со стадии (9) для каждой пары точек (как показано), в то время как не приращением Y от S каждый раз, до тех пор, Y> B - Н.

enter image description here

11) Повторяйте с шага (7), одновременно увеличивая Z на S, до тех пор, пока Z> Z2 - H.

12) Повторяйте с шага (3), одновременно увеличивая X на S, до тех пор, пока X> X2 - H.

И все готово.Отказ от ответственности: это, вероятно, НЕ эффективный способ, но, вероятно, это самый простой и простой способ реализации.