사용자 가이드

제 8 장 — 내보내기 형식

Simple Mode의 내보내기 형식 선택 — 6개의 형식 카드
Simple Mode의 내보내기 형식 선택 — 6개의 형식 카드
flowers-Bouquet에서 5K-Iter 학습 후 실시간 내보내기 형식 그리드 — 동적 크기 계산이 있는 모든 6개 카드 (PLY 742 KB 선택, SPZ 74 KB, glTF 708 KB, .splat 96 KB, Orbit Video ~Zero KB, Web Viewer 133 KB), 오른쪽에 이미 저장된 PLY가 있는 Export History
flowers-Bouquet에서 5K-Iter 학습 후 실시간 내보내기 형식 그리드 — 동적 크기 계산이 있는 모든 6개 카드 (PLY 742 KB 선택, SPZ 74 KB, glTF 708 KB, .splat 96 KB, Orbit Video ~Zero KB, Web Viewer 133 KB), 오른쪽에 이미 저장된 PLY가 있는 Export History

이미지에 보이는 것 (IP-clean 테스트 세트로 Bjoern의 합성 Blender Bouquet의 2 991 Gaussian, SH degree 3): 각 형식 카드 아래의 크기 정보는 현재 Gaussian Count와 형식 오버헤드에서 실시간으로 계산됩니다 — 하드코딩되지 않습니다. 2 991 Gaussian (SH degree 3) 에서 742 KB PLY, 74 KB SPZ (양자화를 통해 ~10× 작음), 708 KB glTF (KHR_gaussian_splatting 확장과 함께 거의 PLY 동등), 96 KB .splat (압축된 Gaussian당 24 바이트 형식) 가 생성됩니다. Orbit Video는 "~Zero KB"를 표시합니다. 크기는 MP4 인코딩 후에야 알려지기 때문입니다. Web Viewer (133 KB) 는 내장된 WebGL Viewer와 압축된 Splat 데이터가 있는 독립형 HTML 파일을 묶습니다 — Viewer 오버헤드 때문에 순수 .splat보다 큽니다. 오른쪽 Export History는 형식 핀과 Reveal in Finder 동작이 있는 이미 완료된 PLY 내보내기 ("training_20260527T211321Z.ply, 743 KB, 23:13") 를 나열합니다.

완료된 학습은 Gaussian Cloud를 제공합니다 — 함께 장면을 재구성하는 수십만에서 수백만의 3D Gaussian 분포의 모음. RadianceKit은 이 클라우드를 디스크에 쓰는 10가지 방법을 알고 있습니다. 그 중 6개는 순수 3D 데이터 형식 (PLY, Compressed PLY, SPZ, SOG, glTF, .splat) 이고, 1개는 클라우드를 완성된 HTML Viewer와 함께 묶고 (Web Viewer), 1개는 Orbit 카메라 이동에서 MP4 파일을 렌더링하고 (Orbit Video), 2개는 Gaussian 콘텐츠를 내보내지 않고 단지 다른 학습 파이프라인에서 재사용할 SfM 결과 (카메라 포즈와 거친 점 구름) 만 내보냅니다 (transforms.json + COLMAP Workspace).

어느 형식이 언제 적절한지는 목표에 따라 다릅니다. 품질 손실 없이 전체 데이터를 보관하려면 PLY를 사용합니다. 자체 사이트의 Web Viewer에는 보통 .splat이나 내장 Web Viewer로 충분합니다. 파일이 최소여야 한다면 SPZ나 SOG가 가치가 있습니다. Nerfstudio, Postshot 또는 Brush에서 SfM 결과를 재사용하려면 transforms.json과 COLMAP Workspace가 올바른 경로입니다.

모든 내보내기 기능은 "Export" 메뉴와 Simple Mode의 마지막 마법사 단계에 있습니다. 대부분의 형식은 완전히 Sandbox 호환이며 App Store 버전에서 작동합니다. SOG만이 외부 바이너리 (cwebp) 가 필요하며 App Store 빌드에 반드시 존재하지는 않습니다 — 자세한 내용은 E4 참고.

