2012-08-07 58 views
9

Rhinoから生成された3Dメッシュをボクセル化するためのPython(私はほとんど何も知らない)を始める際に助けが必要です。データ入力は.OBJファイルになり、出力も同様になります。この用途の究極の目的は、建物内の2つのポイント間の最短距離を見つけることです。しかしそれは後であります。今のところ、3Dメッシュを最初にボクセル化する必要があります。ボクセル化プリミティブは単なる立方体であってもよい。Pythonで3Dメッシュをボクセル化するには

これまでのところ、V、VT、VN、F接頭辞を取り除いたOBJファイルパーサから、そして解析されたobjから3Dオブジェクトのバウンディングボックスを見つけるためにそれらの座標を使用して読み取ることができます。メッシュをボクセル化する適切な方法は何ですか?

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

答えて

6

私はそれを使用していないが、あなたはこの1つを試すことができます。http://packages.python.org/glitter/api/examples.voxelization-module.html

またはこのツール:http://www.patrickmin.com/binvox/

自分でこれをしたい場合は、次の2つの主要なアプローチがあります:

  • 実際のボクセル化は、メッシュの内部を考慮するとかなり複雑で、CSG操作が大量に必要になります。私はそこにお手伝いできない。
  • あなたのメッシュのすべての三角形をボクセル化してください。これははるかに簡単です。必要なのは、三角形と軸を合わせた立方体の交差をチェックするだけです。次に、あなただけの操作を行います。

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

すべてを行う必要がにBoundingBox-トライアングル交差点を実装することです。もちろん、ループのためにそれらを最適化することができます:)

+2

Binvoxは[この場所](http://www.patrickmin.com/binvox/)に移動しました –

+0

情報@A_Aありがとう、私はリンクを更新しました。 – kolenda

関連する問題