상세 컨텐츠

본문 제목

glTF - 장면과 노드 (Scenes and Nodes)

멀티미디어/이미지(Image)

by cepiloth 2018. 11. 19. 17:59

본문

728x90
반응형


장면 (Scenes)


  • 하나의 glTF 파일에는 여러 장면의 저장되어 있을 수 있습니다. 그러나 많은 경우에는 오직 하나의 장면만 존재하게 되며 이 장면 역시 기본 장면이 됩니다. 각 장면은 장면 그래프의 루트 노드의 색인되어 있는 노드 배열을 포함합니다.

  • 다시 말하지만 서로 다른 계층 구조를 형성하는 여러 개의 루트 노드가 있을 수 있지만 대부분의 경우 장면에는 단일 루트 노드가 있습니다.

  • 가장 간단한 가능한 장면 설명은 이전 절에서 이미 보여졌으며 단일 노드가 있는 단일 장면으로 구성됩니다.


1
2
3
4
5
6
7
8
9
10
11
  "scenes" : [
    {
      "nodes" : [ ]
    }
  ],
 
  "nodes" : [
    {
      "mesh" : 0
    }
  ],
cs




장면 그래프를 형성하는 노드(Nodes forming the scene graph)


  • 각 노드는 자식 노드의 인덱스를 포함하는 children 이라고 불리는 배열을 포함할 수 있습니다. 따라서 각 노드는 노드 계층 구조의 한 요소이며 함께 장면 그래프로 장면의 구조를 정의 합니다.




  • 장면에 주어진 각 노드는 순회하면서 모든 자식을 재귀적으로 방문하여 노드에 연결된 모든 요소를 처리 할 수 있습니다. 이 순회를 위한 단순화 된 의사 코드는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
traverse(node) {
    // Process the meshes, cameras, etc., that are
    // attached to this node - discussed later
    processElements(node);
 
    // Recursively process all children
    for each (child in node.children) {
        traverse(child);
    }
}
cs


  • 실제로는 탐색에 몇 가지 추가 정보가 필요합니다. 노드에 연결된 일부 요소 처리에는 노드가 연결되는 노드에 대한 정보가 필요합니다. 또한, 노드의 변환에 관한 정보는 순회 중에 누적 되어야 합니다.


Local and global transforms


  • 각 노드는 transfrom 을 가질 수 있습니다. 이러한 변환은 이동, 회전 및 스케일을 의미 합니다. 이 변환은 노드 자체와 모든 자식 노드에 연결된 모든 요소에 적용됩니다. 따라서 노드 계층 구조는 장면 요소에 적용되는 이동, 회전 및 확대 / 축소를 구조화 하는 것을 허용 합니다.

  • 노드의 로컬 변환에는 여러 가지 가능한 표현이 표현이 있습니다. 변환은 노드의 matrix 속성에 의해 직접 주어질수 있다. 행렬을 주요 열 순서로 나타내는 16 개의 부동 소수점 숫자 배열입니다.
  • 예를 들어, 다음 행렬은 (2, 1, 0.5)에 대한 스케이일 배율, x 축 주위로 약 30도 회전, (10, 20, 30) 대한 이동 변환을 나타 냅니다.  

1
2
3
4
5
6
7
8
"node0": {
    "matrix": [
        2.0,    0.0,    0.0,    0.0,
        0.0,    0.866,  0.5,    0.0,
        0.0,   -0.25,   0.433,  0.0,
       10.0,   20.0,   30.0,    1.0
    ]
}   
cs


  • 여기에 정의 된 행렬은 아래 그림과 같다.


  • 노드의 변환은 translation, rotation, 및 scale 속성을 사용하여 지정할 수도 있습니다. 약칭 하여 TRS 라고도 합니다.


1
2
3
4
5
"node0": {
    "translation": [ 10.020.030.],
    "rotation": [ 0.2590.00.00.966 ],
    "scale": [ 2.01.00.]
}
cs


  • 이러한 각 속성은 행렬을 만드는데 사용될 수 있으며, 이 행렬의 결과는 노드의 로컬 변환입니다.

  • 변환은 단지 x축, y축 그리고 z축 방향으로 이동만 포함합니다. 예를 들면 [10.0, 20.0, 30.0] 의 변환은 마지막 열로 포함하는 변환 행렬을 만들 수 있습니다. 


  • 회전은 4원수(quaternion)으로 주어진다. 4원수의 수학적 배경은 튜토리얼의 범위를 벗어난다. 예를 들어, 쿼터니언 [0.259, 0.0, 0.0, 0.966]은 x 축을 중심으로 약 30도 회전을 나타냅니다. 따라서이 쿼터니언은 회전 행렬로 변환 될 수 있습니다.




  • 스케일에는 x, y 및 z 축의 배율 인수가 포함됩니다. 대응하는 행렬은 이러한 스케일링 인수를 행렬의 대각선상의 엔트리로서 사용함으로써 생성 될 수있다.


  • 노드의 최종 로컬 변환 행렬을 계산할 때, 이 행렬들은 함께 곱해진다. 이러한 행렬을 올바른 순서로 곱하기를 수행하는 것이 중요합니다. 

  • 로컬 변환 행렬은 항상 M = T * R * S로 계산되어야하며, 여기서 T는 변환 부분의 행렬이고 R은 회전 부분의 행렬이고 S는 스케일 부분의 행렬입니다.


1
2
3
4
translationMatrix = createTranslationMatrix(node.translation);
rotationMatrix = createRotationMatrix(node.rotation);
scaleMatrix = createScaleMatrix(node.scale);
localTransform = translationMatrix * rotationMatrix * scaleMatrix;
cs


  • 로컬 변환 메트릭스의 최종 값은 아래와 같다.


  • 이 메트릭스는 노드에 주어진 scale, rotation, translation 속성에 따라 메쉬의 정점을 변환 시킬겁니다.

  • 노드의 전역 변환 (Global transforms of nodes)
  • JSON 파일의 표현에 관계 없이, 노드의 지역 변환은 4 x 4 행렬로 저장 될 수 있습니다. 노드의 전역 변환은 루트에서 해당 노드까지의 경로에 있는 모든 로컬 변환의 결과로 주어 집니다.


1
2
3
4
5
Structure:           local transform      global transform
root                 R                    R
 +- nodeA            A                    R*A
     +- nodeB        B                    R*A*B
     +- nodeC        C                    R*A*C
cs



  • Reference


728x90
반응형

관련글 더보기

댓글 영역