E1 — PLY (.ply)

위치

메뉴 바 → Export → 3D Formats → Export PLY… (⌘E). Simple Mode: 마법사 단계 Export → 형식 카드 "PLY". 크기: 일반적으로 100% (참조 값). 호환: SuperSplat, PolyCam, 모든 3DGS Viewer.

기술적 설명

PLY는 3D Gaussian Splatting의 표준 저장 형식입니다. RadianceKit은 표준화된 3DGS 속성 레이아웃이 있는 바이너리 Little-Endian 파일을 작성합니다: Gaussian당 3 성분 위치, 항상 0으로 설정된 3 노멀, 기본 RGB 색상용 3 DC SH 계수 (f_dc_0..2), 그 후 Kerbl 2023 논문에 정의된 transposed Channel-Major 배열 (먼저 모든 R 채널 계수, 그 다음 모든 G, 그 다음 모든 B) 의 최대 45개 추가 SH 계수 (f_rest_0..44), 그 다음 Logit Opacity (원본 사전 Sigmoid 값), 3개의 Log Space 스케일, 하나의 wxyz 쿼터니언 회전. 최대 내보낸 SH 정도는 사용자 희망과 실제로 학습된 정도의 최솟값으로 클램프됩니다. 기본값은 3 (45개의 Rest 계수). 쓰기 전에 Payload 크기가 64비트 정수로 계산되어 극도로 큰 Cloud에서 오버플로를 잡습니다. 파일은 원자적으로 작성되며, 큰 Cloud에서는 잠시 두 배의 디스크 공간을 점유합니다.

E2 — Compressed PLY (.ply)

위치

메뉴 바 → Export → 3D Formats → Export Compressed PLY…. Simple Mode: 형식 카드 "Compressed PLY". 크기: PLY 대비 약 10–20% (5~10배 압축). 호환: SuperSplat, PlayCanvas Engine, 웹 기반 Viewer.

기술적 설명

Chunked 양자화가 있는 PLY 형식의 PlayCanvas 변형. Gaussian이 256개 청크로 그룹화됩니다. 청크당 Position, Scale, Color의 Min/Max Bound가 헤더에 별도로 저장됩니다. 개별 Gaussian은 이러한 Bound에 대해 상대적으로 값을 참조하고 각각 32비트로 압축됩니다: Position과 Scale은 11-10-11 비트 패킹으로, Rotation은 2-10-10-10 비트 "Smallest-Three" 쿼터니언으로, Color는 8-8-8-8 RGBA로. 더 높은 SH 계수는 구성 요소당 8비트로만 양자화됩니다 (Gaussian당 shCoeffCount * 3 uchar). 형식 자체는 여전히 ASCII Header PLY이며 따라서 기본적으로 PLY 도구로 검증 가능하지만 Vertex Properties는 uint 필드로 선언됩니다. 압축을 최대화하기 위해 SH 정도는 기본적으로 0입니다 (Rest 계수 없음) — 더 높은 SH 정도는 명시적으로 선택할 수 있습니다.

E3 — SPZ (.spz)

위치

메뉴 바 → Export → 3D Formats → Export SPZ…. Simple Mode: 형식 카드 "SPZ". 크기: PLY 대비 약 10% (90% 더 작음). 호환: Niantic Scaniverse, Niantic Spatial Fields, MetalSplatter.

기술적 설명

