Sunnyvale 화면·충돌 구역 로딩
2026-10-03. 실제 촬영 장면에서 화면과 충돌을 함께 분할하고, 필요한 구역만 로드·해제하는 시험을 완료했다. Three.js BVH, Three.js Rapier, PlayCanvas Ammo에 같은 자산·좌표·구역 정책을 적용했다. 엔진 선택은 아직 확정하지 않는다.
확인된 범위
- 데스크톱 세 구성: 구역 왕복, 해제된 시작 구역을 다시 로드한 뒤 시작점 복귀, 충돌만 지연·실패시킨 경계 차단과 재시도 통과.
- iPhone 11 Safari 세 구성: 준비, 구역 왕복, 시작 구역 재로딩과 복귀 통과. 기록에서 자동 낙하 복구와 런타임 오류는 없었다.
- 모든 저장 상태에서 정밀 구역은 최대 2개, 논리적 상주 점 수는 설정 예산 459,871개 이내였다. 시험 경로의 최대치는 448,028개였다.
- 생성된 충돌의 모든 삼각형 좌표·정점 순서와 원본 포함 여부를 별도 검사했다. 최종
pnpm check도 통과했다.
실기기 조작은 승인된 Safari 시험 탭에 합성 DOM TouchEvent를 보낸 결과다. 실제 손가락 사용성, 장시간 유지, RAM·VRAM, 프레임 p95를 검증한 결과는 아니다. 충돌 지연·실패 주입은 데스크톱에서 확인했다.
자산 제작과 분할
원본은 Sunnyvale의 3,999,361점 SH3 SOG와 공식 예제 충돌 GLB다. 생성기는 CPU로 SH를 제거하고 공간 축소를 적용해 900,000점 SH0 시각 마스터를 만든 뒤 X축의 여섯 구역으로 분할한다. 원본 점을 그대로 선택한 분할본은 아니다. 회전은 자산 좌표에 반영하고 월드 변환은 동일하게 유지한다.
시각 점 중심은 한 구역에만 할당한다. 원거리 표현은 각 구역에서 30개 중 1개를 선택한 총 30,003점이며 여섯 구역 모두 상주한다. 가까운 정밀 표현이 준비되면 해당 원거리 표현을 숨긴다.
충돌 삼각형은 잘라서 새 면을 만들지 않는다. 원본 삼각형의 X 범위와 겹치는 모든 구역에 좌표와 정점 순서를 그대로 복사한다. 원본 337,680면이 분할 후 총 344,098면이 되며 추가 복사 6,418면은 약 1.90%다. 긴 삼각형은 최대 여섯 구역에 포함된다. 원본 충돌의 구멍이나 촬영 자산의 벽 비침을 고치는 작업은 포함하지 않는다.
| 구역 | 정밀 점 수 | 충돌 삼각형 수 |
|---|---|---|
| 0 | 116,614 | 43,835 |
| 1 | 150,946 | 43,521 |
| 2 | 278,922 | 89,148 |
| 3 | 139,103 | 64,647 |
| 4 | 46,075 | 28,841 |
| 5 | 168,340 | 74,106 |
| 자산 범위 | 파일 크기 합계 |
|---|---|
| 여섯 정밀 SOG | 11,570,572 B |
| 여섯 원거리 SOG | 483,836 B |
| 여섯 충돌 GLB | 6,336,884 B |
| 전체 18개 | 18,391,292 B |
| 시작 구역 2·3의 정밀 SOG + 충돌 + 전체 원거리 | 8,719,953 B |
시작 시 선택 자산 크기는 약 8.72 MB이며, 같은 축소 분할본 전체 18.39 MB보다 약 52.6% 작다. 월드 JSON·앱 코드와 실제 네트워크 전송 오버헤드는 제외했다. 400만 점 SH3 원본과의 차이에는 축소·SH 제거 효과가 섞이므로 분할만의 절감으로 해석하지 않는다.
시작 시 충돌은 153,795면이다. 논리적 상주 점 448,028개는 숨긴 원거리 자산까지 포함하며 표시되는 점은 434,093개다. 논리적 점 수·파일 크기는 실제 GPU 메모리 사용량이 아니다. 배포 빌드는 공용 자산 전체를 복사하므로 선택 로딩이 배포 저장 공간까지 줄이지는 않는다.
이번 변환 실행 시간은 80.325초다. CPU 변환을 포함한 생성기 경과 시간이며 사람의 편집·품질 검수 시간이나 인건비가 아니다. 생성기는 현재 Sunnyvale 여섯 X 구역에 맞춰져 있다. 임의 장소·다각형·고도별 구역을 처리하는 범용 제작 도구는 아니다.
로딩과 충돌 수명
로드 거리는 2 m, 해제 거리는 3 m이며 정밀 구역은 최대 두 개를 유지한다. 정밀 점 예산 429,868개와 원거리 30,003개를 합쳐 459,871개를 허용한다.
- 공통 구역 로더가 시각 SOG와 대응 충돌 GLB를 요청한다.
- 엔진 어댑터가 충돌을 설치한 뒤 구역을 준비 완료로 표시한다. 화면만 준비된 상태에서는 해당 경계 통과를 허용하지 않는다.
- 실패 시 부분 자원을 정리하고 원거리 표현을 유지한다. 재시도에서 시각·충돌을 다시 준비한다. 구역 이탈 후 도착한 결과도 정리한다.
- 구역 해제 때 물리 참조를 제거한 뒤 자산을 해제한다. PlayCanvas GSplat 해제는 렌더 완료 순서를 지킨다.
- 시작점 복귀 중 입력을 멈추고 시작 구역을 재로딩한 뒤 이동한다. 실패 시 기존 위치의 구역을 복구한 뒤 입력을 재개한다.
Three.js BVH와 Rapier는 현재 활성 충돌 전체를 합쳐 다시 구성한다. Rapier는 공통 접지 BVH와 Rapier trimesh를 모두 재구성하고 broadphase를 갱신한다. PlayCanvas는 구역별 Ammo 정적 충돌 객체를 추가·제거한다. 이 구현 차이가 교체 비용에 영향을 준다.
충돌 교체 처리 비용
각 기능 시험에서 최초 설치 이후 구역 추가 네 번·제거 네 번의 훅 경과 시간을 기록했다. 단위는 ms이며 아래는 관측 최솟값–최댓값이다. 다운로드·전체 SOG 해독·완성 프레임 시간·메모리 비용은 포함하지 않는다. 반복 성능 벤치마크나 p95가 아니며 엔진 자체의 우열로 일반화할 수 없다.
| 구성 | 데스크톱 추가 | 데스크톱 제거 | iPhone 추가 | iPhone 제거 |
|---|---|---|---|---|
| Three.js BVH | 40.5–65.9 | 20.7–50.2 | 34–61 | 23–43 |
| Three.js Rapier | 100.7–176.6 | 60.6–91.6 | 128–208 | 81–91 |
| PlayCanvas Ammo | 37.8–137.6 | 0–0.7 | 39–125 | 0–3 |
현재 경로에서 Rapier 전체 재구성 비용과 Ammo 구역 제거 비용의 차이가 관찰됐다. 구역 경계의 순간 멈춤을 줄이려면 Three.js의 구역별 충돌 유지와 BVH worker 생성을 우선 검토할 근거가 있다. Rapier 물리 객체 생성에도 별도 프레임 예산이 필요하다.
iPhone의 제어기 생성 훅은 BVH 90 ms, Rapier 581 ms, Ammo 6 ms였다. Ammo의 최초 구역 충돌 설치 145·85 ms는 별도 훅에 기록되므로 이 생성 훅 숫자끼리 비교하면 안 된다. 데스크톱 Ammo 최초 구역 설치도 127.3·87.9 ms로 별도 기록됐다.
재현과 기록
생성 메타데이터: sunnyvale-stream.json. 월드: 구역 설정.
python3 scripts/make-sunnyvale-stream.py
pnpm check
./dev.sh --preview both
장면 선택에서 Sunnyvale · 화면·충돌 구역 로딩을 연다. 90만 점 축소본의 구역 분할 표시로 원본 시험과 구분할 수 있다.
기록은 측정 폴더 (원본 저장소 파일)에 있다. bvh/rapier/ammo-desktop.json과 대응 PNG는 왕복·복귀, bvh/rapier/ammo-fault.json은 충돌 지연·실패·재시도, ios-bvh/ios-rapier/ios-ammo.json은 실기기 결과다. desktop-driver.js, fault-driver.js, ios-probe.js가 시험 절차를 남긴다. 아홉 결과 모두 passed: true다.
scripts/sunnyvale-partition.test.mjs는 각 생성 GLB의 삼각형을 원본과 독립적으로 대조한다. 좌표·정점 순서·중복 횟수·구역 포함 조건·원본 SHA를 검사해 전체 면 유지와 총 344,098면을 확인한다. 최종 pnpm check는 이 검사, 공용/보행 테스트, 자산 해시 검사, 두 앱 타입 검사·릴리스 빌드·산출물 검사를 통과했다.
브라우저·iPhone 시험 릴리스는 local-4d5905679d2e-ee9a19b94a78이다. 이후 축소본임을 명시하는 화면 문구와 독립 자산 검사를 추가했고 최종 검사 릴리스는 local-4d5905679d2e-966abdfb965f다. 동작 코드 변경 없이 화면 문구만 바뀐 최종 빌드에서 실기기 시험을 반복하지 않았다.
남은 한계와 다음 작업
- 400만 점 SH3 원본의 Three.js 모바일 해독 문제는 여전히 미해결이다. 이번 축소 분할본 성공으로 해결됐다고 판단하지 않는다.
- X축 띠 분할은 바깥 구역의 이상치·넓은 범위와 긴 삼각형 중복에 취약하다. 큰 장소에서는 2D 구역과 원거리 자산의 선택 로딩도 필요하다.
- 현재 생성은 전체 18개 자산을 재생성한다. 일부 구역만 수정하는 증분 제작과 작업자의 실제 수정·검수 비용은 미측정이다.
- Sunnyvale 시험은 현재 시대만 포함한다. 기존 Hall의 시대·설명 결합 성공과 별개로, 이 실제 장소의 과거 건물·시대별 바닥·충돌을 분할한 결과는 아직 없다.
- LOD 교체의 선명도 변화, 벽 비침, 계단·벤치 주변 보행 메시 품질, 실제 손가락 조작과 모바일 메모리·장시간 유지가 남아 있다.
후속으로 현재 촬영 배경에 가상 시대 벽·설명을 결합하고 Three.js의 구역 충돌 재사용을 적용했다. 결합·교체 비용 개선 결과. 위 표는 변경 전 기록이며 보존한다. 새 변경의 iPhone 검증과 실제 과거 자산 제작은 남아 있다. 다음은 보행 메시 검수와 실제 콘텐츠 제작·수정 작업이다. 일반 성능 시험을 계속 반복하기보다 이 작업에서 발생하는 경계 멈춤·품질·메모리 위험을 확인한다.