간단한 파이썬 알고리즘은 obj 파일에서 메쉬의 경계 상자를 찾는 데 필요했습니다.

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

  •  11-12-2019
  •  | 
  •  

문제

Python 및 OBJ 파일을 사용하여 포장 문제를 시도하고 있습니다. 저는 Python의 초보자이며 최적의 경계 상자를 찾기 위해 OBJ 파일 정점을 조작하는 방법을 확실하지 않습니다. 샘플 파이썬 코드가 시작되기 위해? 다음은 간단한 상자 obj 파일이 있으므로 더 큰 컨테이너에 맞아야합니다. 간단히 말하면 X가 객체 Y에 적합 할 수 있습니다. 그런 다음 궁극적으로 y는 가장 최적의 솔루션으로 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/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 2004/24/24 22/22/222 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/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. 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/15/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
.

도움이 되었습니까?

해결책

먼저 질문에 대답하기 :

  • 각 객체 파일을 정점 목록으로로드하면, 이미 파이썬에서 .OBJ 파일을로드하기 위해 일부 코드를 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))
    
    .

    이제 다른 오브젝트가 다른 객체가 '적합한 경우 테스트를 수행합니다.기본적으로, 당신은 당신을 이해할 때 하나의 경계 상자가 모든 차원에서 다른 차원에서 다른 것보다 같거나 작거나 더 작지 않은지 알고 싶습니다. 그래서,

    • 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)
      
      .

      행운을 빕니다!

다른 팁

다음 X y와 z가 좌표를 좌우하고 좌표를 좌우하고 가장 높은 값을 좌표하고 가장 낮은 가치를 좌표하는지 확인하고 obj 데이터를 확인하고 확인하려는 경우가 있습니다.다음 코드는 각 차원에 대해 가장 높고 최저 값을 인쇄 한 다음 의 경계 상자를 제공합니다.

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))
.

와 heres 출력이

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