Этот сайт объясняет, как это сделать. http://drububu.com/miscellaneous/voxelizer/index.html Но я не могу понять, как его реализовать в коде.Может ли кто-нибудь предложить мне способ для voxelize 3d-модели?
ответ
Процедура:
1) Указать дваперпендикулярные направления, которые определяют ориентацию ваших кубов. Для удобства в этом контексте я буду выбирать их как оси X и Z соответственно. X будет нормалью плоскостей пересечения, а Y, Z будут двумерными координатными осями внутри плоскости.
2) Найти наименьшее аксиально-ориентированной кубоид (AABB), который окружает вашу сетку. Я уверен, что это будет довольно легко. В этом случае это даст вам 6 чисел, [X1, X2, Y1, Y2, Z1, Z2].
3) Скажите, что вы выбираете свои кубы для измерения S; пусть H = S/2. Начиная с X X = X1 + H, построим плоскость, имеющую нормальные (1, 0, 0) и центр (X, 0, 0).
4) Intersect сетку с ней. См. Здесь подробности о математике & реализация в C++: http://www.geometrictools.com/Documentation/ClipMesh.pdf
5) Возьмите края, которые являются результатом пересечения. Соедините их с, найдя пары, которые разделяют общую конечную точку, и вставляя их в некоторый двусвязный список. Таким образом, их можно упорядочить по пути.
6) Найти наименьший ограничивающий прямоугольник для этой формы, что дает вам [Y1, Y2, Z1, Z2]
7) Начиная с Z = Z1 + H, создать линию, которая идет от (X, Y1, Z) до (X, Y2, Z). Пересечь эту строку со всеми краями на пути, чтобы получить точки. Пройдите по списку ссылок, чтобы избежать повторного тестирования.
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 - Н.
11) Повторяйте с шага (7), одновременно увеличивая Z на S, до тех пор, пока Z> Z2 - H.
12) Повторяйте с шага (3), одновременно увеличивая X на S, до тех пор, пока X> X2 - H.
И все готово.Отказ от ответственности: это, вероятно, НЕ эффективный способ, но, вероятно, это самый простой и простой способ реализации.
вы можете попытаться «растеризовать» объект в 3D, пересекая его с помощью плоскостей и заполняя плоскости кубами (так же, как растеризационный треугольник). –
@willywonka_dailyblah это как разрезающий объект с разной плоскостью и нарисовать раздел на время и сохранение значений пикселей для расчета, где должны быть сделаны кубы? – spuemaacne
вид, да. вызовет ответ в месяц –