OBJファイルからのメッシュの境界ボックスを検索するのに必要な単純なPythonアルゴリズム

StackOverflow https://stackoverflow.com//questions/11660051

  •  11-12-2019
  •  | 
  •  

質問

Pythonファイルとobjファイルを使用してパッキングの問題を試しています。私はPythonの初心者で、OBJファイルの頂点を操作して最適な境界ボックスを見つける方法がわかりません。私を始めたサンプルのPythonコード?これは、より大きなコンテナに収まる必要があるのを始めるためのシンプルなボックスOBJファイルです。要するに、オブジェクトXはオブジェクトYにフィットすることができます。それから最終的には最適な解決策でyがYに収まることができるが、それは後で行うことができます。

小型ボックスと大きいボックスのための.objファイル 小さい:

# Rhino
.

V -5 -5 0 V -5 -5 5 v 0~5 0 V 0 -5 5 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN 0 -1 0 VN 0 -1 0 VN 0 -1 0 VN 0 -1 0 F 4/4/4 2/2 1/2 1/1 3/3/3 v 0~5 0 V 0 -5 5 v 0 0 0 v 0 0 5 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN 1 0 0 VN 1 0 0 VN 1 0 0 VN 1 0 0 F 8/8/8 6/6/6 5/5 / 7 7/7/7 v 0 0 0 v 0 0 5 V -5 0 0 V -5 0 5 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN 0 1 0 VN 0 1 0 VN 0 1 0 VN 0 1 0 F 12/12/12 10/10/10 9/9/11/11. V -5 0 0 V -5 0 5 V -5 -5 0 V -5 -5 5 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN -1 0 0 VN -1 0 0 VN -1 0 0 VN -1 0 0 F 16/16/16 14/14/14 13/13/13 15/15/15. V -5 -5 0 v 0~5 0 V -5 0 0 v 0 0 0 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN 0 0 -1 VN 0 0 -1 VN 0 0 -1 VN 0 0 -1 F 20/20/20 18/18 17/17 17/17 19/19/19. V -5 -5 5 V -5 0 5 V 0 -5 5 v 0 0 5 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN 0 0 1 VN 0 0 1 VN 0 0 1 VN 0 0 1 F 24/24/24 22/22/22 21/23/23 23/23/23

大きいボックス:

# Rhino
.

v 0 0 0 v 0 0 20 v 0 20 0 V 0 20 20 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN -1 -0 -0 VN -1 -0 -0 VN -1 -0 -0 VN -1 -0 -0 F 4/4/4 3/3/3 1/1/1 2/2/2 v 0 20 0 V 0 20 20 v 20 20 0 V 20 20 20 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN 0 1 0 VN 0 1 0 VN 0 1 0 VN 0 1 0 F 8/8/8 7/7/7 5/5/5 6/6/6 v 20 20 0 V 20 20 20 v 20 0 0 v 20 0 20 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN 1 0 0 VN 1 0 0 VN 1 0 0 VN 1 0 0 F 12/12/12 11/11/01 9/9/10 10/10 v 20 0 0 v 20 0 20 v 0 0 0 v 0 0 20 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN 0 -1 0 VN 0 -1 0 VN 0 -1 0 VN 0 -1 0 F 16/16/16 15/15/15 14/13/14 14/14/14. v 0 0 0 v 0 20 0 v 20 0 0 v 20 20 0 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN -0 -0 -1 VN -0 -0 -1 VN -0 -0 -1 VN -0 -0 -1 F 20/20/20 19/19/17 17/17 18/18 18/18. v 0 0 20 v 20 0 20 V 0 20 20 V 20 20 20 VT 0 0 VT 0 1 VT 1 0 VT 1 1 VN 0 0 1 VN 0 0 1 VN 0 0 1 VN 0 0 1 F 24/24/24 23/23/22 21/22/222/22/22

enter code here
.

役に立ちましたか?

解決

