3D Tiles, 3D Models

코딩덕·2024년 5월 21일

💡 3D Model

3d Model이란?

삼차원 공간 내의 객체를 디지털로 표현한 것
점, 선, 면으로 구성되며, 이를 통해 실제 또는 상상 속의 물체를 시각적으로 구현할 수 있습니다.

3d model의 종류

GML

지리공간 데이터를 표현하고 교환하기 위한 XML 기반의 표준 언어

gml은 지리 정보 시스템(GIS)에서 사용되며, 지리적 특성을 기술하고 교환하기 위한 표준화된 방법을 제공합니다. GML은 OGC에서 관리하며, 다양한 지리 데이터를 XML 형식으로 표현할 수 있도록 설계되었습니다.

CityGML

도시 및 도시환경에 관한 3D 모델의 표현 및 교환을 위한 표준 형식

CityGML은 OGC에서 제정한 지리 정보 표준 중 하나로 도시의 건물, 도로, 녹지지역, 수로 등 다양한 지리적 요소를 포함하는 3D 모델을 기술하고 교환하기 위한 XML 기반의 형식을 정의합니다.

obj

가장 오래되고, 기본적으로 사용되는 3d model 파일

obj는 3차원 오브젝트의 좌표를 기록하고, 각 점의 정보를 가지고 있습니다.

유명하고 잘 만들어진 obj파일은 인터넷에서 쉽게 구할 수 있기 때문에 obj파일을 이용한다면 여러 객체에 우리가 만든 효과를 적용 시켜 볼 수 있다는 장점이 있습니다.

3d model과 3d Tiles와의 관계

Cesium ion같은 다양한 도구와 소프트웨어를 통해
3D 모델을 3D Tiles 형식으로 변환하여 CesiumJS와 같은 플랫폼에서 대규모 3D 데이터를 효율적으로 스트리밍하고 렌더링하여 사용한다.

1. Cesium ion

3D 모델을 3D Tiles 형식으로 변환할 수 있는 클라우드 기반 서비스

2. 3D Tiles Tools

Cesium에서 제공하는 다양한 오픈 소스 도구를 사용하여
로컬에서 3D 모델을 변환할 수 있습니다.
이러한 도구들은 주로 Node.js 기반으로 작동합니다.



💡 3D Tiles

3d Tiles이란?

대규모 3D 지리공간 데이터를 웹 브라우저 및 기타 응용 프로그램에서 효율적으로 스트리밍하고 렌더링하기 위한 개방형 표준 포맷입니다.

Cesium에서 개발되었으며, 특히 스마트 시티, 가상 도시 모델, BIM(건물 정보 모델링), 점군 데이터, 텍스처가 있는 메시 등의 응용 분야에서 널리 사용됩니다.

(3d tiles 예시 - Cesium 3d-tiles-samples)

glTF이란?

glTF는 Khronos Group에서 개발한 3D 모델 포맷으로,
단일 3D 자산을 효율적으로 전송하고 로드하기 위한 json 형식의 표준 포맷입니다.

glTF - 단일 3D 모델을 효율적으로 전송하기 위해 설계
3D Tiles - 대규모 3D 지리공간 데이터를 계층적으로 관리하고 위해 설계

glb - glTF파일의 모든 기능을 포함하면서도, 바이너리 파일로 패키징되어 있어 사용과 배포가 용이


3d Tiles의 구성

3D Tiles는 주로 JSON 포맷의 메타데이터 파일(tileset.json)과 바이너리 포맷의 타일 데이터 파일(.b3dm, .i3dm, .pnts, .cmpt)로 구성됩니다.
tileset.json 파일은 타일의 계층 구조와 위치 정보를 포함하고 있으며, 각 타일의 데이터 파일은 실제 3D 모델 데이터를 포함합니다.

1. tileset.json(3D TileSet)

Tileset을 정의하는 JSON 파일
타일의 계층적 구조와 위치 정보를 포함하고 있는 JSON 포맷의 메타 데이터파일
(예: bounding volume, geometric error, transform)

타일셋의 구조(tileset.json)

{
  "asset": {
    "version": "1.0"
  },
  "geometricError": 500,
  "root": {
    "boundingVolume": {
      "region": [
        -1.31968, 0.698874, -1.31939, 0.699078, 0, 20
      ]
    },
    "geometricError": 200,
    "refine": "REPLACE",
    "children": [
      {
        "boundingVolume": {
          "box": [
            1215016.6262, -4736350.9587, 4081608.6655,
            104.1930, 0, 0,
            0, 89.7762, 0,
            0, 0, 60.8120
          ]
        },
        "geometricError": 50,
        "content": {
          "uri": "tile1.b3dm"
        },
        "children": [
          {
            "boundingVolume": {
              "sphere": [
                1215016.6262, -4736350.9587, 4081608.6655, 50
              ]
            },
            "geometricError": 0,
            "content": {
              "uri": "tile2.b3dm"
            }
          }
        ]
      }
    ]
  }
}
  • asset : Tileset에 대한 메타데이터
    • version: 3D Tiles 사양 버전,
    • extra: 기본 정보 외에 추가적인 메타데이터,
"asset": { "version": "1.0", 
           "extras": { "ion": { "georeferenced": true, "movable": false } } },
  • geometricError : 기하학적 오류
    타일의 간소화된 표현이 실제 지오메트리와 얼마나 차이가 날 수 있는지 정의
    (LOD전환을 제어하는 데 사용된다)
