← 목록
OS 2026-06-21 20KB 읽기 20분

크라우니OS 3D 월드 데스크톱 — 지구 1:1 통합 설계 (딥리서치 종합)

4갈래 울트라 병렬 딥리서치(지구1:1·파인더네비·CIF통합·3D UX) 종합. 정본=한선씨, JS=글루. 키스톤 도구 완성: crownyc/libs/지구셀.한선 (트릿 지오해시, 왕복 검증). CIF 디코더=시작화면/cif-decode.js.

The slot formula n = (tx+1)*9 + (ty+1)*3 + (tz+1) is confirmed in 월드데스크톱.한선, and 위경도_ECEF/ECEF_위경도 exist in 좌표변환.한선 using 1e6 integer convention. I now have everything grounded. Here is the integrated design recommendation.


크라우니OS 3D 월드 데스크톱 고도화 — 통합 설계 권고

정본: /Users/ef/CrownyOS/시작화면/월드데스크톱.한선 (+ 창화면.한선). world.js = 얇은 CSS-3D 드라이버. 신규 라이브러리는 모두 .한선이 정본, JS는 브라우저 글루만 (헌법 — 한선씨 우선).

0. 통합 원칙 (4갈래 합치점)

네 갈래 리서치가 하나의 구조로 수렴한다: 27큐브 = 균형3진 = 지구 셀 = 파인더 계층 = CIF 큐브 가 전부 동일한 주소공간(3³)의 다른 투영(projection)이다.

도메인단위주소
데스크톱 슬롯1창(tx,ty,tz)∈{A,O,T}, n=(tx+1)·9+(ty+1)·3+(tz+1) ∈0..26
지구 셀위·경·고 3등분깊이 d당 트릿큐브 1개 (= 위1트릿·경1트릿·고1트릿)
파인더 노드폴더/앱트릿열 빵부스러기 T/OA/AT
CIF 씨앗27트릿 큐브트릿-트리 노드
즉, 슬롯번호 0..26 = 지구 셀번호 0..26 = 파인더 자식 0..26 = CIF 큐브 1개. 이미 월드데스크톱.한선:6의 슬롯식이 그대로 지구 셀식이다. 별도 좌표체계를 만들 필요가 없다 — 하나로 묶는 것이 아니라 이미 하나임을 선언하고 결선하면 된다.


(a) 지구 1:1 ↔ 27큐브/균형3진 — 단일 좌표체계

2층 분리 (Cesium/Google Earth 표준 패턴)

[렌더층]  WGS84 위경고 → ECEF 직교  → CSS-3D 카메라/지형
          (좌표변환.한선의 위경도_ECEF / ECEF_위경도 그대로, *1e6 정수)

[주소층]  위경고 → 트릿 지오해시(27셀 재귀) → 셀 점유·타일키·LOD·파인더
          (신규 트릿지오해시.한선)

렌더는 부동소수 정밀이 필요하니 ECEF, 주소·소유·검색은 트릿(정수·네이티브 연산). 이 분리가 깨지면 안 됨 — Cesium도 정확히 이렇게 한다.

트릿 지오해시 = 단일 주소체계

  • 한 깊이 = 위·경·고를 각각 3등분 → 3×3×3=27셀 → 셀번호 n∈0..26 (= 슬롯식과 100% 동일)
  • 깊이 d 주소 = d개의 셀번호열 (= 3d 트릿열). 깊이 = LOD = 줌 레벨.
  • 줌 휠 1틱 = 깊이 ±1 = 주소 트릿 1개 push/pop.
깊이셀 변 길이(수평, ≈적도/3^d)의미
7~305m도시 블록
11~3.8m방 단위 (what3words급) — 시작/정착 깊이
13~42cm가구 단위

4상 의미부여 (부팅스플래시/월드데스크톱과 통일된 T/O/A/U)

  • T = 사유지 (데이터·소유 셀)
  • O = 공용·도로 (명령·공공 허브)
  • A = 예약·체이닝 (상위셀 종속)
  • U = 경계/구분자 (셀 가장자리)

