SOTAESAN ATLAS

Markdown 원본 다운로드

Sunnyvale 벽 비침 조사

상태 — 2026-10-03

같은 카메라로 두 앱을 비교하고 창 아래 벽 뒤의 불투명 표식이 두 엔진 모두에서 비치는 것을 확인했다. 선택한 검사 위치에서는 실제 가림이 부족하다. 원본의 어두운 형태가 실제 가구인지는 확인하지 못했다. SOG의 국소 형상·불투명도와 투명 합성 경로를 더 분리해야 하며, 비침 수정은 아직 완료하지 않았다.

이전 조사는 사이트 권한 차단 때문에 파일·충돌 메시 검사에서 멈췄다. 같은 URL의 Chrome 접근이 성공한 뒤, 반복 조건 비교에는 별도 Playwright MCP의 단일 탭을 사용했다. 브라우저 사용 기록에 차단 당시와 이번 성공 범위를 구분했다.

화면을 직접 바꾸며 확인하려면 원본·시험 조건 비교를 연다. 최종 14회 촬영의 원본 상태·오류 기록, 영상 차이·캡처 해시, 시험 SOG 해시를 함께 보존했다.

입력과 조사 범위

확인된 내용

충돌 면은 화면의 불투명 벽이 아니다

두 앱은 같은 sunnyvale.sog를 가시 장면으로 사용한다. Splat 객체에는 world의 Z축 180° 회전을 적용하고, 충돌 GLB에는 world의 항등 변환을 적용한다. 변환이 서로 다르다는 사실만으로 정렬 오류라고 판정하지 않는다. 두 자산의 저장 좌표계가 다를 수 있다.

충돌 GLB는 이동 판정에 사용하며 평소 불투명 벽으로 렌더링하지 않는다. ‘충돌 면 보기’는 촬영 장면을 숨긴 진단 표시다. 따라서 진단 화면에 벽 삼각형이 있다는 사실은 SOG 화면에서 그 뒤의 내용이 가려진다는 증거가 아니다. 현관 바닥 보완으로 벽 비침이 해결됐다고 판정할 수도 없다.

보고 좌표 바로 앞의 근평면 문제로 단정하기 어렵다

보고 좌표에서 +X 방향으로 검사한 최초 교차점은 다음과 같다.

발 위 높이 광선의 월드 Y 최초 충돌 면까지 거리 교차점 X
0.50 m 1.05 m 1.369 m -12.871 m
1.00 m 1.55 m 1.378 m -12.862 m
1.60 m 2.15 m 1.704 m -12.536 m

두 앱의 카메라 near는 0.05 m다. 이 +X 수평 표본은 카메라가 충돌 면에 5 cm보다 가까워서 잘린 상황을 보여주지 않는다. 다만 실제 시선과 빨간 박스의 픽셀 광선을 모르는 상태이고, 충돌 GLB와 Splat 표면도 동일하지 않다. 모든 방향의 near 문제를 배제하거나 해당 교차점을 빨간 박스의 벽이라고 확정할 수는 없다. 높이에 따른 교차점 차이도 창문·벽 형상 때문일 수 있어 곧바로 메시 오류로 판정하지 않는다.

같은 위치의 비침만으로 렌더러나 원본 중 하나를 확정하지 않는다

공통 SOG의 빈틈, 넓거나 떠 있는 점, 투명도 합성은 조사 후보로 남는다. 두 렌더러가 같은 종류의 투명 Splat을 합성하기 때문에 두 앱에서 보인다는 사실만으로 원본만의 문제라고 확정할 수도 없다. 위 수평 광선 검사는 SOG의 불투명도·색상·정렬을 측정하지 않았다.

화면 검증 — 같은 날 후속 조사

카메라와 자산

반올림된 발 위치는 유지하되 현관 창문 쪽을 향하도록 시선을 새로 정했다. eye는 [-14.24, 2.15, -11.09]m, pitch -20° / yaw 90°, viewport 1280×800, DPR 1, 세로 FOV 70°, near 0.05m, far 300m다. PlayCanvas eye의 최대 차이는 부동소수점 정밀도 범위인 약 2.3×10⁻⁷m다. 기존 +X 수평 광선 방향은 이 창문 시선과 반대이므로 창문 아래를 지목하는 근거로 사용하지 않는다. 원래 JSON·빨간 박스는 여전히 없어 당시 화면의 정확한 재현을 선언하지 않는다.

