В Python, как вокселизировать 3D-сетку
Мне нужна помощь в начале работы в Python (о котором я почти ничего не знаю), чтобы вокселизировать 3D-сетку, сгенерированную из Rhino. Ввод данных будет a .OBJ файл и так будет вывод. Конечная цель этого использования-найти кратчайшее расстояние между двумя точками внутри здания. Но это на потом. А сейчас, мне нужно сначала voxelize 3D-сетку. В voxelization примитивно может быть просто обычный куб.
до сих пор я могу читать из парсера файлов OBJ и из проанализировал obj с V, VT, VN, F префиксами и используя эти координаты, чтобы найти ограничивающую рамку 3D-объекта. Каким должен быть правильный способ voxelize сетки?
import objParser
import math
inputFile = 'test.obj'
vList = []; vtList = []; vnList = []; fList = []
def parseOBJ(inputFile):
list = []
vList, vtList, vnList, fList = objParser.getObj(inputFile)
print 'in parseOBJ'
#print vList, vtList, vnList, fList
return vList, vtList, vnList, fList
def findBBox(vList):
i = 0; j=0; x_min = float('inf'); x_max = float('-inf'); y_min = float('inf');
y_max = float('-inf'); z_min = float('inf'); z_max = float('-inf');
xWidth = 0; yWidth = 0; zWidth =0
print 'in findBBox'
while i < len(vList):
#find min and max x value
if vList[i][j] < x_min:
x_min = float(vList[i][j])
elif vList[i][j] > x_max:
x_max = float(vList[i][j])
#find min and max y value
if vList[i][j + 1] < y_min:
y_min = float(vList[i][j + 1])
elif vList[i][j + 1] > y_max:
y_max = float(vList[i][j + 1])
#find min and max x value
if vList[i][j + 2] < z_min:
z_min = vList[i][j + 2]
elif vList[i][j + 2] > z_max:
z_max = vList[i][j + 2]
#incriment the counter int by 3 to go to the next set of (x, y, z)
i += 3; j=0
xWidth = x_max - x_min
yWidth = y_max - y_min
zWidth = z_max - z_min
length = xWidth, yWidth, zWidth
volume = xWidth* yWidth* zWidth
print 'x_min, y_min, z_min : ', x_min, y_min, z_min
print 'x_max, y_max, z_max : ', x_max, y_max, z_max
print 'xWidth, yWidth, zWidth : ', xWidth, yWidth, zWidth
return length, volume
def init():
list = parseOBJ(inputFile)
findBBox(list[0])
print init()
1 ответов
Я не использовал его, но вы можете попробовать это: http://packages.python.org/glitter/api/examples.voxelization-module.html
или этот инструмент:http://www.patrickmin.com/binvox/
Если вы хотите сделать это сами, у вас есть два основных подхода:
- "реальная" вокселизация, когда вы учитываете интерьер сетки-довольно сложный, и вам нужно много операций CSG. Я не могу помочь вам там.
-
"поддельный" - просто вокселизируйте каждый треугольник вашей сетки. Это намного проще, все, что вам нужно сделать, это проверить пересечение треугольника и выровненного по оси Куба. Тогда вы просто делаете:
for every triagle: for every cube: if triangle intersects cube: set cube = full else: set cube = empty
все, что вам нужно сделать, это реализовать пересечение BoundingBox-треугольника. Конечно, вы можете немного оптимизировать их для циклов:)