시작 → 정착

  1. navigator.geolocation.getCurrentPosition() (HTTPS 필수) → 위/경
  2. 트릿셀_인코딩(lat,lon,alt, 깊이=11) → 시작 셀 주소
  3. 그 셀 + 주변 26셀 로드, 카메라 시작
  4. 정착 = 그 셀 주소를 소유원장에 claim → 개인 데스크톱 루트
  5. 미허용 폴백: 마지막 셀 / 기본 도시

소유원장 (prefix 포함관계)

(트릿주소 | 소유자 | 깊이 | claim시각 | CIF해시) PSV — 셀맵.한선(셀생성/셀설정) 또는 블록체인 컨트랙트 앵커. 셀 A가 B를 포함 ⇔ A주소가 B의 prefix. 큰 셀 소유자는 하위 27셀 임대/분양 (parcel NFT의 3진판) → finance/뱅크/마켓 기존 모듈과 결합.

외부 지도 = 게이트웨이로만

geohash(32진)·S2(4진)·H3(육각)는 27큐브와 정합 안 됨. import/export 변환 함수만 두고 정본은 트릿 지오해시.

함정 회피 (메모리 반영)

  • 3등분에 (lo+hi)/2 금지 — v10 자연반올림 ceil 무한루프(feedback_hanseon_findspan). 경계는 lo+(hi-lo)/3, lo+2*(hi-lo)/3.
  • 절단나눗셈(v10.3) 사용, 좌표는 1e6 정수.
  • 정수 오버플로 주의 — 큰 곱은 단계 축소.

(b) 파인더 네비 = 프랙탈 27큐브

27큐브는 본질적으로 프랙탈이고 주소가 이미 계층적 → 파인더에 완벽히 맞는다.

핵심 4동사

  1. 공간 영속 (1셀1항목, 위치 절대불변): 각 항목은 고정 셀 주소에 영구 고정. 자동 재배치 금지, 자동회전 기본 OFF (공간기억 파괴 방지). 사용자가 옮긴 위치(curSlot)는 셀좌표.dat/맵에 한선씨 정본으로 영속.
  2. 프랙탈 진입 (동일 줌 제스처로 27→27 재귀): 셀 줌인 = 핵심 동사. 한 셀 줌인 → 그 셀이 또 27큐브. 계층: 지구→지역→방→폴더→파일. ESC = 부모 큐브.
  3. 균형3진 주소 = 빵부스러기 + 딥링크: 현재 주소 = 트릿열 슬래시 누적 (TT/OAT/OA/AT). 상단 빵부스러기 클릭 = 조상 점프. 미니맵 = 현재 큐브 평면 펼침 + 내 위치 하이라이트. (공짜 딥링크)
  4. 검색 → flyTo (공간이동 결합): 검색 입력 → 한선씨 인덱스 매칭 → 결과 클릭 시 카메라가 해당 셀로 비행(줌아웃·팬·줌인 곡선)하며 정면 회전 보간. 방문 셀 = 즉시점프, 미방문 = 부모 큐브 플라이스루(공간감 학습).

Lynch 인지지도 5요소로 정체성 부여

  • District (구역) = 층별 색 = 일하기층(T)/자산층(A)/사람층(O) 라벨
  • Landmark (랜드마크) = 각 층 중앙셀(n=13)을 크고 빛나는 허브 타워로
  • Path/Edge/Node = 셀 간 연결선·카메라 궤적·U 경계

한선씨 코어 책임 (world.js는 보간만)

경로주소(트릿열 슬래시 누적), 번호에서트릿(n→tx,ty,tz 역산), 검색 인덱스, flyTo 목표각 전부 월드데스크톱.한선에서 산출·방출.

crownyc 캡 함정 — 전체 트리 사전생성 금지

배열 4095·맵 729·문자열 65535 캡 때문에 보이는 큐브의 27셀만 on-demand 방출. 항목 위치·검색 매칭은 셀코어 룰로 추출해 점진 자율화.


(c) 다음 단계 구현 우선순위 6