"geometricError": 500,
  • properties : 추가적 속성 정보 정의
    각 타일이나 데이터셋의 개별 요소에 대한 추가적인 속성 정보 정의
    • height: 높이를 나타내는 속성(최소값과 최대값 정의)
    • latitude: 위도를 나타내는 속성(최소값과 최대값 정의)
"properties": {
    "Height": { "maximum": 61, "minimum": 56.400001525878906 },
    "Latitude": { "maximum": 35.23832750028189, "minimum": 35.23798956609563 },
    "Longitude": { "maximum": 128.69152625372013, "minimum": 128.69112172978518 }
},
  • refine: 부모 타일과 자식 타일 간의 시각적 전환 제어
    • ADD: 부모 타일을 유지하면서 자식 타일 추가
    • REPLACE: 부모 타일을 자식 타일로 대체
"refine": "REPLACE",
  • root : 루트 타일 정보
    트리 구조의 루트 노드로, 하위 타일들을 포함하는 계층 구조의 시작점 정의

  • children : 하위 타일 정보
    타일의 하위 타일들을 나타내는 배열을 포함

  • boundingVolume: 타일의 경계 볼륨
    해당 타일이 공간 내에서 차지하는 영역 + LOD(Level of Detail) 전환을 효율적으로 처리할 수 있도록 도와줌

    • box: 축에 정렬된 직육면체를 사용하여 타일의 경계 범위 정의
    • sphere: 중심점과 반지름을 사용하여 구 형태의 경계 범위 정의
    • region: 지리 좌표를 사용하여 경계 지리영역 범위 정의
"boundingVolume": {
	"region": [
     	-1.31970047958984, 0.698859372802656,   // 서쪽 경도, 남쪽 위도
        -1.31964689107037, 0.698908197070392,   // 동쪽 경도, 북쪽 위도
         0.0, 20.0                              // 최소 고도, 최대 고도
     ]
 },
  • content: 각 타일의 실제 콘텐츠 데이터 지정
    해당 타일에 대한 실제 3D 모델 데이터 파일의 경로 지정
"content": {
  "uri": "파일경로"
}

2. 타일 데이터(3D Tile)

실제 3D 데이터가 포함된 바이너리 포맷 파일
가장 일반적인 것은 b3dm (Batch 3D Model)와 i3dm (Instanced 3D Model)이다.

  • .b3dm (Batched 3D Model): 여러 3D 모델을 하나의 타일에 배치하여 효율적으로 저장

  • .i3dm (Instanced 3D Model): 3D 모델의 인스턴스를 저장하여 동일한 모델을 여러 위치에 효율적으로 렌더링

  • .pnts (Point Cloud): 포인트 클라우드 데이터를 저장

  • .cmpt (Composite): 다양한 형식의 데이터를 하나의 타일로 결합

  • .vctr (Vector Data): 벡터 데이터를 3D 공간에 표현하는 데 사용
    (주로 도로, 경계선 등 선형 데이터를 3D로 시각화할 때 사용)

  • .geom (Geometry): 기하학적 데이터를 저장하며, 3D 모델의 기본 형상을 표현


.b3dm 파일의 구조

  1. 헤더 : 파일의 메타데이터를 포함

  2. JSON 바디 : 3D 모델의 메타데이터를 포함

  3. 바이너리 바디 : 실제 3D 모델 데이터를 포함

00 00 62 33 64 6d 01 00 00 00 00 00 78 00 00 00  // 헤더
12 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00
7b 22 49 4e 53 54 41 4e 43 45 53 5f 4c 45 4e 47  // Feature Table JSON
54 48 22 3a 31 30 2c 22 50 4f 53 49 54 49 4f 4e
22 3a 7b 22 62 79 74 65 4f 66 66 73 65 74 22 3a
30 7d 7d 00 00 00 00 00 00 00 00 00 00 00 00 00  // Feature Table Binary
7b 22 68 65 69 67 68 74 22 3a 7b 22 62 79 74 65  // Batch Table JSON
4f 66 66 73 65 74 22 3a 30 2c 22 63 6f 6d 70 6f
6e 65 6e 74 54 79 70 65 22 3a 22 46 4c 4f 41 54
22 2c 22 74 79 70 65 22 3a 22 53 43 41 4c 41 52
22 7d 7d 00 00 00 00 00 00 00 00 00 00 00 00 00  // Batch Table Binary
67 6c 54 46 20 02 00 00 20 00 00 00 00 00 00 00  // GLTF Header
0b 00 00 00 4e 4f 44 45 00 00 00 00 00 00 00 00


(추가) LOD란?

객체나 지형의 세부 수준을 조절하여 성능과 시각적 품질을 균형 있게 유지하는 기술

LOD는 모델이나 데이터의 복잡성을 단계별로 다양화하여, 사용자가 가까이 있는 객체는 높은 세부 수준을, 멀리 있는 객체는 낮은 세부 수준을 렌더링하게 합니다.

  • LOD1 => 극도로 단순화된 기하학적 구조(높이만 있는 건물)

  • LOD2 => 단순화된 기하학적 구조(건물 이미지를 포함)

  • LOD3 => LOD2랑 비슷

  • LOD4 => 중간 정도의 기하학적 구조(방 구조,창문 등)

  • LOD5 => 매우 상세한 기하학적 구조(섬세한 디테일과 복잡한 메쉬 구조)

0개의 댓글