# 인터랙티브 리그 & 캐릭터 프로필 — 종합 핸드오프 (베이스) > 상태: ✅ **4캐릭터(이소리·노을·하루카·이사벨) 리그 + 반응 런타임 완성.** 이 폴더가 베이스. > 범위: 캐릭터를 **앱에 탑재해 상황별로 반응**시키는 인터랙티브 시스템(코드 리그 + 반응) 전체. > 함께 보기: `README.md`(폴더 인덱스) · `향후_옵션.md`(반응 확장·mesh-warp) · `_tools/`(리그 도구). --- ## 0. 목적 Dansori 마스코트를 **코드 네이티브 경량 리그 + 하이브리드**로 앱에 탑재해, **상황별 제스처·표정·대사로 반응**하고 **배경에서 가볍게 춤**추게 한다. 이미지는 생성 AI, 모션·색·반응은 코드/데이터. ## 1. 확정 방향 (상세: 각 `*_Profile/01_Overview/Decisions.md`) - **하이브리드 표현**: ① 리그(앰비언트/열린 제스처·춤) + ② 베이크드 통짜포즈(팔짱·하트 등 자기-가림) + ③ 표정 프레임 스왑(감정/말하기). - **구현 레벨 = 코드 네이티브 경량 리그**(강체 컷아웃). **Live2D/Spine 미사용**(GUI 리깅→자동화와 상충). mesh-warp는 **옵션·후속**(`향후_옵션.md`). - **해부학 16파츠**: head·neck·chest·pelvis + (상완·전완·손)×2 + (허벅지·종아리·발)×2. - **얼굴 = 표정 프레임 스왑 20종** + 말하기 talk 프레임(유사 립싱크). - **모든 이미지 = 투명 알파 32-bit RGBA(`Format32bppArgb`), 배경 alpha=0.** 색상=코드(hairmask hue-shift), 동작=코드(리그 클립), 반응=데이터(시퀀서). ## 2. 리그 파이프라인 (검증 완료 — 4캐릭터 실증) 1. **시트** 확정(`03_Assets/Reference/_sheet.png`, 투명알파). 2. **마스터-슬라이스(풀캔버스)**: `이미지작업_의뢰서.md` → (a) 팔 벌린 A-포즈 마스터 1장 → (b) 16조각 슬라이스 → (c) **각 조각을 크롭 없이 520×900 마스터 제자리에 저장**. → 16장 스택 = 마스터 복원(같은 좌표계). 3. **관절 피벗 자동 산출**: `pivot = centroid(opaque(bone) ∩ opaque(parent))`. 눈대중 튜닝 0. 4. **풀캔버스 FK**: `world = parentWorld · T(tx,ty)·T(pivot)·R(rot)·T(-pivot)`, 파츠는 원점에 그림. 휴지=마스터. 5. **배경춤** 재생 + **반응**(baked 바디 + 표정 머리 목 정합·회전). > **핵심 교훈 1**: 타이트 크롭하면 위치정보가 사라져 정합 깨짐 → **풀캔버스 제자리** 필수. > **핵심 교훈 2 (occlusion-aware)**: 강체 이음새는 **옷이 가리면 안 보이고 맨살이면 보인다** → **노출 관절은 리지드, 가려진 관절만 회전.** 예) 이소리·이사벨=크롭탑/클럽 노출 → chest 리지드로 허리·미드리프 봉인. 하루카=얇은 블라우스 → 팔 진폭↓. 노을=오버사이즈 커버 → 자유. > **도구**: `_tools/rig_pivots_render.py `(피벗·춤) · `_tools/reactions_layout_render.py `(반응 목 정합 `_layout.json`). ⚠️ 리그 픽셀 계산은 **Python(PIL/numpy)** — PowerShell은 대소문자 변수 충돌 잦음. ## 3. 표준 프로필 구조 (`_Profile/` — 각자 자립) ``` _Profile/ README.md · 이미지작업_의뢰서.md(리그 파츠 요청) 01_Overview/ Purpose_and_Direction.md · Decisions.md 02_Architecture/ Architecture.md · Limits_and_Mitigations.md 03_Assets/ Reference/_sheet.png # 시트 Parts/Images/ # 리그 17(마스터+16 풀캔버스) Library/ BakedPoses·CoarseParts·Heads·Hairmasks·Accessories # 완성 자산(용도별 분류) Assets_Overview.md · Expressions_and_Poses.md 04_Rig/ rig.json(풀캔버스·피벗) · Rig.md 05_Animation/ dance_idle.json · Animation.md 06_Reactions/ Reactions.md · reactions.json · _layout.json · clips/*.json 07_Viewer/ index.html(배경춤) · reactions.html(반응) · Viewer.md 08_Roadmap/ Roadmap.md · App_Integration.md ``` - **이미지 2부류**: 리그 파츠(춤/앰비언트) + 베이크드 통짜포즈(자기-가림 반응). 프로필이 자립(소스 원본은 별도 아카이브). ## 4. 캐릭터별 현황 — ✅ 전부 완성 | 캐릭터 | 컨셉/팔레트 | 리그·춤 | Library | 반응(_layout+reactions.html) | dance 튜닝 | |---|---|---|---|---|---| | **이소리** LeeSori | EDM/DJ · 민트 | ✅ | ✅ 349 (Track+변형6) | ✅ idle/error/success (head short) | chest 리지드(미드리프) | | **노을** Noeul | 로파이 · 인디고+앰버 · 웜브라운 | ✅ | ✅ 98 (Cozy/Day/Night) | ✅ idle/error/success/**focus** (head wave) | 자유(전신 커버) | | **하루카** Haruka | 아이돌 · 사쿠라핑크 · 일본틴 | ✅ | ✅ 99 (Sailor/Idol/Witch) | ✅ idle/error/success (head twin) | 팔 진폭↓(블라우스) | | **이사벨** Isabel | 나이트글램 · 루비/골드 · 서양계 | ✅ | ✅ 99 (Club/Bikini/Ceo) | ✅ idle/error/success (head wave) | chest 리지드(노출 최대) | > 이사벨=실험 캐릭터(노출 완화·always clothed·서양계 얼굴). 노을=신규(낮 카페/밤 프로듀서). ## 5. 지금 바로 볼 수 있는 것 각 `_Profile/07_Viewer/` — **`index.html`**(배경춤) · **`reactions.html`**(트리거 버튼으로 안돼요/잘됐어요 등 반응). 브라우저 더블클릭. 상대경로 이미지 로드가 막히면 "파츠 PNG 다중"으로 지정. ## 6. 남은 것 (선택 — 상세 `향후_옵션.md`) - **반응 종류 확장**: 캐릭터별 시그니처 추가(기존 baked+표정 조합, 새 이미지 대부분 불필요). - **얼굴 mesh-warp**(옵션): 정밀 립싱크/중간 각도 고개돌림 필요 시 neck/head 국소 WebGL. - **앱 통합**: WPF-C# 이식 vs WebView2(`*/08_Roadmap/App_Integration.md`), 트리거 API `Mascot.React(상황키)`. ## 7. 핵심 파일 포인터 - 리그: `_Profile/04_Rig/rig.json` · 클립: `05_Animation/dance_idle.json` - 반응: `_Profile/06_Reactions/{reactions.json, _layout.json, clips/*.json}` · 런타임 `07_Viewer/reactions.html` - 리그 파츠 재생성 요청서: `_Profile/이미지작업_의뢰서.md` - 도구: `_tools/rig_pivots_render.py` · `_tools/reactions_layout_render.py`