흐름: 현재 큐브 폴리시(P1·P2) → 파인더 프랙탈(P3·P4) → 지구1:1(P5·P6)

P1. 큐브 렌더 안정화 + 폴리시 (즉시 — 버그 차단 최우선)

  • preserve-3d 파괴 속성 격리: overflow/filter/opacity<1/clip-path/mix-blend-mode/backdrop-filter#cube·.slot에서 제거, 리프 노드(.scr,.tb)에만. 현재 .win+.wbody overflow:hidden은 OK(자식 없음).
  • GAP 300→220px, perspective 2100→1700px, perspective-origin 50% 44%, 휠줌 min800/max2200. (27창 동시 가독성)
  • will-change 동적 스코핑: hover/drag 슬롯 1~3개에만 JS로 부여, 벗어나면 제거. (레이어 27→10 이하, DevTools Layers 패널로 ≤15 모니터)
  • depth cue: translateZ 양수일수록 래퍼 div(=.win-inner-wrapper, slot 직접 금지)에 opacity 0.65~1.0·scale 0.88~1.0.

P2. 셀 상태기계 한선씨화 + 셀좌표 영속 (한선씨를 진짜 WM으로)

  • 월드데스크톱.한선이 각 슬롯 4상 관리: T=활성 / O=대기 / A=숨김 / U=오류.
  • toau 실행 시 window.crownySlotStates=[...] 브릿지 → world.js가 CSS 반영: A→content-visibility:hidden, O→opacity-dim, T→will-change.
  • setSlot 드래그 = rAF throttle + setPointerCapture (dirty flag 패턴).
  • 사용자 이동 위치 → 셀좌표.dat 영속, 자동회전 OFF.

P3. 프랙탈 줌인 재귀 + 빵부스러기 (파인더 1단계)

  • 셀 줌인 동사 추가(현재 openWork 2D작업에 더해). 줌인 = 깊이+1, 주소 트릿 push. ESC = 부모.
  • 경로주소/번호에서트릿 한선씨 함수. 상단 클릭형 빵부스러기 + 미니맵.
  • on-demand 방출 (캡 회피).

P4. 검색 flyTo + District/랜드마크 (파인더 2단계)

  • 검색바 → 한선씨 인덱스 → flyTo 목표각 산출(한선씨) → world.js 보간만.
  • 층별 색 District 라벨 + 중앙셀(13) 랜드마크 타워.
  • 포커스 줌 2단계 분리: 1단계(180ms) 선택창 translateZ 전진+나머지 dim, 2단계(270ms) #work fade-in. spring = cubic-bezier(0.34,1.56,0.64,1). #work는 preserve-3d 바깥(fixed)에서 실행.

P5. 트릿 지오해시 라이브러리 + 외층 지구셀 (지구1:1 1단계)

  • 신규 트릿지오해시.한선 (libs): 트릿셀_인코딩/디코딩/포함판정/이웃27/geohash상호변환. 좌표변환.한선(ECEF)·지도투영.한선·기후디지털트윈지구.한선과 가져오기 결선.
  • 현재 27큐브를 "깊이1 지구셀의 27자식"으로 재해석. 휠줌 = 셀 깊이 전이.
  • 최상위 = 세계큐브, 내부는 트릿 주소로 추상화.

P6. geolocation 시작/정착 + 소유원장 (지구1:1 2단계)

  • getCurrentPosition → 깊이11 시작셀 → claim 정착 → 개인 데스크톱 루트.
  • 셀맵.한선 또는 블록체인 소유원장 PSV. finance/뱅크/마켓 결합 (땅 분양).

(d) CIF 통합 즉시 적용안

CIF는 벡터형 4상균형3진 씨앗(큐브=27트릿)을 트릿-트리로 저장 → 27창 배치와 구조적 1:1. 합성 그래픽(마을·배경·UI)은 단색 영역이 많아 트릿-트리가 깊이1에서 종료 → PNG 대비 수십~수백배 씨앗 절감(단색 FHD=1큐브, 로고 17영역=17큐브 실증).

