결론: 작업 중에는 .gltf로 두고 디버깅하다가, 3D Tileset에 넣을 때는 .glb로 패키징하는 패턴이 표준이다.
전체 아키텍처 구성 요소
구성
역할
비고
asset
glTF 버전·생성기 메타데이터
모든 파일의 첫 키
scene + nodes
씬 그래프 (DAG 아니고 트리)
카메라·라이트·메시 컨테이너
meshes + primitives
렌더링 대상 지오메트리
primitive = 1 draw call
accessors + bufferViews + buffers
데이터 3계층 — 의미·구간·바이트 분리
GPU 업로드 직결
materials + textures + images + samplers
PBR 머티리얼 + 텍스처 4단 분리
sampler 재사용 효율
skins + animations
본 애니메이션·키프레임
캐릭터
cameras
투영 정의
노드에 부착해서 사용
extensions
KHR_/EXT_/벤더 확장
3D Tiles 1.1의 핵심 메커니즘
각 구성은 JSON 최상위의 배열로 저장되고, 상호 참조는 항상 정수 인덱스로 한다. ID 문자열 검색이 필요 없어 O(1) 조회가 가능하다. 자세한 객체별 정의는 4.2 GLB 구조와 용어 참조.
씬 그래프 계층 — Mermaid
graph TD
A["glTF Root<br/>(asset · scene · scenes · ...)"]
A --> B["scenes[ ]<br/>씬 정의 배열"]
B --> C["scene = 0<br/>기본 씬 인덱스"]
C --> D["nodes[ ] — 노드 배열"]
D --> E["node<br/>transform + children"]
E --> F["children → 다른 node 인덱스"]
E --> G["mesh = m<br/>(선택)"]
E --> H["camera = c<br/>(선택)"]
E --> I["skin = s<br/>(선택)"]
G --> J["meshes[m]<br/>= primitives[ ]"]
J --> K["primitive<br/>(1 draw call)"]
K --> L["attributes<br/>POSITION·NORMAL·UV…"]
K --> M["indices<br/>(accessor 인덱스)"]
K --> N["material<br/>(material 인덱스)"]
L --> O["accessor[ ]"]
M --> O
O --> P["bufferView[ ]"]
P --> Q["buffer[ ]<br/>(raw bytes / BIN chunk)"]
N --> R["materials[ ]<br/>PBR 정의"]
R --> S["TextureInfo → textures[ ]"]
S --> T["images[ ]<br/>+ samplers[ ]"]
핵심: 위에서 아래로 참조 인덱스의 연쇄다. 위쪽은 “무엇을 그릴지”, 아래쪽은 “실제 바이트가 어디 있는지”를 담는다.
좌표계 규약
항목
glTF 규약
손잡이
오른손 (Right-handed)
위
+Y up
앞
−Z forward
단위
미터 (meter) 권장
⚠️ 3D Tiles와의 좌표계 차이: glTF는 Y-up, 3D Tiles는 Z-up · ECEF다. 3D Tiles 클라이언트(CesiumJS)는 자동으로 Y-up → Z-up 변환을 적용하므로, Blender에서 GLB를 export할 때는 반드시 Y-up으로 한다. 직접 변환한 데이터를 넣으면 모델이 90도 누워서 렌더된다. → 상세
포맷 비교 (GLB vs FBX·OBJ·COLLADA)
구분
GLB
FBX
OBJ
COLLADA
표준화
Khronos (ISO 오픈)
Autodesk (독점)
사실상 공개
Khronos (오픈)
PBR 재질
완벽 지원
독자 방식
미지원
기본 재질
파일 크기
최소 (Draco 가능)
큼
중간
매우 큼 (XML)
웹 최적화
최적
미흡
미흡
미흡
애니메이션
지원
완전 지원
미지원
지원
주 용도
웹·AR/VR 런타임·3D Tiles
DCC ↔ 게임 엔진
단순 교환
레거시 교환
지원 플랫폼 현황
플랫폼 / 도구
GLB 지원
비고
Three.js
✅
GLTFLoader
Babylon.js
✅
@babylonjs/loaders/glTF
CesiumJS
✅
Model.fromGltfAsync() · 3D Tiles 1.1 tile content
Unity
✅ 플러그인
GLTFast, UnityGLTF
Unreal Engine
✅ 플러그인
내장 glTF 임포터
Blender
✅
내장 Import/Export
iOS (SceneKit/RealityKit)
✅
USDZ 변환 권장
Android (ARCore)
✅
Filament 렌더러
웹 브라우저 (model-viewer)
✅
Google <model-viewer> 태그
주요 특징과 한계
특징 (강점)
특징
설명
GPU 친화
accessor 메타데이터를 그대로 typed array로 매핑 — 파싱 후 변환 불필요
표준 PBR
Metallic-Roughness 워크플로우로 엔진 간 결과 일치
확장 시스템
KHR_/EXT_로 신규 기능 추가 시 후방 호환 (extensionsRequired로 거부 가능)
단일 파일 옵션
GLB로 패키징 → 한 번의 HTTP 요청
검증 도구 표준화
glTF-Validator로 스펙 준수 자동 확인
3D Tiles 1.1 직접 호환
tile content가 곧 GLB
한계
한계
설명
편집 우선 아님
원본 작업 파일이 아닌 배포 포맷. 디자인 의도 일부 손실 가능
float32 정밀도
지구 규모 좌표는 정밀도 부족 → CESIUM_RTC 또는 tile.transform으로 보완 (상세)
BLEND 머티리얼 비용
알파 블렌딩은 정렬·성능 비용 큼. MASK 모드 우선 권장
확장 미지원 시 거부
extensionsRequired에 없는 확장을 로더가 모르면 거부 — Three.js·Cesium 지원 매트릭스 확인 필수
단일 자료원 강제
외부 .bin은 가능하지만 GLB는 BIN 청크 1개만 — 큰 자산은 분할 로직 별도 필요