11

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

これまでのところ、OBJ ファイル パーサーから読み取り、解析された obj から V、VT、VN、F プレフィックスを取り除いて、それらの座標を使用して 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()
4

4 に答える 4

7

私はそれを使用していませんが、これを試すことができます: 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 と Triangle の交差を実装するだけです。もちろん、これらの for ループを少し最適化できます :)

于 2012-08-08T11:48:42.170 に答える