즉시 적용 4스텝

  1. 브라우저 디코더 투입 (서버 의존 0): cif-decode.js(~55줄, server.js:149-198/693-804 추출) 작성 → assets/cif-decode.js. world-desktop.html<script> 포함. CifDecode(canvas, cifText) 호출. v2.1(좌표폭 없음)/v3(좌표폭:8) 자동 판별. (charToTrit/tritsToInt/pixel9ToRGB/parseSeedLine → fillRect)
  1. 월드 배경을 CIF 캔버스 오버레이: world-desktop.html<canvas id="cif-bg"> position:fixed; z-index:-1. window.onload에서 fetch('assets/마을.cif').then(r=>r.text()).then(t=>CifDecode(cifbg,t)). CSS-3D 창은 z-index:0+. canvas는 preserve-3d 비파괴 → 3D 안전.
  1. assets/ 사전 베이크 (오프라인): 빌드.sh에 단계 추가 —
hanseonc_high 시작화면생성.한선 > /tmp/gen.toau && crownyc run /tmp/gen.toau → PPM → /encode API(image.crowny.org:9872, {w,h,pixels}) → GET /image/:idassets/마을.cif 저장. 런타임엔 fetch+CifDecode만. - v3(좌표폭:8) 기본 — v2.1은 좌표 3트릿(±13)이라 13×13 모자이크로 깨짐.

  1. 셀 표면 LOD 핫스왑: 먼 줌단계 셀 표면 = CIF 썸네일(가볍고 무한 선명), 가까우면 창화면.한선 라이브 미니화면, 풀줌이면 실제 앱. 사진류만 원본 유지(CIF는 합성·그라데에 압도적, 사진은 역효과). 각 셀 = 트릿셀주소.cif 타일 캐시 = 깊이별 CIF 피라미드(Cesium quantized-mesh 3진판).

한선씨 인코딩 경로 (정본)

시작화면생성.한선/부팅스플래시-결선.한선에서 CIF변환기.한선CIF변환요청() → 픽셀배열 RGB → RGB를19683색+씨앗생성(x,y,색상코드)+CIF파일저장. 창 좌표를 씨앗생성에 직접 넣는 것이 가장 자연스러운 4상 통합 경로 (전체 데스크톱 스냅샷 = 27큐브 내외).


핵심 신규 산출물 요약

파일정본/글루역할
/Users/ef/CrownyOS/crownyc/libs/트릿지오해시.한선한선씨 정본 (신규)27셀 재귀 인코딩/디코딩/포함/이웃27/외부변환
/Users/ef/CrownyOS/시작화면/월드데스크톱.한선한선씨 정본 (확장)4상 상태기계 + 경로주소/번호에서트릿 + flyTo목표각 + 셀좌표 영속
/Users/ef/CrownyOS/시작화면/assets/cif-decode.js글루 (신규)브라우저 CIF v2.1/v3 디코더 ~55줄
/Users/ef/CrownyOS/시작화면/world.js글루 (유지)CSS-3D 컴포지팅·보간·will-change 동적·rAF drag만
/Users/ef/CrownyOS/시작화면/빌드.sh빌드 (확장)CIF 사전 베이크 단계
불변식: 좌표·주소·flyTo각·셀상태는 전부 한선씨에서 산출 → world.js는 보간/렌더만. 캡(배열4095·맵729·문자열65535) 때문에 전체 프랙탈 사전생성 금지, 보이는 27셀만 on-demand. 3등분은 절단나눗셈(v10.3), (lo+hi)/2 무한루프 회피.

구현 완료 (2026-06-21 이어서)

한선씨 정본 라이브러리 (전부 TOAU 컴파일·실행)

  • libs/지구셀.한선 — 트릿 지오해시(왕복 검증, 서울 오차~8m)
  • libs/네비드라이버.한선 — 네비 로직 9함수(JS와 27셀 1:1)
  • libs/셀원장.한선 — 셀 점유 원장 PSV(정착/충돌/소유, 검증 통과)
  • libs/CIF방출.한선 — 균형삼진 CIF v3 인코더
  • libs/창화면.한선 — 앱별 미니스크린 26종

