멀티미디어/이미지(Image)
glTF - 최소 glTF 파일 (Minimal Gltf File)
cepiloth
2018. 11. 19. 16:17
728x90
- 다음은 최소한이지만 완전한 gltf asset 이며, 하나의 색인 된 삼각형을 포함 합니다. gltf 파일에 복사하여 붙여 넣을 수 있으며 모든 glTF 기반 응용 프로그램은 로드하고 렌더링 할 수 있어야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | { "scenes" : [ { "nodes" : [ 0 ] } ], "nodes" : [ { "mesh" : 0 } ], "meshes" : [ { "primitives" : [ { "attributes" : { "POSITION" : 1 }, "indices" : 0 } ] } ], "buffers" : [ { "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=", "byteLength" : 44 } ], "bufferViews" : [ { "buffer" : 0, "byteOffset" : 0, "byteLength" : 6, "target" : 34963 }, { "buffer" : 0, "byteOffset" : 8, "byteLength" : 36, "target" : 34962 } ], "accessors" : [ { "bufferView" : 0, "byteOffset" : 0, "componentType" : 5123, "count" : 3, "type" : "SCALAR", "max" : [ 2 ], "min" : [ 0 ] }, { "bufferView" : 1, "byteOffset" : 0, "componentType" : 5126, "count" : 3, "type" : "VEC3", "max" : [ 1.0, 1.0, 0.0 ], "min" : [ 0.0, 0.0, 0.0 ] } ], "asset" : { "version" : "2.0" } } | cs |
장면과 노드의 구조
- 장면은 gltf 에 저장된 장면 description의 시작점입니다. gtlf JSON 파일을 파싱 할 때 장면 구조체의 순회의 시작은 여기부터 시작 됩니다.
- 각 장면에는 노드라고 하는 노드객체의 색인되어 있는 배열이 있습니다. 이 노드는 장면 그래프 계층 구조의 루트 노드 입니다.
- 예제에서는 하나의 장면으로 구성됩니다. 이 예제에서는 인덱스가 0 인 노드 만이 노드를 참조합니다. 이 노드는 인덱스를 0을 갖는 유일한 메쉬를 참조합니다.
1 2 3 4 5 6 7 8 9 10 11 | "scenes" : [ { "nodes" : [ 0 ] } ], "nodes" : [ { "mesh" : 0 } ], | cs |
메쉬
- 메쉬는 장면(scene)에서 나타나는 실제 기하 객체로 표현 됩니다. 메쉬는 그 자체는 일반적으로 어떠한 속성도 가지지 않지만, 더 큰 모델을 위한 빌딩 블록 역할을 하는 mesh.primitive 오브젝트의 배열만을 포함합니다.
- 각 메쉬 프리미티브에는 메쉬가 구성하는 기하 정보에 대한 description이 포함됩니다.
- 이 예제는 단일 메쉬로 구성되어 있으며 단일 mesh.primitive 객체를 가집니다. 메쉬의 primitive 요소에는 속성 배열이 있습니다. 이것들은 메쉬 기하의 꼭지점 속성입니다. 그리고 이 경우에는 오직 위치 속성만 갖으며, 곡지점위 위치를 나타냅니다.
- 메쉬 primitive는 indices 속성으로 표시되는 인덱스 된 기하를 나타냅니다.
- 기본적으로 3개의 연속 된 인덱스가 하나의 삼각형의 꼭지점의 인덱스가 되도록 삼각형의 집합을 나타낸다고 가정합니다.
- 메쉬의 primitive의 실제 기하 정보는 속성과 색인에 의해 주어집니다. 이 둘은 accessor 객체를 참조하며, 이에 대해서는 아래에서 설명합니다.
1 2 3 4 5 6 7 8 9 10 | "meshes" : [ { "primitives" : [ { "attributes" : { "POSITION" : 1 }, "indices" : 0 } ] } ], | cs |
buffer, bufferView, accessor 의 개념
- 버퍼, 버퍼뷰 그리고 accessor 객체는 메쉬의 기본요소로 구성된 기하 데이터에 대한 정보를 제공 합니다.
- 버퍼(buffers)
- 버퍼는 고유한 의미가 없는 원시의 구조화 되지 않은 데이터 블록으로 정의합니다. 여기에는 데이터가 들어있는 외부 파일을 가리키는 URI 나 JSON 파일에서 직접 바이너리 데이터를 인코딩하는 데이터 URI 가 될 수 있는 URI가 들어 있습니다.
- 아래 예제 파일에서 두 번째 방법이 사용됩니다. 44 바이트 크기의 단일 버퍼가 있고 이 버퍼의 데이터가 URI로 인코딩 됩니다.
1 2 3 4 5 6 | "buffers" : [ { "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=", "byteLength" : 44 } ], | cs |
- 이 데이터는 삼각형의 인덱스와, 삼각형의 정점 꼭지점의 위치를 포함 합니다. 그러나 실제로 이 데이터를 메쉬 primitive 기하 데이터로 사용하려면, 이 데이터의 구조에 대한 추가 정보가 필요합니다. 이 구조체에 대한 정보는 bufferview 와 accessor 객체에 인코딩 되어 있습니다.
- 버퍼뷰(Buffer Views)
- 버퍼뷰는 전체의 raw 버퍼 데이터의 chunk 또는 slice 로 나타냅니다. 주어진 예제에서는 두 개의 버퍼 뷰가 있습니다. 둘다 동일한 버퍼를 참조합니다. 첫번째 버퍼뷰는 인덱스의 데이터를 포함하는 버퍼 부분을 참조합니다. 전체 버퍼 데이터를 참조하는 byteOffset 이 0 이고, byteLength 가 6 입니다.
- 두번 째 버퍼뷰는 꼭지점 위치가 포함 된 버퍼 부분을 참조합니다. byteOffset이 8 부터 시작하여 byteLength는 36 입니다. 즉, 전체 버퍼의 끝까지 확장 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | "bufferViews" : [ { "buffer" : 0, "byteOffset" : 0, "byteLength" : 6, "target" : 34963 }, { "buffer" : 0, "byteOffset" : 8, "byteLength" : 36, "target" : 34962 } ], | cs |
- Accessors
- 데이터를 구조화하는 두 번째 단계는 Accessors 객체입니다. 데이터 유형과 레이아웃에 대한 정보를 제공하여 버퍼뷰의 데이터를 해석해야 하는 방법을 정의 합니다.
- 예제에서는 두개의 accessors 객체가 있습니다.
- 첫 번째 Accessor 는 기하 데이터의 색인을 나타 냅니다. 이것은 인덱스의 로우 데이터를 포함하느 ㄴ버퍼의 일부인 인덱스를 0을 갖는 bufferView를 참조 합니다. 추가적으로 요소의 수와 유형 및 해당 componentType 을 지정 합니다. 이 경우에 3개의 스칼라 요소가 있으며 그 구성 요소 유형은 부호없는 short 형식을 나타내는 상수로 제공됩니다.
- 두 번째 accessor 는 정점 위치를 나타 냅니다. 여기에는 버퍼 데이터의 관련 부분에 대한 참조가 bufferView 에서 색인 1을 통해 포함 되며 count, type, component 속성은 3D 벡터의 세 요소가 있으며 각 요소는 float 구성 요소를 포함합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | "accessors" : [ { "bufferView" : 0, "byteOffset" : 0, "componentType" : 5123, "count" : 3, "type" : "SCALAR", "max" : [ 2 ], "min" : [ 0 ] }, { "bufferView" : 1, "byteOffset" : 0, "componentType" : 5126, "count" : 3, "type" : "VEC3", "max" : [ 1.0, 1.0, 0.0 ], "min" : [ 0.0, 0.0, 0.0 ] } ], | cs |
- 위에서 설명한 것 처럼 mesh.primitive 는 이제 색인을 사용하여 이러한 접근자를 참조 할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 | "meshes" : [ { "primitives" : [ { "attributes" : { "POSITION" : 1 }, "indices" : 0 } ] } ], | cs |
- asset description
- glTF 1.0 에서는 이 속성이 여전히 서택 사항이지만 이후 glTf 버전에서는 JSON 파일에 버전 번호가 포함 된 asset 속성이 있어야 합니다. 아래 예제는 asset 이 glTF 버전 2.0을 준수 한다고 말합니다.
1 2 3 | "asset" : { "version" : "2.0" } | cs |
- Reference
728x90
반응형