Niantic의 SPZ v2 형식. 위치는 24비트 Fixed Point로 패킹됩니다 (약 0.25 mm 해상도 산출). 스케일은 Log 공간에서 8비트 양자화로, 회전은 8비트 Smallest-Three (v2에서는 xyz만 저장되고 w는 디코더에서 쿼터니언 Norm에서 파생) 로, Opacity는 Sigmoid 처리된 8비트 값으로. DC SH는 SPZ 특정 Pack 공식 (dc_raw * 0.15 * 255 + 0.5 * 255) 으로 저장되고, 더 높은 SH 밴드는 계수당 5비트 (Band 1) 또는 4비트 (Band 2-3) 로. 전체 패킹된 바이너리 Blob은 그 다음 표준 gzip (RFC 1952) 으로 압축되어 Magic Bytes 1f 8b가 있는 gzipped 컨테이너 형식을 산출합니다. RadianceKit은 이를 위해 시스템 gzip을 호출합니다. Apple의 내장 zlib API가 Spatial Fields나 MetalSplatter의 SPZ 리더와 호환되지 않는 독점 Apple Framing을 생성하기 때문입니다. 시스템 gzip은 macOS Sandbox 내에서도 Spawn 가능한 채로 유지됩니다.

E4 — SOG (.sog)

위치

메뉴 바 → Export → 3D Formats → Export SOG…. Simple Mode: 형식 카드 "SOG". 크기: PLY 대비 약 5~6% (15~20배 압축 — 가장 작은 옵션). 호환: PlayCanvas Engine, SuperSplat Editor.

기술적 설명

"Spatially Ordered Gaussians" — 여러 무손실 WebP 이미지에 Cloud를 GPU 준비 상태로 저장하는 PlayCanvas 형식. 먼저 모든 Gaussian이 3D Morton Code (30비트 Z Order, 축당 10비트) 로 공간적으로 정렬되어 이미지가 렌더러에서 나중에 Cache Locality를 가지게 합니다. 그 다음 Position이 대칭 Log 변환 (더 나은 동적 범위를 위해) 으로 16비트 값으로 양자화되어 두 RGBA 이미지로 분할됩니다 (means_l.webp는 하위 8비트, means_u.webp는 상위). Rotation은 RGBA 이미지의 2비트 Mode + 3×8비트의 Smallest-Three로 인코딩됩니다 (Mode는 252 + largest로 Alpha에 들어감). Scale과 DC SH는 각각 256 항목 코드북으로 양자화됩니다 (모든 값에 대해 백분위 기반 분포). 인덱스는 scales.webpsh0.webp에 저장됩니다. 다섯 이미지와 Codebook 및 Bound가 있는 meta.json은 ZIP 파일로 패키징되고 (사용자 정의 인코더, Sandbox가 시스템 zip을 차단하기 때문) .sog 확장자로 저장됩니다.

Sandbox 주의: SOG는 외부 바이너리가 필요한 유일한 형식 옵션입니다. WebP 인코더 단계는 /usr/local/bin/cwebp 또는 /opt/homebrew/bin/cwebp에서 cwebp를 호출합니다. cwebp 바이너리가 발견되지 않으면 코드는 원시 PNG 인코딩으로 대체됩니다 — 그러나: PNG 대체는 SuperSplat에서 작동하지 않습니다. App Store 버전에서는 빌드 변형에 따라 가용성을 평가하십시오. Developer 변형에서는 cwebp가 Homebrew (brew install webp) 를 통해 설치되어 있어야 합니다.

E5 — glTF (.glb)

위치

메뉴 바 → Export → 3D Formats → Export glTF…. Simple Mode: 형식 카드 "glTF". 크기: PLY와 비슷. 호환: KHR_gaussian_splatting 확장 (Khronos Draft 표준) 이 있는 glTF Viewer.

기술적 설명