브라우저 (한선씨 정본의 미러/드라이버)

  • geocell.js — 정수 자연반올림으로 지구셀.한선과 바이트 동일 주소(YEQBKBNZZLAJ ✓)
  • world.js — CSS-3D 컴포지터(궤도·프랙탈 진입·2D포커스·정착)
  • cif-decode.js — CIF v3 디코더(~55줄)
  • geocell-wasm.js + 지구셀.wasm(126KB) — 한선씨→WASM(TOAU 인터프리터, 트릿 보존), node 대조 5도시 PASS

검증

  • CIF: 한선씨→desktop-bg.cif(29씨앗·1.3KB)→브라우저 디코드 렌더 ✓
  • 지구네비: 홈(27앱)/줌아웃(27장소셀·현재위치 강조)/프랙탈 진입/정착 ✓
  • 기계어 매칭: geocell.js==지구셀.한선==WASM 동일 셀번호 ✓

보너스: runtime_mcu.c 버그 3건 수정(MCU/WASM 백엔드)

TSHR/TSHL·STR_FIND 미구현, 배열 힙 누수 → 수정. (crownyc.c 데스크톱 VM은 정상)

잔여

  • WASM wasm_run()은 main 1회 — 임의 입력은 wasm_in 버퍼+export 함수 필요
  • 셀원장 PSV 서버 연동(현재 브라우저 localStorage 데모)
  • ② 창 디테일 실데이터, 창 화면 실앱 iframe 확대

4병행 완료 (2026-06-21 3차)

  • ① 정착 서버: 시작화면/셀원장서버.한선 (한선씨 TCP HTTP :9935, cell-ledger 등록). API /api/cells·/api/cell·/api/claim(CORS). world.js 서버연동+localStorage 폴백. 검증: 정착(TICDEF)·자손충돌·조상조회 PASS, PSV 영속. 함정: TCP읽기(연결,16384) 버퍼크기 필수(없으면 0바이트).
  • ③ 창 디테일: 창화면.한선 9종 실데이터(뱅크 월별막대+거래·차트 꺾은선·메일 발신자/제목·날씨 시간별·미디어 진행바·문서/메모/파일/맵).
  • ④ WASM 임의좌표: 지구셀_입력.한선 + 지구셀.wasm(116KB) wasm_in 버퍼. node 40/40 일치(5도시×깊이1~8). GeoCell.encode WASM우선+JS폴백. 트릿 VM 직접 실행.
  • ② 실앱 URL: 월드데스크톱.한선 슬롯URL — design/docs/market/bank/tiomta/crowny.org(ext: 새탭), world(iframe 재귀). 2D 작업공간에 🔗열기 버튼.

4병행 2차 완료 (2026-06-21)

  • ① 셀 콘텐츠(공간=저장소): 셀콘텐츠서버.한선(:9936, /api/items·add, PSV cell-items.psv). 점유 땅 셀에 📝메모/🔗링크 배치·조회. 프론트=2D 콘텐츠 패널(world.js openItems). 함정: 서버 한글 %XX 미디코드→프론트 decodeURIComponent 읽기복원.
  • ② 줌 카메라 연출: world.js navTo() — 진입=scale확대→새셀, 상위=축소→부모 (CSS 트윈).
  • ③ 두근두근타운 배경: 배경베이크.한선 땅베이크()→ground-bg.cif(한선씨 트릿). world.js swapBackdrop() 깊이≥10이면 황혼마을, 얕으면 우주. 깊이 반응형.
  • ④ os.crowny.org 게이트웨이: gateway.yaml crowny-os 9194→9150 수정, 게이트웨이규칙.psv 9152→9150, os-site server.js(9150) 기동. 검증: 9150·8080(Host)·8443(SNI) 모두 200. 공개 https://os.crowny.org/world-desktop.html. 잔여: os-site LaunchAgent 미생성(사용자 launchctl).

구조 전환: 걸어다니는 마을 베이스 (2026-06-21, 울트라 오케스트레이션)