最初にあなたのタイトルの質問に答える:

  • 各オブジェクトファイルを頂点のリストとしてロードすると、Pythonで.objファイルをロードするためのコードをすでにHSVEにHSVEしていると思います(そうでない場合は、この LOADOBJ()関数たとえば、verts変数を返すようにします)
  • 各オブジェクトの場合は、境界ボックスを計算します。:
    def verts_to_bbox(verts):
        xs = [v[0] for v in verts]
        ys = [v[1] for v in verts]
        zs = [v[2] for v in verts]
        return (min(xs), max(xs), min(ys), max(ys), min(zs), max(zs))
    
    .

    は、1つのオブジェクトが他のオブジェクトを「フィット」した場合にテストになります。基本的に、私があなたを理解しているように、一方の境界箱がすべての寸法の他の寸法よりも等しいか小さいかどうかを知りたいです。 だから、

    • 各境界ボックスごとにx、y、zの大きさ、例えば、x、y、zのサイズ。:
      def bbox_size(bbox):
          # return tuple with sizes (dx, dy, dz)
          return (bbox[1] - bbox[0], bbox[3] - bbox[2], bbox[5] - bbox[4])
      
      def fits_bbox(bigbox, smallbox):
          bdx, bdy, bdz = bbox_size(bigbox)
          sdx, sdy, sdz = bbox_size(smallbox)
          # return True if small box fits in bigbox in all three dimensions
          return (sdx<bdx and sdy<bdy and sdz<bdz)
      
      .

      頑張って!

他のヒント

vsを探して、次のx yとzがそれに遭遇するたびに最も高い値と最も低い値を座標して録音するかどうかをチェックします。次のコードは、各ディメンションに対して最高値と最小値を印刷し、次にそのからバウンディングボックスを与えます。

obj = 'v -5 -5 0 v -5 -5 5 v 0 -5 0 v 0 -5 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 0 -1 0 vn 0 -1 0 vn 0 -1 0 vn 0 -1 0 f 4/4/4 2/2/2 1/1/1 3/3/3 v 0 -5 0 v 0 -5 5 v 0 0 0 v 0 0 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 1 0 0 vn 1 0 0 vn 1 0 0 vn 1 0 0 f 8/8/8 6/6/6 5/5/5 7/7/7 v 0 0 0 v 0 0 5 v -5 0 0 v -5 0 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 0 1 0 vn 0 1 0 vn 0 1 0 vn 0 1 0 f 12/12/12 10/10/10 9/9/9 11/11/11 v -5 0 0 v -5 0 5 v -5 -5 0 v -5 -5 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn -1 0 0 vn -1 0 0 vn -1 0 0 vn -1 0 0 f 16/16/16 14/14/14 13/13/13 15/15/15 v -5 -5 0 v 0 -5 0 v -5 0 0 v 0 0 0 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 0 0 -1 vn 0 0 -1 vn 0 0 -1 vn 0 0 -1 f 20/20/20 18/18/18 17/17/17 19/19/19 v -5 -5 5 v -5 0 5 v 0 -5 5 v 0 0 5 vt 0 0 vt 0 1 vt 1 0 vt 1 1 vn 0 0 1 vn 0 0 1 vn 0 0 1 vn 0 0 1 f 24/24/24 22/22/22 21/21/21 23/23/23'

elements = obj.split(' ')

x_min = 0.0
x_max = 0.0
y_min = 0.0
y_max = 0.0
z_min = 0.0
z_max = 0.0

i = 0

while i < len(elements):
    if elements[i] == 'v':
        #find min and max x value
        if float(elements[i + 1]) < x_min:
            x_min = float(elements[i + 1])
        elif float(elements[i + 1]) > x_max:
            x_max = float(elements[i + 1])

        #find min and max y value
        if float(elements[i + 2]) < y_min:
            y_min = float(elements[i + 2])
        elif float(elements[i + 2]) > y_max:
            y_max = float(elements[i + 2])

        #find min and max x value
        if float(elements[i + 3]) < z_min:
            z_min = float(elements[i + 3])
        elif float(elements[i + 3]) > z_max:
            z_max = float(elements[i + 3]) 

        #incriment the counter int by 4 as we know the next 4 elements are not a vertex
        i += 4

    else:
        i += 1

print 'x_min = ' + str(x_min)
print 'x_max = ' + str(x_max)   
print 'y_min = ' + str(y_min)
print 'y_max = ' + str(y_max)
print 'z_min = ' + str(z_min)
print 'z_max = ' + str(z_max)
print ''
print 'x_widh = ' + (str(x_max - x_min))
print 'y_widh = ' + (str(y_max - y_min))
print 'z_widh = ' + (str(z_max - z_min))
.

とエレベ

x_min = -5.0
x_max = 0.0
y_min = -5.0
y_max = 0.0
z_min = 0.0
z_max = 5.0

x_widh = 5.0
y_widh = 5.0
z_widh = 5.0
.

理にかなっていることを願っています

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top