KHR_gaussian_splatting 확장 사양에 따라 자체 포함된 .glb 바이너리 파일 (별도 Bin 파일 첨부 없음) 을 작성합니다. Position은 일반 glTF POSITION Vertex 데이터 (float3) 로 저장되고, 다른 모든 속성 (Rotation은 float4, Scale은 float3, Opacity는 float, SH 계수는 float3 × shCoeffCount) 은 추가 Vertex 속성에 있고 확장을 통해 참조됩니다. 중요: glTF는 오른손 Y up 좌표계를 사용하고, COLMAP/3DGS는 Y down/Z forward로 작업합니다. 따라서 내보내기는 X축 주위로 180도 회전을 적용합니다 — Position은 (x, -y, -z)로 다시 작성되고, Quaternion은 (w, x, -y, -z)로 조정됩니다. 이는 glTF Viewer에서 기하학적으로 올바르고 핸드 (거울이 아닌) 표현을 산출합니다. GLB 표준이 요구하는 대로 JSON과 바이너리 청크는 4바이트 정렬로 패드됩니다.

E6 — Splat (.splat)

위치

메뉴 바 → Export → 3D Formats → Export .splat…. Simple Mode: 형식 카드 ".splat". 크기: Gaussian당 정확히 32 바이트. 호환: gsplat.js, 웹 기반 Viewer (antimatter15 참조), 대부분의 브라우저 3DGS 데모.

기술적 설명

antimatter15 .splat 형식 — Gaussian당 32 바이트, 헤더 없음, 간접 참조 없음. 항목당 레이아웃: 3 × float32 Position (세계 좌표), 3 × float32 Scale (내부 버퍼의 Log Space에서 exp 변환), 4 × uint8 RGBA 색상 (SH_C0 = 0.282...로 스케일된 DC SH 계수, [0,255] 에 클램프), 4 × uint8 쿼터니언 (w,x,y,z, 정규화되고 바이트 범위에 128 + 128*q로 인코딩). DC SH만 저장 — 더 높은 SH 밴드는 폐기됩니다. 이는 형식을 극도로 콤팩트하게 만들지만 반사나 Specular Highlight에서 발생하는 View 의존 색상 변경 비용이 듭니다. 쓰기 순서는 정확히 Cloud의 인덱스 순서입니다 (공간 정렬 없음), gsplat.js 같은 웹 Viewer가 이를 기반으로 렌더링합니다.

Firefox에서 열린 Web Viewer — 주변 카메라 마커 구체와 함께 렌더링된 Bjoern의 Bouquet Splat, 위에 보이는 브라우저 탭 바, CDN/서버 설정 필요 없음
Firefox에서 열린 Web Viewer — 주변 카메라 마커 구체와 함께 렌더링된 Bjoern의 Bouquet Splat, 위에 보이는 브라우저 탭 바, CDN/서버 설정 필요 없음. Finder에서 더블 클릭으로 기본 브라우저에서 직접 연 독립형 flowers-01.html — 내장된 WebGL2 프로그램이 네트워크나 서버 없이 Gaussian Cloud를 즉시 렌더링합니다. Bouquet 주위의 검은 마커는 학습 카메라이며 선택적으로 표시 가능합니다. 마우스 드래그로 회전, 스크롤로 줌.

E7 — Web Viewer (.html)

위치

메뉴 바 → Export → Media → Export Web Viewer…. Simple Mode: 형식 카드 "Web Viewer". 크기: Splat 데이터 base64 인코딩 (≈ 4/3 오버헤드) + 약 5 KB HTML/JS 셸. 호환: WebGL2가 있는 모든 최신 브라우저 (모든 데스크톱, iOS 15+, Android 5+).

기술적 설명

완전히 인라인으로 작성된 WebGL2 렌더러와 함께 Gaussian Cloud를 단일 .html 파일로 묶습니다. CDN 의존성이 없고, WASM이 없고, 두 번째 파일이 없습니다. Cloud는 먼저 .splat 바이너리로 인코딩되고 (E6과 같은 32 바이트 로직), 그 다음 base64로 임베드되고, 그 다음 브라우저에서 atob로 디코딩됩니다. 내장 렌더러는 자체 WebGL2 정렬, 마우스 Orbit 제어, 프레임당 CPU 정렬을 수행합니다. 전체 JS 코드 (셰이더, 수학, 루프) 가 출력 HTML에서 볼 수 있습니다. 저장-렌더러 경계의 축 규약은 E5와 정확히 동일합니다: Position (x, -y, -z), Quaternion (w, x, -y, -z). 선택적으로 브랜딩 오버레이를 표시할 수 있습니다 (Free Tier 스위치). 모든 것이 인라인이기 때문에 파일은 file:// 프로토콜에서도 직접 작동합니다 — 테스트에 로컬 웹 서버 필요 없음.

