我正在尝试使用python和obj文件的包装问题。我是Python中的新手,不确定如何操纵OBJ文件顶点以找到最佳边界框。掌握我开始的任何样本代码?这是一个简单的box obj文件,首先,我需要安装到更大的容器中。简而言之,可以对象X适合对象Y.然后最终可以用最佳的解决方案拟合多少x,但是以后就可以了。

这是小型和更大框的.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 2014/14/13 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 2011/18/1719 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/7/7/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 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 2015/15/13 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/17 18/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/23 21/22/21 22/22/22

enter code here
.

有帮助吗?

解决方案

首先回答你标题中的问题:

  • 将每个对象文件加载作为顶点列表,我假设您已经hsve在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)
      
      .

      祝你好运!

其他提示

您将希望迭代OBJ数据,查找“v”和检查以下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