2016-06-10 4 views
0

제목이 다소 혼란스럽게 보일지 모르지만 여기서는 시나리오입니다. 블렌더에 간단한 수출을 쓰고 있는데 다음 정보가 있습니다. 큐브를 내보내려고합니다.면을 구성하는면과 모서리가 있고 꼭지점이 모서리를 구성합니다. 큐브를 생성하기 위해 정점을 시계 방향으로 할당하려고합니다. 기본적으로, 시계 방향으로 볼 때 위쪽 및 아래쪽 꼭지점이 첨부 된 이미지의 패턴으로 이동한다는 의미입니다. 그 얼굴을 구성하는 정점보다 얼굴을 만들어 가장자리 큐브와 검사의 얼굴을 모두 잡는 경우 enter image description here큐브의면을 구성하는 시계 방향 정점을 결정하십시오.

는 예를 들어, 나는 각 괄호는 가장자리와 두 정점 인으로 다음을 부여하고 그 그것을 만들 :

face 1 - (0, 1) (1, 2) (2, 3) (0, 3) 
face 2 - 4, 7) (6, 7) (5, 6) (4, 5) 
face 3 - (0, 4) (4, 5) (1, 5) (0, 1) 
face 4 - (1, 5) (5, 6) (2, 6) (1, 2) 
face 5 - (2, 6) (6, 7) (3, 7) (2, 3) 
face 6 - (0, 4) (0, 3) (3, 7) (4, 7) 

는 기본적으로 목표는

큐브를 만들기 위해 정점의 6 개 라인을 가지고, 예를 들어 0, 1, 2, 3 큐브 4, 5, 6, 7의 상단을 만들 것 바닥을 만들 것입니다. 그러나, 나는 순서의 왼쪽 상단에서 시작하는 시계 방향으로 꽤 많이 필요하다. 그것은 내가 붙어있는 곳이다. 누구든지 내가 어떻게 이것을 할 수 있는지 또는 모범을 줄 수 있는지 설명해 줄 수 있을까? 미리 감사드립니다!

+2

3D 공간에는 "시계 방향"과 같은 것이 없으며 어느 한면에서 평면도를 볼 수 있습니다. 여러분의 그림에서, 두 경우 모두 큐브의 몸체가 우리가보고있는 사각형 뒤쪽에 있다는 것을 의미합니까? 즉, 모니터의 평면보다 더 멀리 떨어져있는 것입니까? 즉, 큐브 바깥 쪽에서 위아래면을 보았습니까? –

+0

내 그림이 잘못되었을 수 있습니다. 기본적으로 큐브의 어떤 점 (예 : 왼쪽 위)을 선택하고 꼭지점 0으로 설정합니다. 거기에서 위의 순서로 큐브에 레이블을 지정하기 시작합니다. 그것은 그 특정한 점이어야한다는 것이 아니라, 내가 선택한 점 일뿐입니다. – uncoded

답변

0

좋아, 잘 모르겠지만 아래는 내가 생각하는 파이썬 코드이다. 모서리를 감안할 때 모든면을 일관된 방향으로 배치하려고 시도합니다. 주어진 얼굴의 방향은 큐브를 배치하여 해당 면만 볼 수있게하는 경우 정점이 시계 방향 순서로 나열되는 것과 같습니다.

FACE_EDGES = [ 
    [(0, 1), (1, 2), (2, 3), (0, 3)], 
    [(4, 7), (6, 7), (5, 6), (4, 5)], 
    [(0, 4), (4, 5), (1, 5), (0, 1)], 
    [(1, 5), (5, 6), (2, 6), (1, 2)], 
    [(2, 6), (6, 7), (3, 7), (2, 3)], 
    [(0, 4), (0, 3), (3, 7), (4, 7)] 
] 

# gets vertices of a face, but may be "clockwise" or                             
# "counterclockwise"                                     
def get_vertices_from_edges(edges): 
    verts = [edges[0][0]] 
    for i in range(3): 
     for a, b in edges: 
      if a == verts[-1] and b not in verts: 
       verts.append(b) 
       break 
      if b == verts[-1] and a not in verts: 
       verts.append(a) 
       break 
    return verts 

def get_face_vertices(face_edges): 
    face_verts = [] 
    for edges in face_edges: 
     face_verts.append(get_vertices_from_edges(edges)) 
    # orientations of vertices may not be correct yet                             

    orient_order = range(6) # the order in which to fix orientations of faces                       
    if face_verts[0][0] not in face_verts[1]: 
     # make sure the first two faces touch each other, so that all                         
     # subsequent faces will share an edge with a previously                          
     # oriented face                                    
     orient_order[1] = 2 
     orient_order[2] = 1 

    oriented_edges = set() 
    for face_index in orient_order: 
     verts = face_verts[face_index] 
     edges = zip(verts, verts[-1:] + verts[:-1]) 

     # make it so that if face A and face B share an edge, they                         
     # orient the shared edge in opposite ways                              
     needs_reverse = False 
     for a, b in edges: 
      if (a, b) in oriented_edges: 
       needs_reverse = True 
       break 
     if needs_reverse: 
      verts.reverse() 

     edges = zip(verts, verts[-1:] + verts[:-1]) 
     for a, b in edges: 
      oriented_edges.add((a, b)) 

    return face_verts 

print get_face_vertices(FACE_EDGES) 
# [[0, 1, 2, 3], [4, 7, 6, 5], [0, 4, 5, 1], [1, 5, 6, 2], [2, 6, 7, 3], [3, 7, 4, 0]]