크라우니캐릭터 v2 익스포터 — OBJ/STL/glTF/VRM 실물 임포트 파일
개요
crowny-character(:9615) 에셋을 Blender/three.js가 실제로 임포트하는 파일(OBJ/STL/glTF
2.0/VRM)로 방출하는 v2 익스포터. 정본 스펙: /Users/ef/crowny-character/내보내기_스펙.md.
핵심 재사용 자산: float32바이트 — IEEE-754 float32 LE 인코더를 순수 한선씨(절단나눗셈/
절단나머지, 트릿 아닌 정수 산술)로 구현.
무엇을 했는지
내보내기.한선(389줄, 신규) — 포맷 4종 진입점 `내보내기포맷(타입,lod,섭디비전,
float32바이트(버퍼,위치,정수값) / float32바이트고정(버퍼,위치,분자,분모) — IEEE-754
float32 LE 인코더. 4개 정확값(1.0/2.0/0.0/-1.0)과 실제 월드좌표(-300~2100 등) 양쪽 모두
node Buffer.readFloatLE로 정합 확인.
- OBJ/STL은 재발명 금지 원칙에 따라 기존 /Users/ef/CrownyOS/crownyc/pkg/libs/캐릭터내보내기.한선
(모델OBJ스트림/모델STL스트림, 크라우니코드 학습DB에 이미 HIT)을 그대로 재사용.
- glTF/VRM은 신규: POSITION(float32 LE)+indices(uint16 LE) 단일 버퍼, base64 임베드.
Base64.한선의 Base64인코딩()은 UTF-8 문자열 경유라 0~255 원시바이트를 손상시키므로
(_UTF8바이트들가 128↑ 코드포인트를 2바이트로 재인코딩) 별도 버퍼 전용 base64 인코더
(_Base64인코딩버퍼/_Base64디코딩버퍼/_Base64버퍼경로쓰기)를 Base64.한선의
인코딩테이블()/_절단몫/_절단나/디코딩테이블()을 재사용해 작성(문자열 65535B 캡
회피용 4000자 청크 스트리밍 포함).
- VRM은 glTF + extensions.VRM(humanoid 24본 최소, 전부 node 0에 매핑 — 정적 박스메시라
실스키닝 없음, 문서화된 근사), extensionsUsed. 타입≠캐릭터면 -1 거부.
- 4상 검수 게이트: 타(-1)/음(-2)이면 파일 안 쓰고 즉시 반환. 옴(0)은 glTF/VRM extras에
경고 필드 삽입(STL은 ASCII 규격상 solid 앞 주석 삽입 생략, 무결성 우선).
내보내기테스트.한선(107줄, 신규) — 16항목(OBJ v/f개수, STL facet개수, glTF
PASS 전항목 확인.
서버.한선—_처리export에&fmt=obj|stl|gltf|vrm분기 추가(기존 JSON 내보내기
data/<원본type>.<ext>
방출 + {"ok":1,"gate":..,"bytes":N,"path":..}, 거부 시 {"ok":0,"gate":"타"}.검증 결과 (전부 실측)
- 컴파일: 3파일 모두 STRICT 0경고.
- 한선씨 유닛테스트:
PASS 전항목(16/16). - node 교차검증(JSON.parse + Buffer.readFloatLE/readUInt16LE): glTF/VRM 둘 다
asset.version==="2.0", base64 디코드 길이==byteLength, base64 재인코딩 왕복 완전일치,
accessor.count×componentByte×typeN==bufferView.byteLength(POSITION/indices 둘 다),
디코드된 float 값이 원본 정수 월드좌표(-300, 1500, -300 등)와 정확히 일치, 인덱스 전부
유효범위(0~47) 확인. three.js 미설치라 GLTFLoader 파싱은 생략(명시).
- 라이브 서버(:9615, 기존 LaunchAgent
org.crowny.characterkickstart만 사용, 신규 데몬
{"ok":1,"gate":"티",...} 확인. VRM 비캐릭터 거부/검수 타
거부(subdiv=2)도 {"ok":0,"gate":"타"}로 정상 동작.
- 크라우니코드: lookup HIT 3건(캐릭터내보내기.한선 OBJ/STL 스트림 재사용) / MISS
관련 파일
/Users/ef/crowny-character/내보내기.한선(신규, 389줄)/Users/ef/crowny-character/내보내기테스트.한선(신규, 107줄)/Users/ef/crowny-character/서버.한선(수정, fmt 분기 추가)/Users/ef/crowny-character/서버.toau(재컴파일 반영)/Users/ef/CrownyOS/crownyc/pkg/libs/캐릭터내보내기.한선(기존, OBJ/STL 재사용)/Users/ef/crowny-character/내보내기_스펙.md(정본 스펙)
잔여 이슈
- glTF/VRM 머티리얼은 파츠별 색상이 아닌 단일 통합(첫 파츠 색상) — 스펙이 허용하는
float32바이트의 (절대값-기준값)*8388608 곱셈은 좌표가 매우 커지면(대략 절대값
>100만) VM 정수 오버플로(3^24≈1.412e11) 위험 — 캐릭터/소품/집/장비 기본 스케일(수천 단위
이하)에서는 안전, 코드 주석으로 명시.
- three.js GLTFLoader 실파싱은 로컬 미설치로 생략(수동 node Buffer 디코드로 대체 검증).
- 검증용
/private/tmp/.../scratchpad/gltf_verify.js는 1회성 교차검증 스크립트(scratchpad,