3D Tiles 1.0 vs 1.1
2022년 12월에 채택된 3D Tiles 1.1이 1.0과 어떻게 다른가. 핵심은 “b3dm/i3dm/pnts 같은 자체 바이너리 포맷 → glTF + 확장(Extension)” 으로의 전환이다.
핵심 요약
| 구분 | 내용 |
|---|---|
| 📖 정의 | OGC 3D Tiles 1.1 (22-025r4, 2022-12-17 채택) — 1.0의 후속 |
| 💡 핵심 | glTF 2.0을 콘텐츠로 직접 사용 + EXT_* 메타데이터 확장 + Implicit Tiling/Multiple Contents 코어 편입 |
| 🎯 대상 | 1.0 콘텐츠를 운영 중이거나, 새 파이프라인을 1.1로 설계 중인 팀 |
| ⚠️ 주의 | 유효한 1.0 tileset은 1.1 파서에서도 유효(하위 호환). 단, 1.1 신기능을 쓰려면 asset.version을 "1.1"로 명시 |
문서 탐색
목차
- 전체 변경점 요약
- glTF 직접 콘텐츠 사용
- glTF 메타데이터 확장 3종
- Implicit Tiling 코어 편입
- 메타데이터 계층 구조
- Multiple Contents
- 1.0 → 1.1 마이그레이션 주의점
- 렌더러 지원 현황
전체 변경점 요약
| 항목 | 1.0 | 1.1 |
|---|---|---|
| 기본 콘텐츠 포맷 | b3dm, i3dm, pnts, cmpt | glTF 2.0(.glb) 직접 |
| 레거시 포맷 상태 | 표준 포맷 | Deprecated (하위 호환 유지) |
| 메타데이터 | Batch Table (포맷별 내장) | 3D Metadata Spec (타일셋/타일/콘텐츠/피처 전 계층) |
| Implicit Tiling | 3DTILES_implicit_tiling 확장 | 코어 표준 (확장 불필요) |
| Multiple Contents | 3DTILES_multiple_contents 확장 | 코어 표준 |
| glTF 메타데이터 확장 | 없음 | EXT_mesh_features, EXT_structural_metadata, EXT_instance_features |
| 메타데이터 스키마 | 없음 | schema 객체 (클래스·속성 타입 정의) |
| 그룹 | 없음 | groups (콘텐츠 레이어 그룹핑) |
| 타일셋 메타데이터 | 없음 | metadata 최상위 필드 |
| 하위 호환성 | — | 유효한 1.0 tileset은 1.1에서도 유효 |
glTF 직접 콘텐츠 사용
1.0의 문제
1.0에서는 glTF를 항상 b3dm 같은 자체 래퍼 안에 포함해야 했다.
1.0 콘텐츠 흐름:
tileset.json → building.b3dm → [헤더 + Batch Table] → 내장 GLB
이 구조는 다음 문제를 만들었다:
- Blender, three.js 기본
GLTFLoader등 표준 glTF 툴체인이 b3dm을 직접 다룰 수 없음 - 같은 데이터를 일반 glTF로도 쓰고 3D Tiles로도 쓰려면 두 번 변환해야 함
- Khronos glTF 생태계의 발전(Draco, KTX2, meshopt 등)을 늦게 흡수함
1.1의 해결
content.uri가 직접 .glb를 가리킬 수 있다.
// tileset.json (1.1)
{
"asset": { "version": "1.1" },
"root": {
"content": { "uri": "building.glb" } // glTF 직접 참조
}
}1.1 콘텐츠 흐름:
tileset.json → building.glb (직접)
레거시 포맷 → 1.1 대체 매핑
| 1.0 포맷 | 1.1 대체 방법 |
|---|---|
| b3dm (배치 모델) | .glb + EXT_mesh_features + EXT_structural_metadata |
| i3dm (인스턴스) | .glb + EXT_mesh_gpu_instancing + EXT_instance_features |
| pnts (포인트 클라우드) | .glb (POINTS 프리미티브) + EXT_mesh_features |
| cmpt (컴포지트) | Multiple Contents (1.1 표준) |
glTF 메타데이터 확장 3종
1.0의 Batch Table을 대체하는 3개의 glTF 확장이 핵심이다.
EXT_mesh_features
지오메트리 요소(버텍스·텍셀)에 **식별자(Feature ID)**를 부여한다. Feature ID는 정수 배열이며, 이후 EXT_structural_metadata의 Property Table 인덱스로 사용된다.
// glTF 메시 프리미티브 예시
"extensions": {
"EXT_mesh_features": {
"featureIds": [
{
"featureCount": 100,
"attribute": 0, // FEATURE_ID_0 버텍스 속성 참조
"propertyTable": 0 // EXT_structural_metadata의 테이블 인덱스
}
]
}
}EXT_structural_metadata
Property Table(컬럼 기반 이진 배열)로 구조화 메타데이터를 저장한다. 스키마로 클래스·속성 타입을 먼저 정의하고, Property Table이 인스턴스별 값을 저장한다.
"extensions": {
"EXT_structural_metadata": {
"schema": {
"classes": {
"Building": {
"properties": {
"name": { "type": "STRING" },
"height": { "type": "SCALAR", "componentType": "FLOAT32" },
"floors": { "type": "SCALAR", "componentType": "UINT8" }
}
}
}
},
"propertyTables": [{
"class": "Building",
"count": 100,
"properties": {
"height": { "values": 0 } // bufferView 인덱스
}
}]
}
}Batch Table 대비 장점:
| 항목 | Batch Table (1.0) | EXT_structural_metadata (1.1) |
|---|---|---|
| 타입 시스템 | 느슨 (FLOAT, BYTE 등 단순 매핑) | 엄격 (UINT8, FLOAT64, ENUM, ARRAY, STRING) |
| 스키마 | 없음 | 명시적 클래스·속성 정의 |
| 계층 | 콘텐츠 내부 1단계 | 타일셋/타일/콘텐츠/피처 4계층 |
| 컬럼 저장 | 가능 | 가능 + bufferView 직접 참조 |
EXT_instance_features
EXT_mesh_gpu_instancing과 함께 사용. GPU 인스턴스마다 Feature ID를 부여해 인스턴스별 메타데이터 조회를 가능하게 한다.
인스턴스 기반 가로등 100개
→ EXT_mesh_gpu_instancing: 위치/회전/스케일 배열
→ EXT_instance_features: Feature ID 배열 (0~99)
→ EXT_structural_metadata: Feature ID → {type, installDate, ...}
Implicit Tiling 코어 편입
1.0에서는 3DTILES_implicit_tiling 확장으로만 사용 가능했다.
1.1에서는 코어 사양에 편입돼 확장 선언 없이 사용한다.
"implicitTiling": {
"subdivisionScheme": "QUADTREE",
"subtreeLevels": 4,
"availableLevels": 20,
"subtrees": {
"uri": "subtrees/{level}/{x}/{y}.subtree"
}
}subtree 파일은 3개의 availability bitstream을 가진다:
tileAvailability— 해당 좌표 타일 존재 여부contentAvailability— 콘텐츠 파일 존재 여부childSubtreeAvailability— 하위 subtree 파일 존재 여부
Implicit Tiling 자체의 개념은 1.1 문서의 Implicit Tiling 절 참고.
메타데이터 계층 구조
1.1은 4계층의 통합 메타데이터 모델을 제공한다.
Tileset 수준: tileset.json의 "metadata" 필드
└─ Tile 수준: 각 tile의 "metadata" 필드
└─ Content 수준: content의 "metadata" 필드
└─ Feature 수준: glTF 내 EXT_mesh_features + EXT_structural_metadata
모든 계층이 동일한 3D Metadata Specification의 클래스-속성 타입 시스템을 공유한다.
| 계층 | 예시 정보 |
|---|---|
| Tileset | 데이터셋 이름, 저작권, 생성일, 좌표계 |
| Tile | 이 타일이 속한 도시 구역명, 통계 |
| Content | 이 콘텐츠가 표현하는 레이어(건물 외벽, 지붕 등) |
| Feature | 건물 1동의 이름·층수·용도 |
Multiple Contents
1.0의 3DTILES_multiple_contents 확장이 1.1 코어로 편입됐다. 한 타일에 여러 콘텐츠를 동시에 묶을 수 있다.
// 1.1 타일 — contents 배열
{
"boundingVolume": { "box": [...] },
"geometricError": 10,
"contents": [
{ "uri": "building.glb", "group": 0 },
{ "uri": "annotation.glb", "group": 1 }
]
}groups 배열로 콘텐츠를 레이어처럼 그룹핑하고, 렌더러가 선택적으로 켜고 끌 수 있다.
| 활용 시나리오 | 예시 |
|---|---|
| 분리 가능한 데이터 결합 | 건물 외피(glb) + 실내 가구(glb) |
| 시각화 토글 | 외벽 / 구조 / 설비를 다른 group에 배치 |
| 점진적 다운로드 | 핵심 콘텐츠 먼저, 부가 콘텐츠 나중에 |
1.0 → 1.1 마이그레이션 주의점
주의 1 — b3dm/i3dm의 RTC_CENTER 처리
b3dm Feature Table의 RTC_CENTER(상대 좌표 중심)는 glTF에서 직접 지원하지 않는다.
마이그레이션 시 이 오프셋을 glTF node.translation에 반영해야 한다.
주의 2 — Batch Table → EXT_structural_metadata 타입 매핑
Batch Table은 타입 정보가 느슨하다 (FLOAT, BYTE 등). EXT_structural_metadata는 명시적 스키마가 필요하다.
3d-tiles-tools upgrade --targetVersion 1.1명령이 자동 변환을 시도한다.- 단, 배열 속성·중첩 오브젝트 같은 복잡한 타입은 수동 검토가 필요하다.
주의 3 — i3dm의 EAST_NORTH_UP 플래그
i3dm의 EAST_NORTH_UP Feature Table 플래그는 각 인스턴스의 방향을 WGS84 지표면 법선에 자동 정렬한다.
1.1 변환 시 EXT_mesh_gpu_instancing의 rotation 쿼터니언 배열로 명시적으로 변환해야 한다.
주의 4 — 하위 호환성
유효한 1.0 tileset은 1.1 파서에서도 유효하다.
asset.version: "1.0"인 파일을 1.1 뷰어가 로드하는 것은 문제 없다.- 단, 1.1 신기능(Implicit Tiling, 4계층 metadata, Multiple Contents)을 쓰려면
asset.version: "1.1"명시 + 콘텐츠 변환이 필요하다.
권장 마이그레이션 순서
1. 현재 1.0 tileset의 콘텐츠 통계 수집
(b3dm/i3dm/pnts 개수, Batch Table 속성 종류, 총 용량)
2. EXT_structural_metadata 스키마 작성
- 속성마다 명시적 타입 결정 (UINT8 / FLOAT32 / STRING / ENUM)
- 배열 속성·NULL 처리 정책 결정
3. 3d-tiles-tools 등으로 일괄 변환 (b3dm → glb)
- RTC_CENTER 보정 확인
- EAST_NORTH_UP 쿼터니언 변환 확인
4. 1.1 콘텐츠 검증
- validator로 schema 일치 확인
- 메타데이터가 누락되지 않았는지 sample 검사
5. 렌더러 호환성 테스트
- CesiumJS / 3DTilesRendererJS 양쪽에서 확인
- Property Table 조회가 정상 동작하는지 확인
렌더러 지원 현황 (2024–2025 기준)
| 렌더러 | 3D Tiles 1.1 지원 | 비고 |
|---|---|---|
| CesiumJS | 부분 지원 (진행 중) | EXT_mesh_features 분리 이후 업데이트 작업 (Issue #10089) |
| Cesium ion 클라우드 파이프라인 | glTF 타일링 지원 | b3dm/i3dm → glTF 변환 파이프라인 제공 |
| NASA-AMMOS 3DTilesRendererJS | 완전 지원 (2024-04) | EXT_structural_metadata, EXT_mesh_features, implicit tiling 플러그인 지원. v0.4.11(2025-07) |
| NYT three-loader-3dtiles | b3dm/pnts 중심, 1.1 미완 | 업데이트 활동 저조 |
| x3dom | 1.1 지원 준비 중 | GitHub Wiki에 로드맵 기술 |
| Unreal Engine (Cesium for Unreal) | 1.0 중심, 1.1 요청 존재 | Epic 포럼에 지원 요청 다수 (2024) |
CesiumGS 공식 블로그(2024-09-11)에 따르면, NASA-AMMOS/3DTilesRendererJS가 Cesium Ecosystem Grant(2024-04)로 1.1 메타데이터 확장과 데이터 오버레이 지원을 완성했다.
문서 탐색
참고 자료
- OGC 3D Tiles 1.1 공식 사양 (22-025r4) — 2022-12-17
- CesiumGS/3d-tiles CHANGES.md
- 3D Tiles 1.0 → 1.1 마이그레이션 체크리스트 (Issue #651)
- EXT_mesh_features 사양 (CesiumGS fork)
- EXT_structural_metadata 사양 (CesiumGS fork)
- EXT_instance_features 사양 (CesiumGS fork)
- CesiumGS/3d-tiles-tools (업그레이드 도구)
- NASA-AMMOS/3DTilesRendererJS
- Enhancements to the Three.js 3D Tiles Renderer — Cesium 블로그 — 2024-09-11