두 앱 모두 scene=sunnyvale&controller=bvh의 전체 원본 SOG 3,999,361점을 사용했다. 구역 스트리밍 장면은 이번 원인 분리 조건에 포함하지 않았다. 릴리스는 local-4d5905679d2e-8887379fa947, GPU는 ANGLE Metal Renderer: Apple M4 Pro다. 카메라 고정을 위해 world 응답의 spawn·benchmarkRoute를 일시 변경하고 ‘비교 경로 재생’ 시작 2초 뒤 촬영했다. 앱 소스·원본 world·자산은 변경하지 않았다. 요청 가로채기와 준비 구간이 있으므로 성능·cold/warm 로딩 표본이 아니다.

벽 뒤 표식으로 가림 확인

원본 SOG를 유지한 상태에서 기존 불투명 주황색 reference cube를 world 응답의 objects에만 추가했다. 위치 [-16.3, 0.25, -10.3]m, 크기 [0.02, 0.75, 0.8]로, 실제 Y 범위는 0.25–1.0m다. 선택한 픽셀들의 충돌 벽 X 약 -15.68m보다 뒤에 있다. 창 아래 벽 영역에 주황색과 표식 테두리가 나타나고 벽 무늬가 그 위로 남는다. 같은 결과를 Three.js와 PlayCanvas에서 확인했다.

이는 해당 벽 영역이 뒤의 불투명 물체를 충분히 가리지 못한다는 증거다. 원본 어두운 형태가 실제 가구라는 증거는 아니며, SOG 불투명도 부족과 Gaussian 형상·깊이 합성의 기여를 각각 확정하는 시험도 아니다. 표식은 진단용으로만 사용했다.

픽셀 광선과 근평면

기록한 카메라에서 픽셀 중심 광선을 복원해 원본 충돌 GLB와 교차시켰다.

픽셀 (x,y) 광선 거리 카메라 전방 깊이 교차점 X
(440,600) 1.959m 1.756m -15.679m
(400,650) 2.116m 1.809m -15.668m
(640,500) 1.669m 1.644m -15.686m
(1000,550) 2.077m 1.715m -15.697m

이 교차점들은 near 0.05m와 충분히 떨어져 있다. 선택한 카메라·충돌 벽의 근평면 잘림으로 이번 현상을 설명하기 어렵다. 충돌 면과 Gaussian 표면이 같다는 판정이나 모든 위치의 near 문제 배제에는 사용하지 않는다. 카메라 입력과 교차점 원본을 보존했다.

SOG 대조군

점 위치·스케일·회전과 유지한 색상 파일을 그대로 두고, 고차 SH 제거 또는 중심 world X 기준 불투명도 0만 각각 적용했다. WebP의 RGBA 무손실 왕복과 변경하지 않은 ZIP 항목의 바이트 동일성은 생성 스크립트에서 검사한다. 중심 제외는 Gaussian의 넓이를 자르는 평면 클리핑이 아니다. exterior/interior 파일명은 좌표면 양쪽을 구분하며 실제 건물 경계를 뜻하지 않는다.

영상 차이는 각 엔진의 원본에 대한 8비트 RGB 평균 절대 차이다. 창 아래 ROI는 (400,540)–(500,670), 오른쪽 보조 벽은 (900,480)–(1100,650)이다. UI에 가린 부분을 피했다.

조건 PlayCanvas 창 아래 / 보조 벽 Three.js 창 아래 / 보조 벽 관찰
RGBA 재인코딩 0 / 0.0016 0 / 0 창 아래 픽셀 동일. PC 보조 벽 167개 RGB 성분에 최대 1단계 차이
고차 SH 제거 5.651 / 1.123 5.346 / 1.088 색상은 달라져도 어두운 형태는 남음
중심 X < -16.3m 제외 13.077 / 2.804 12.911 / 2.790 형태가 변하고 벽 표현도 변함
중심 X < -16.5m 제외 12.027 / 1.978 11.774 / 1.993 국소 변화가 큼. 깨끗한 벽 복원은 아님
중심 X < -17.5m 제외 4.041 / 1.387 3.822 / 1.403 더 깊은 점도 해당 영상에 기여
벽 뒤 불투명 표식 38.547 / 0 33.703 / 0 표식이 벽을 통해 보임

변화량은 화질 점수나 물리적 불투명도 추정치가 아니다. 두 엔진 모두 같은 종류의 반응을 보였고, 엔진 선택·SH 제거만으로 벽 가림이 해결되지는 않았다. 넓은 점 제외는 원인 분리에 도움을 줬지만 벽도 함께 바꾸므로 수정으로 채택하지 않았다. 정렬 알고리즘의 정확성이나 단독 원본 결함까지 확정하지 않는다.

