← 목록
기타 2026-07-21 5KB 읽기 6분

크라우니캐릭터 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 인코더를 순수 한선씨(절단나눗셈/ 절단나머지, 트릿 아닌 정수 산술)로 구현.

무엇을 했는지

  1. 내보내기.한선(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 앞 주석 삽입 생략, 무결성 우선).
  1. 내보내기테스트.한선(107줄, 신규) — 16항목(OBJ v/f개수, STL facet개수, glTF
version/accessor.count/base64존재, VRM 확장존재/humanBones, VRM비캐릭터거부, 검수타 파일미생성, float32 4개 정확값, float32고정, Base64버퍼 라운드트립). 0경고 컴파일, PASS 전항목 확인.
  1. 서버.한선_처리export&fmt=obj|stl|gltf|vrm 분기 추가(기존 JSON 내보내기
경로는 fmt 미지정 시 그대로 유지, 재작성 아님). 게이트 통과 시 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.character kickstart만 사용, 신규 데몬
기동 없음): 4포맷 curl 전부 {"ok":1,"gate":"티",...} 확인. VRM 비캐릭터 거부/검수 타 거부(subdiv=2)도 {"ok":0,"gate":"타"}로 정상 동작.
  • 크라우니코드: lookup HIT 3건(캐릭터내보내기.한선 OBJ/STL 스트림 재사용) / MISS
다수(float32, glTF조립, Base64버퍼, 내보내기포맷 등 신규 로직) / learn 추가 4건.

관련 파일

  • /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 머티리얼은 파츠별 색상이 아닌 단일 통합(첫 파츠 색상) — 스펙이 허용하는
"통합" 옵션 선택. 파츠별 컬러는 v2.1(정점컬러 또는 프리미티브 분리) 과제. 또한 float32바이트(절대값-기준값)*8388608 곱셈은 좌표가 매우 커지면(대략 절대값 >100만) VM 정수 오버플로(3^24≈1.412e11) 위험 — 캐릭터/소품/집/장비 기본 스케일(수천 단위 이하)에서는 안전, 코드 주석으로 명시.
  • three.js GLTFLoader 실파싱은 로컬 미설치로 생략(수동 node Buffer 디코드로 대체 검증).
  • 검증용 /private/tmp/.../scratchpad/gltf_verify.js는 1회성 교차검증 스크립트(scratchpad,
비배포)라 한선씨 동반 파일을 만들지 않음 — 제품 코드가 아닌 task 지시(node 교차검증) 자체가 목적인 검증 도구.