flowers-01.mp4에서 추출한 단일 프레임 — 프로필 렌더에서 Bjoern의 Bouquet, 카메라 마커가 있는 보이는 흰색 플랫폼, 검은색 배경 — 일반적인 Orbit 카메라 이동 프레임 비디오 실행 약 5초
flowers-01.mp4에서 추출한 단일 프레임 — 프로필 렌더에서 Bjoern의 Bouquet, 카메라 마커가 있는 보이는 흰색 플랫폼, 검은색 배경 (기본 뷰포트 배경, Settings에서 변경 가능). 카메라는 파라메트릭 궤도에서 장면을 둘러쌉니다 (Elevation + 거리 고정, Yaw 회전), 일반적으로 30 또는 60 fps에서 6–10초 지속 시간. 프레임 해상도는 VideoPreset을 통해 480p에서 8K까지 스케일 가능합니다.

E8 — Orbit Video (.mp4/.mov)

위치

메뉴 바 → Viewport → Record Turntable Video 또는 메뉴 바 → Export → Media → Export Orbit Video…. Simple Mode: 3–30 s 지속 시간 슬라이더가 있는 형식 카드 "Orbit Video". 크기: 지속 시간, 해상도, 비트레이트에 따라 다름. 호환: 모든 플랫폼 (H.264과 HEVC가 Apple 표준).

기술적 설명

파라메트릭 Orbit 카메라 이동을 따라 Gaussian Cloud를 렌더링하고 AVAssetWriter를 통해 각 프레임을 MP4 또는 MOV 파일로 인코딩합니다. Orbit 구성은 회전 속도 (회전 수), 거리, Elevation, FOV, 지속 시간, Ease In/Out 인수를 제어합니다. 프레임당 World 적응 매트릭스 (내부 좌표를 Y up Orbit 세계로 회전시키기 위해 렌더러가 계산) 가 카메라와 곱해진 후 MetalSplatter 특정 Y 미러링이 적용됩니다. 오프스크린 렌더 타깃은 인코더용 CVPixelBuffer에 IOSurface를 통해 끌어내립니다. 인코더는 H.264와 HEVC, 구성 가능한 비트레이트 및 480p에서 8K까지의 해상도를 지원합니다. 첫 프레임 전에 렌더러는 초기 Splat 정렬이 완료되도록 200 ms를 기다립니다. 이 내보내기는 GPU 제한입니다 — 8K와 수백만 Gaussian에서 프레임당 렌더 시간이 몇 초이며, 따라서 6초 비디오에 총 렌더 시간 10–30분 가능.

E9 — SfM Transforms (transforms.json)

위치

메뉴 바 → Export → Photogrammetry → Export SfM (transforms.json)…. 크기: 일반적으로 1–10 KB (Pose + Intrinsic만, 이미지 없음, Gaussian 없음). 호환: nerfstudio, Brush, gsplat, OpenSplat, Meshroom, 모든 현대 Feed Forward 3DGS Trainer.

기술적 설명

