SOTAESAN ATLAS

Markdown 원본 다운로드

Sunnyvale 현관 보행 바닥 보정

2026-10-03. 벤치를 지나면 낮은 곳으로 떨어져 돌아오지 못하던 구간을 공통 충돌 데이터에서 보정했다. Three.js BVH·Rapier와 PlayCanvas Ammo의 실제 앱에서 왕복과 끝 난간 충돌을 확인했다. 벽 비침과 전체 보행 경로의 안전성은 별도 검수 항목이다.

원인과 수정 범위

신고 좌표 근처에서 촬영된 마루는 끝 난간까지 이어지지만, 원본 충돌 GLB의 바닥은 현관 안쪽에서 내려간다. X=-13.66356m에서 Z=-21.98231m의 충돌 높이는 0.46143m, Z=-22.03231m에서는 -0.22668m다. 인접 5cm 구간에서 약 68.8cm 내려가므로 현재 20cm 턱 오르기로 복귀할 수 없었다. 보정 전 세 제어기 모두 같은 실패를 재현했다. 보정 전 조사

촬영 화면과 충돌면을 대조한 뒤 현관 통로 안쪽에만 보행용 바닥을 추가했다. 기존 벤치·벽·난간 충돌과 제어기의 턱 오르기 알고리즘은 유지했다. 이 바닥은 이동 충돌에만 사용하며 화면에 큐브를 표시하지 않는다.

항목 값
작성 원본 shared/source/sunnyvale-walkmesh.author.json
충돌 ID sunny-walk-porch-floor
X 범위 -14.05 ~ -12.65m
Y 범위 0.32 ~ 0.52m
Z 범위 -24.30 ~ -21.60m
시대 현재·과거 공통 (both)
검수 상태 preview-only

좌표는 공급된 장면에서 추정했으며 실측 건축 치수가 아니다. 바닥 윗면은 원래 정지 높이보다 조금 낮은 0.52m로 두어, 시작 캡슐이 보정 바닥 내부에서 출발하지 않도록 했다. 원본 마루와의 경계, 통로 폭과 난간 밖으로 면이 나가지 않는 범위를 확인했다.

생성과 비용

compile-sunnyvale-walkmesh.mjs는 작성 원본을 검사한 뒤 전체 장면과 분할 장면의 전용 이름공간만 갱신한다. 시대 생성기는 이 바닥을 이어받는다. 분할 자산 재생성에서도 보정이 유지되도록 연결했다.

pnpm authoring:compile
pnpm check
./dev.sh --preview both

작성 원본과 출력이 다르면 검사·빌드가 실패한다. 두 월드의 입력 검증을 모두 완료한 뒤 쓰기를 시작하며, 파일 시스템 쓰기 중 장애까지 원자적으로 처리하는 도구는 아니다.

기존 reference-cube 자산(968바이트, 12삼각형)을 재사용한다. 전체 장면의 충돌은 337,680 → 337,692삼각형이 된다. 새 SOG나 텍스처 다운로드는 추가하지 않는다. 바닥은 작은 공통 상주 충돌이며 청크 해제와 시대 전환으로 제거되지 않는다. 이 숫자는 데이터 증가량이며 GPU 처리 시간·메모리 증가나 사람의 제작 비용을 측정한 결과는 아니다.

pnpm audit:walkmesh는 원본 GLB만 읽는 보정 전 기준 조사다. 보정된 월드의 합격 여부는 아래 회귀 테스트와 실제 앱 결과로 판단한다.

실제 앱 검증

headed Playwright의 별도 브라우저에서 앱을 하나씩 열었다. Apple M4 Pro의 ANGLE Metal GPU 사용, 화면 표시·포커스를 확인했다. 시험은 시작 위치·시선만 고정하고 실제 자산과 제어기를 사용했다. W 1초 → S 1초, 5초 정지, 끝 난간으로 추가 전진을 수행했다. 위치는 앱 상태에서 직접 읽었다. 키 입력의 벽시계 시간이 같아도 프레임과 제어기의 처리에 따라 이동 거리는 달라질 수 있어 성능 비교 수치로 쓰지 않는다.

구성 낮은 곳으로 떨어지지 않고 왕복 시작점과 복귀점 거리 복귀 후 5초 정지 이동 끝 난간에서 멈춤
Three.js BVH 통과 0.87cm 0 통과
Three.js Rapier 통과 6.51cm 0 통과
PlayCanvas Ammo 통과 2.09cm 0 통과

복귀 거리에는 전후·좌우·높이 차이를 모두 포함한다. 시험 중 자동 추락 복귀 횟수는 증가하지 않았다. Ammo의 검사 상태에는 grounded가 노출되지 않아 접지 플래그를 측정했다고 주장하지 않는다. 발 높이·왕복·난간 정지 결과로 확인했다.

계단도 A 1초 → D 1초로 확인했다. BVH와 Ammo는 정한 상부 위치에 도달했다. Rapier는 높이가 올라갔지만 1초 이동 거리가 짧아 X<-11.5m 판정에 도달하지 않았다. 이번 수정은 계단 제어기 차이를 해결한 것이 아니다.

분할·시대 전환에서 유지

구성 분할 장면 왕복 시대 장면 현재 왕복 과거 전환 후 왕복 현재 복귀 후 왕복
BVH 0.50cm 0.47cm 0.44cm 0.70cm
Ammo 1.70cm 19.81cm 9.15cm 5.24cm

숫자는 시작점과 복귀점 거리다. 각 시험에서 바닥 충돌이 유지되고, 전진 위치의 발 높이는 0.5m 이상이었다. 로딩 실패·전환 오류와 자동 복귀 증가는 없었다. 복귀 거리 20cm 미만이라는 시험 기준은 모두 통과했지만 Ammo의 시대 장면 현재 시험은 경계에 가까워 정확히 같은 지점으로 복귀한다고 볼 수 없다. Rapier의 분할·시대 브라우저 시험과 iPhone 실기기 시험은 이번에 반복하지 않았다.

자동 검사와 증거

pnpm check가 성공했다. 77개 테스트(도구 19, 공통 31, Three.js 27), 공통·양쪽 앱 타입 검사, 자산 해시와 양쪽 릴리스 빌드·산출물 검사를 통과했다. BVH·Rapier의 60/20 FPS 회귀 테스트는 원본에서 복귀 실패를 재현하고, 보정 후 왕복·10초 정지·끝 난간 충돌을 확인한다. 작성 원본 테스트는 재생성·멱등성·다른 충돌 보존·오류 입력과 검사 모드의 출력 보존을 확인한다.

미리보기 릴리스는 local-4d5905679d2e-8887379fa947이며 배포하지 않았다. 검증 요약, 원시 결과·스크린샷·재현 드라이버 (원본 저장소 파일)를 저장했다.

주 시험의 앱 오류 기록은 favicon 404를 제외하고 비어 있다. 마지막 콘솔 확인에서도 오류·경고가 없었다. 이전 시험의 PlayCanvas sortKey overflow 경고를 해결했다는 뜻은 아니다. ammo-retention-attempt1.json은 노출되지 않는 접지 플래그를 기다려 시간 초과된 측정 시도다. 조건을 수정한 ammo-retention.json을 판정에 사용했으며 실패 시도도 보존했다. 시험 브라우저를 종료하고 로컬 미리보기 서버는 유지했다.

남은 작업