본문으로 건너뛰기

파일 하나 여는 게 이렇게 복잡합니다

GLTFLoader.load('model.glb') 한 줄이면 3D 모델이 열릴 것 같지만, 현실은 다릅니다.

GLTF는 분리된 포맷​

GLTF는 하나의 파일이 아닙니다.

model.gltf     ← JSON (구조 정보)
model.bin ← Binary (실제 3D 데이터)
texture.png ← 텍스처 이미지

.gltf 파일 안에서 .bin과 텍스처를 상대 경로로 참조합니다. 서버에서 로딩할 때는 괜찮지만, 사용자가 파일을 드래그 앤 드롭하면 문제가 생깁니다.

File API로 받은 파일에는 서버 경로가 없어서, .gltf가 참조하는 .bin 파일을 찾을 수 없습니다.

Voxel3D의 해결 방법​

1. 관련 파일 자동 탐지​

model.gltf를 업로드하면 같은 이름의 .bin과 텍스처를 자동으로 매칭합니다.

2. Blob URL 변환​

File 객체를 브라우저가 이해할 수 있는 임시 URL로 변환하여 상대 경로 문제를 해결합니다.

File 객체 → blob:http://localhost:5173/3a4b5c6d...
GLTF JSON 내 "model.bin" → Blob URL로 교체

3. 동시 로딩 제어​

대용량 모델 여러 개를 동시에 열어도 최대 6개씩만 로딩하여 브라우저 과부하를 방지합니다.

4. 자동 연결​

로딩이 끝나면 Scene 추가, 트리 구조 등록, 애니메이션 연결까지 한 번에 처리합니다.

파일 드롭 → 파일 그룹 매칭 → Blob URL 변환 → 로딩
→ Scene 추가 → SceneGraph 등록 → Animation 연결

영감을 준 프로젝트들​

이전 직장에서 3D 뷰어의 파일 로딩 시스템을 구현하면서 이 문제를 처음 마주했습니다. 오픈소스 3dviewer.net에서도 같은 문제를 다른 방식으로 풀고 있었고, 두 프로젝트의 접근법을 비교하면서 Voxel3D만의 방식을 설계했습니다.

겉으로 보면 파일 열기 버튼 하나지만, 그 뒤에서는 꽤 많은 일이 일어나고 있습니다.