71 lines
6.1 KiB
Markdown
71 lines
6.1 KiB
Markdown
# 인터랙티브 리그 & 캐릭터 프로필 — 종합 핸드오프 (베이스)
|
|
|
|
> 상태: ✅ **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/<char>_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 <Profile> <prefix>`(피벗·춤) · `_tools/reactions_layout_render.py <Profile> <char>`(반응 목 정합 `_layout.json`). ⚠️ 리그 픽셀 계산은 **Python(PIL/numpy)** — PowerShell은 대소문자 변수 충돌 잦음.
|
|
|
|
## 3. 표준 프로필 구조 (`<Char>_Profile/` — 각자 자립)
|
|
```
|
|
<Char>_Profile/
|
|
README.md · 이미지작업_의뢰서.md(리그 파츠 요청)
|
|
01_Overview/ Purpose_and_Direction.md · Decisions.md
|
|
02_Architecture/ Architecture.md · Limits_and_Mitigations.md
|
|
03_Assets/
|
|
Reference/<char>_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. 지금 바로 볼 수 있는 것
|
|
각 `<Char>_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. 핵심 파일 포인터
|
|
- 리그: `<Char>_Profile/04_Rig/rig.json` · 클립: `05_Animation/dance_idle.json`
|
|
- 반응: `<Char>_Profile/06_Reactions/{reactions.json, _layout.json, clips/*.json}` · 런타임 `07_Viewer/reactions.html`
|
|
- 리그 파츠 재생성 요청서: `<Char>_Profile/이미지작업_의뢰서.md`
|
|
- 도구: `_tools/rig_pivots_render.py` · `_tools/reactions_layout_render.py`
|