2012-08-07 19 views
9

Necesito ayuda para comenzar en Python (que casi no sé) para voxelizar una malla 3D generada desde Rhino. La entrada de datos será un archivo .OBJ y también la salida. El objetivo final de este uso es encontrar la distancia más corta entre dos puntos dentro de un edificio. Pero eso es para más tarde. Por el momento, primero necesito voxelizar una malla 3D. La primitiva de voxelización puede ser simplemente un cubo simple.En Python, ¿cómo hago una malla en 3D?

hasta ahora puedo leer desde un analizador de archivos OBJ y fuera del obj analizado con los prefijos V, VT, VN, F despojados, y usando esas coordenadas para encontrar el cuadro delimitador del objeto 3D. ¿Cuál debería ser la forma correcta de voxelize la malla?

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() 

Respuesta

6

no lo han utilizado, pero se puede probar esto: http://packages.python.org/glitter/api/examples.voxelization-module.html

O esta herramienta: http://www.patrickmin.com/binvox/

Si usted quiere hacer esto por sí mismo tiene dos enfoques principales:

  • Una voxelización 'real', cuando se tiene en cuenta el interior de la malla, bastante complejo y se necesitan muchas operaciones de CSG. No puedo ayudarte allí.
  • Una 'falsa': simplemente vuexelice cada triángulo de su malla. Esto es mucho más simple, todo lo que necesita hacer es verificar la intersección de un triángulo y un cubo alineado con el eje. A continuación, sólo hace:

    for every triagle: 
        for every cube: 
         if triangle intersects cube: 
          set cube = full 
         else: 
          set cube = empty 
    

Todo lo que necesita hacer es poner en práctica una intersección BoundingBox-triángulo. Por supuesto, puede optimizar esos para bucles un poco :)

+2

Binvox se ha mudado a [esta ubicación] (http://www.patrickmin.com/binvox/) –

+0

Gracias por la información @A_A, he actualizado el enlace . – kolenda

Cuestiones relacionadas