멀티미디어/이미지(Image)
glTF - 장면과 노드 (Scenes and Nodes)
cepiloth
2018. 11. 19. 17:59
728x90
장면 (Scenes)
- 하나의 glTF 파일에는 여러 장면의 저장되어 있을 수 있습니다. 그러나 많은 경우에는 오직 하나의 장면만 존재하게 되며 이 장면 역시 기본 장면이 됩니다. 각 장면은 장면 그래프의 루트 노드의 색인되어 있는 노드 배열을 포함합니다.
- 다시 말하지만 서로 다른 계층 구조를 형성하는 여러 개의 루트 노드가 있을 수 있지만 대부분의 경우 장면에는 단일 루트 노드가 있습니다.
- 가장 간단한 가능한 장면 설명은 이전 절에서 이미 보여졌으며 단일 노드가 있는 단일 장면으로 구성됩니다.
1 2 3 4 5 6 7 8 9 10 11 | "scenes" : [ { "nodes" : [ 0 ] } ], "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.0, 20.0, 30.0 ], "rotation": [ 0.259, 0.0, 0.0, 0.966 ], "scale": [ 2.0, 1.0, 0.5 ] } | 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
반응형