국소 보정 시안 — 불투명 벽 면

국소 Gaussian의 alpha 증폭·최대화와 벽 뒤 점 제외를 추가로 시험했지만 표식이 계속 보이거나 벽 표현이 달라졌다. 단색 불투명 면은 표식을 가렸으나 벽 색과 경계가 눈에 띄었다. 최종 진단 시안은 주변 벽 색으로 교정한 작은 불투명 면이다. 원본·시안 비교 화면, 시험 조건·재현, 회차별 원본 상태을 보존했다.

면은 X −15.69m, Y 0.67–1.48m, Z −11.28–−9.42m이며 2삼각형이다. 512×512 RGB 텍스처를 포함한 GLB는 51,944바이트, SHA-256 466dd67f7292b8cefd3970cbd03589083bdc2055fda9b212778a6e077b8f49bf다. 검정 baseColor와 emissive texture를 사용하며 불투명 양면이다. 창문 아래에만 배치했고 충돌 면은 추가하지 않았다.

기준 Three.js 시점의 검정·회색 교정 면 영상으로 면의 기여를 추정하고, 같은 높이의 좌우 벽 색을 보간해 텍스처를 만들었다. 원본 영상에 섞이는 점의 색을 고려한 시각 보정이며 실제 벽의 사진·무늬를 복원했다는 근거는 없다. 검은 경계와 바닥 겹침은 면 범위를 줄여 제거했으나 벽 무늬가 부드러워지는 부분은 남는다. 원본 SOG나 기본 world에 정식 적용하지 않았다.

네 고정 시점의 표식 가림

기준 eye [-14.24,2.15,-11.09]m, 좌우는 Z +0.50/−0.50m, 앞쪽은 X −0.40m로 이동한 위치를 각각 지정했다. pitch −20° / yaw 90°는 유지했다. 두 엔진 × 네 시점 × 원본·원본+표식·보정·보정+표식으로 32장 촬영했다. 실제 키 이동은 하지 않았다.

표식의 투영 bbox에 2픽셀 여유를 둔 영역에서 표식 삽입 전후의 RGB8 평균 절대 차이를 비교했다.

엔진 기준 원본 / 보정 왼쪽 원본 / 보정 오른쪽 원본 / 보정 앞쪽 원본 / 보정
Three.js 33.588 / 0 31.190 / 0 31.853 / 0 34.699 / 0
PlayCanvas 38.434 / 0 35.792 / 0 36.516 / 0 38.916 / 0

보정의 8개 조합은 표식 유무에 따른 해당 영역의 모든 픽셀이 동일했다(최대 RGB 차이도 0). 이는 이 표식과 네 시점의 가림 근거이며, 화질 점수나 전체 벽의 물리 불투명도 추정치가 아니다. 창문은 시안 면의 범위 밖에 있고 촬영 화면에서도 보존됐다.

릴리스 local-4d5905679d2e-8887379fa947, Apple M4 Pro / ANGLE Metal, 1280×800, DPR 1, visible·focused, headed 시험 탭 한 개를 유지했다. 모든 회차에서 페이지 오류·console warning/error·실패 요청이 없었다. 원본 SOG·충돌 자산의 해시와 콜라이더 구성은 유지됐다. world·manifest·시안 GLB 응답을 시험 브라우저에서만 가로채고 카메라 고정 후 1.8초 안정화했으므로 보행·로딩·메모리 성능 결과로 사용하지 않는다.

생성 스크립트의 재생성 GLB 해시 일치, 16쌍 이미지 차이 재계산, 촬영 스크립트 문법, 기존 자산 무결성을 확인했다. 두 엔진 모두 동일한 시안으로 가림을 얻어 이 결과만으로 엔진 선택의 우열을 정하지 않는다.

실제 보행·시대 전환과 근접 범위 — 2026-10-04

같은 시안을 실제 키 입력으로 좌우 이동·접근·충돌·후퇴하며 확인했다. 두 엔진 × 원본/보정 네 회차의 자동 복구는 모두 0회였다. Three.js는 BVH, PlayCanvas의 실제 컨트롤러는 Ammo dynamic capsule이다. 보행은 끝 좌표가 달라 이미지 간 픽셀 차이 비교에 사용하지 않는다.

구역·시대 장면에서는 실제 버튼의 current → historical → current 전환과 오류 없는 idle 복귀를 네 회차에서 확인했다. 합성 터치 입력 경로로 좌우·하향 시선과 복귀도 확인했다. 가상 과거는 현재 SOG를 재사용하며 보정과 표식은 both 레이어다. 실제 마우스 pointer-lock 자동화는 제어가 안정적이지 않아 통과 판정에서 제외했다.

