simples python algoritmo necessário para encontrar caixa delimitadora de malhas a partir de um arquivo OBJ
Pergunta
Eu estou tentando uma embalagem problema usando Python e arquivos OBJ.Eu sou um iniciante em python, e não tem a certeza de como manipular o arquivo OBJ vértices para encontrar a melhor caixa delimitadora.Qualquer exemplo de código python para me começar?Aqui está uma simples caixa de arquivo OBJ começar com o que eu vou precisar para caber dentro de uma vasilha maior.Em suma, pode o objecto X caber em objeto de Y.Em seguida, em última análise, como muitos x pode caber em Y com a mais melhor solução, mas que de forma mais tarde.
Aqui está o .Arquivos OBJ para a pequena e caixas maiores Pequeno:
# 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/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
Caixa maior:
# 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 11/11/11 12/12/12 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
Solução
Primeiro a responder a pergunta no título:
- Carregar cada arquivo de objeto como uma lista de vértices, eu suponho que você já hsve algum código para carregar .obj arquivos em python (se não, você pode ajustar esta loadObj() função, por exemplo, fazer devolver os verts variável)
- para cada objeto, calcule a caixa delimitadora, por exemplo:
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))
Agora, para testar se um objeto de "ajustes" no outro.Basicamente, você quer saber se uma caixa delimitadora é igual ou menor do que os outros em todas as dimensões, como eu entendo você.Assim,
- Calcular para cada caixa delimitadora de seu tamanho em x, y e z de dimensão, por exemplo:
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)
Boa sorte!
Outras dicas
Você vai querer para iterar sobre os obj dados à procura de " v e verificando se o seguinte x, y e z as coordenadas de gravação e o maior e o menor valor a cada vez que você encontrar.O código a seguir imprime o maior e o menor valor para cada dimensão e, em seguida, dá-lhe a caixa delimitadora de que
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))
E aqui está a saída de eu chegar
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
Espero que faça sentido