1

我正在尝试使用 Python 和 OBJ 文件的打包问题。我是 python 新手,不知道如何操作 OBJ 文件顶点来找到最佳边界框。任何示例 python 代码让我开始?这是一个简单的盒子 OBJ 文件,我需要将其放入更大的容器中。简而言之,对象 X 是否可以适合对象 Y。那么最终有多少 x 可以以最优解适合 Y,但那是以后的事了。

这是小型和大型盒子 Small 的 .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/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 日 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

更大的盒子:

# 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/11 9/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 13/13/13 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/19 17/17/17 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/23 21/21/21 22/22/22

enter code here
4

2 回答 2

2

首先回答标题中的问题:

  • 将每个目标文件加载为顶点列表,我假设您已经编写了一些代码来在 python 中加载 .obj 文件(如果没有,您可以调整这个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))

现在开始测试一个对象是否“适合”另一个对象。基本上,您想知道一个边界框在所有维度上是否等于或小于另一个边界框,据我了解。所以,

  • 计算每个边界框在 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)

祝你好运!

于 2012-07-26T00:06:42.200 回答
1

您将需要遍历 obj 数据以查找“v”并检查以下 xy 和 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

希望这是有道理的

于 2012-07-26T00:08:14.493 回答