근접 시점에서는 보정 면으로 표식을 가리지 못했다. 실제 접촉 eye를 같은 좌표로 다시 고정해 표식 전후를 비교했다. ROI MAE RGB8은 Three.js 원본/보정 11.5269/11.5269, PlayCanvas 13.5552/13.5422였다. 이때 면의 네 모서리는 화면 Y 1012–1370으로 화면 아래에 있고, 표식 광선은 면의 X에서 Y 1.536–1.774m로 상단 1.48m보다 높게 지나간다. 면 자체의 가림 실패가 아니라 범위 밖이라는 근거이며, 그 경로가 창문·셔터인지 불투명 벽인지 확정하는 근거는 아니다.

하향·후퇴 화면에서는 사각 경계와 평활화가 드러난다. 전체 SOG에서 교정한 텍스처와 구역 LOD의 차이도 있어 품질 완료로 처리하지 않았다. 이동 중 인접 strip-2 로드는 확인했지만 장애물에 막혀 strip-1 해제 거리에는 도달하지 못했고 unloads=0이었다. 구역 해제·면 재생성 수명은 미검증이다.

릴리스·GPU·viewport는 앞선 고정 시험과 같다. 성공한 시대 네 회차와 근접 재현 여덟 회차는 페이지 오류·console warning/error·실패 요청이 없었다. 첫 시대 시도의 준비 문구 대기 타임아웃과 pointer-lock 오류는 별도로 보존했다. 응답 가로채기가 있는 기능·시각 시험이며 성능 표본은 아니다. 76장 화면·전체 상태·입력·제외 사유·기하 계산·SHA-256은 보존 기록, 선택형 화면은 비교 HTML에 있다. 기본 world·원본 SOG·충돌·앱 소스에는 시안을 반영하지 않았다.

남은 보완 범위

  1. 시안은 표식 가림을 확인했으나 벽 무늬의 국소 평활화가 남는다. 정식 반영에는 복원 근거가 있는 텍스처·점 정리 또는 시각 보정에 대한 품질 판단이 필요하다. 단순 X 구간 제외 결과는 보정 자산으로 사용하지 않는다.
  2. 실제 보행과 합성 시선에서 드러난 근접 범위 밖의 경로를 창문·셔터·불투명 벽으로 구분하고, 보정 경계와 구역 LOD의 색·무늬를 개선한다. 원본 JSON이 다시 확보되면 당시 시선에서도 확인한다. 실제 마우스 시선의 안정적인 검증도 남는다.
  3. 시대 레이어와 인접 구역 로드는 확인했다. 남은 구역 해제·면 재생성 수명을 검증하고, 모바일 대상 적용 시 iPhone 실기기에서도 확인한다. 충돌 메시 전체 표시나 near·반지름·전체 불투명도 변경으로 완료 처리하지 않는다.

이 항목은 엔진 선정의 시각 품질 조건으로 남긴다. 수치가 비슷한 반복 성능 측정을 추가하는 대신 원인 분리와 보완 비용을 확인한다.

재실행

pnpm audit:wall --output docs/implementation/measurements/2026-10-03/wall-audit/collision-rays.json

이 명령은 로컬 파일만 읽고 지정한 조사 JSON을 저장한다. 개발 서버·브라우저·앱 자산은 변경하지 않는다. 콘솔에는 주요 축 방향 12개만 표시하고 저장 파일에는 72개 전체를 남긴다.

이번 카메라의 픽셀 광선:

pnpm audit:wall --camera docs/implementation/measurements/2026-10-03/wall-audit/visual-probes/wall-audit-three-window.json --pixels '440,600;400,650;640,500;1000,550' --output output/playwright/wall-audit-pixel-rays.json
uv run --with numpy --with pillow python scripts/make-wall-controls.py output/playwright/wall-controls

두 개발 서버 5173·5174가 준비된 뒤 별도 Playwright MCP의 browser_run_code_unsafe({filename: "scripts/capture-wall-probes.playwright.js"})로 7조건×2엔진을 촬영한다. 작업 디렉터리는 저장소 루트, 시험 탭은 하나여야 한다. 반환 JSON을 저장하고 촬영을 마치면 시험 브라우저를 닫는다. 생성한 대형 SOG 대조군은 output/playwright/wall-controls/에만 두고, 보존 문서에는 스크린샷·원본 상태·해시를 남긴다.