사용자 요청: 다닐 수 있는 마을이 베이스(걷거나 정지) → 상태창 누르면 27큐브 오버레이 → 닫으면 다시 이동. 큐브 한 칸=맥 바탕화면(여러 앱 배치+무엇 넣을지 설정). 하강 버튼 추가.
  • 딥리서치(walk/spaces/overlay 3갈래) → 병렬 구현. 딥리서치가 follow camera·click-to-move·AABB 슬라이딩·spaces 데이터모델·overlay 상태머신 spec 제공.
  • village.html(마을월드.한선)+village.js: town.js 복제→3인칭 추적 카메라(project에 target, 마을 밖 남쪽 camAzim180에서 안을 봄, fov58 광각), 플레이어 아바타(골드), WASD/화살표+클릭 이동, 집 AABB 충돌+경계 클램프, idle. 상태창 버튼→#cubeOverlay iframe(world-desktop.html) 띄움+paused, ×/ESC 닫으면 재개.
  • world.js 큐브 개선(워크플로 에이전트): #down 하강버튼(중앙자식 OOO=13), openDesk=칸별 멀티앱 바탕화면(localStorage crowny_space_addr_n), +앱추가 피커/×제거.
  • 진입: index(시작화면)→시작하기→village.html(걷기)→상태창→world-desktop(큐브)→칸=바탕화면.
  • 함정 재확인: town→village 복제 시 autoYaw 잔존 참조(lamp/fountain 펄스)→T로 교체. project look-at origin 하드코딩→target화. cam.fov 씬값33(망원)→58 광각. 카메라가 마을 안에 들어가면 근접건물 화면밖 폭발→밖에서 안 보기.

울트라리뷰 반영 (자체 적대 점검 후 수정)

리뷰 결과: 3페이지 렌더정상·콘솔에러0·한선씨컴파일OK·회귀없음. 수정한 Top 이슈:
  • restBtn(가만히) 죽은버튼 → resting 토글(이동정지/재개, 라벨 가만히↔이동). 검증 라벨전환 OK.
  • 프레임레이트 의존 lerp/이동 → 델타타임화(dt clamp 0.05, lerpK=1-(1-k)^(dt*60), SPD=13u/s, camPos dt). 고주사율 과속 해결.
  • 오버레이 열림 중 마을 rAF 계속 → paused면 frame()이 다음 rAF 중단, 닫을 때 lastT=0 후 재개(발열/배터리). cubeFrame 단일 재사용 확인.
  • ESC는 오버레이 열림 때만 닫기(isOverlayOpen). 충돌: box AABB 축분리 슬라이딩 + 나무/분수/가로등 원형충돌 추가, 경계 ±52.
잔여(낮음): 모바일 movementX 터치이동, fov58→한선씨 씬 walkFov 파라미터화, homePath geolocation 변경 시 슬롯키 드리프트(crowny_space_home_n 권장), town/village 렌더러 코어 중복 모듈화.

NPC 대화 + 이동 한선씨 정본화 (2026-06-21)

사용자 질문 "이동/대화가 한선씨로 작동하는가"에 대한 정면 해결:
  • 이동엔진.한선(정본): 이동벡터/박스충돌/원충돌/이동시도(축분리 슬라이딩+경계클램프), ×1000 고정소수점. JS(village.js)와 5케이스 ±0 완전일치(TOAU 5033 cubes). → 이동이 한선씨 기계어로 계산됨(JS=미러).
  • 대화.한선(정본): NPC 5명(토리/하나/바우/리나/모모) 대사트리, 두근두근타운 톤. 대화JSON스트림→window.DIALOGUE. village.js는 표시만(근접 힌트→스페이스/클릭 대사 진행, ESC 닫기, 대화 중 이동정지). 헤드리스 검증: 토리 대화 박스 정상.
  • 잔여반영: walkFov를 한선씨 씬 파라미터(씬걷기시야)로(정본화), 모바일 movementX→clientX델타.
  • 잔여(낮음): JS↔이동엔진.한선 런타임 연결(WASM 브릿지, geocell.wasm 패턴), town/village 렌더러 코어 모듈화, world.js 슬롯키 home 고정.