공유 Intrinsics가 있는 카메라 포즈 목록이 있는 nerfstudio transforms.json 형식을 작성합니다. 카메라당 View 매트릭스 (RadianceKit 내부: COLMAP 규약의 World to Camera) 가 반전된 다음 카메라 로컬 Y와 Z 베이스 벡터가 미러링되어 nerfstudio 규약 (OpenGL 스타일, 카메라가 -Z를 따라 보고, +Y가 위) 으로 변환됩니다. 최종 4×4 매트릭스는 각 프레임의 transform_matrix 필드의 row-major nested array of Doubles로 저장됩니다. Intrinsics는 최상위에 저장됩니다 (초점 거리 x/y, 주점 x/y, 이미지 폭/높이, camera_model = "OPENCV", Distortion Coefficient k1, k2, p1, p2) — 내보내기가 여러 다른 Intrinsics 세트를 감지하지 않는 한, 그 경우 프레임당 작성됩니다. 이미지 경로는 JSON 파일에 상대적인 images/<filename>으로 작성됩니다. 사용자는 학습 사진이 있는 형제 images/ 폴더를 만들어야 합니다.

E10 — COLMAP Workspace (sparse/0/)

위치

메뉴 바 → Export → Photogrammetry → Export SfM (COLMAP Workspace)…. 크기: 세 바이너리 파일 함께 일반적으로 4–8 MB — points3D.bin이 지배 (Sparse Cloud의 3D 점당 한 줄), images.bincameras.bin은 각각 100 KB 미만. 호환: COLMAP 자체, Nerfstudio, Postshot, Meshroom, COLMAP sparse/ 디렉터리를 예상하는 모든 도구.

기술적 설명

세 바이너리 파일이 있는 표준 COLMAP sparse/0/ 레이아웃을 작성합니다: cameras.bin, images.bin, points3D.bin. 형식 참조는 공식 COLMAP 문서입니다. cameras.bin은 중복 제거된 Intrinsics 목록 (동일한 Intrinsics + 이미지 크기를 가진 카메라가 단일 항목으로 결합됨) 을 포함합니다. 사용된 Camera Model은 OPENCV (Model 4) 이며 fx/fy/cx/cy + 네 개의 Distortion Coefficient k1/k2/p1/p2가 있습니다. images.bin은 이미지당 wxyz 쿼터니언으로 Pose + Translation, 그 다음 Camera ID와 파일 이름을 나열합니다. 2D-3D 대응은 저장되지 않습니다. points3D.bin은 Position, Color (0-255 RGB), Reprojection과 Track Length의 기본값이 있는 SfM 점 구름을 포함합니다. 모두 Little-Endian으로 작성됩니다. RadianceKit으로의 재가져오기는 File 메뉴 → "Import COLMAP/Metashape Workspace…"를 통해 작동합니다 (SfM 백엔드 장의 Q3 참고).

어느 형식을 언제?

목표형식
자체 사이트의 Web ViewerE7 Web Viewer (.html)
gsplat.js가 있는 Web ViewerE6 Splat (.splat)
Postshot / Nerfstudio의 파이프라인 재사용E9 transforms.json + E10 COLMAP Workspace
SuperSplat 편집E1 PLY 또는 E2 Compressed PLY
Niantic Scaniverse / Spatial FieldsE3 SPZ
최대 압축E4 SOG (cwebp 필요)
마케팅/소셜 비디오E8 Orbit Video

빠른 비교

형식확장자Sandbox크기 (1M Gauss)Best Use
E1 PLY.ply~250 MB아카이브, 최고 호환성
E2 Compressed PLY.ply~40 MBWeb + SuperSplat
E3 SPZ.spz예 (gzip-Spawn)~40 MBNiantic + 모바일
E4 SOG.sog조건부 (cwebp)~20 MB최대 압축
E5 glTF.glb~250 MBKhronos 파이프라인
E6 Splat.splat~32 MBgsplat.js Web Viewer
E7 Web Viewer.html~45 MB독립형 브라우저 파일
E8 Orbit Video.mp4/.mov가변소셜/마케팅
E9 SfM Transforms.json~5 KBPose 전달
E10 COLMAP Workspace디렉터리~4–8 MBPose 전달 바이너리

크기 열은 SH 정도 3의 100만 Gaussian에 대한 대략적인 기준값입니다. 실제 값은 장면의 압축성에 따라 다릅니다. SH 정도 0은 PLY/glTF를 4배 줄입니다.