2012-08-07 23 views
9

Ho bisogno di aiuto per iniziare in Python (di cui non so quasi nulla) per voxelize una mesh 3D generata da Rhino. L'input di dati sarà un file .OBJ e così sarà l'output. Lo scopo ultimo di questo utilizzo è trovare la distanza più breve tra due punti all'interno di un edificio. Ma questo è per dopo. Per ora, devo prima voxelize una mesh 3D. La primitiva voxelization può essere solo un semplice cubo.In Python, come faccio a voxelize una mesh 3D

Finora riesco a leggere da un parser di file OBJ e fuori dall'oggetto analizzato con prefissi V, VT, VN, F, e usare quelle coordinate per trovare il riquadro di delimitazione dell'oggetto 3D. Quale dovrebbe essere il modo corretto di voxelize the mesh?

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

risposta

6

Non ho usato, ma si può provare questo: http://packages.python.org/glitter/api/examples.voxelization-module.html

O questo strumento: http://www.patrickmin.com/binvox/

Se si vuole fare questo da soli si hanno due approcci principali:

  • Una voxelization "reale", quando si prende in considerazione l'interno della mesh, è piuttosto complessa e sono necessarie molte operazioni CSG. Non posso aiutarti lì.
  • Uno 'falso' - solo voxelize ogni triangolo della mesh. Questo è molto più semplice, tutto ciò che devi fare è controllare l'intersezione di un triangolo e un cubo allineato sull'asse. Poi basta fare:

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

Tutto quello che dovete fare è quello di implementare un incrocio BoundingBox-triangolo. Naturalmente puoi ottimizzare quelli per loops un po ':)

+2

Binvox si è spostato in [questa posizione] (http://www.patrickmin.com/binvox/) –

+0

Grazie per le informazioni @A_A, ho aggiornato il collegamento . – kolenda