6.1 KiB
인터랙티브 리그 & 캐릭터 프로필 — 종합 핸드오프 (베이스)
상태: ✅ 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캐릭터 실증)
- 시트 확정(
03_Assets/Reference/<char>_sheet.png, 투명알파). - 마스터-슬라이스(풀캔버스):
이미지작업_의뢰서.md→ (a) 팔 벌린 A-포즈 마스터 1장 → (b) 16조각 슬라이스 → (c) 각 조각을 크롭 없이 520×900 마스터 제자리에 저장. → 16장 스택 = 마스터 복원(같은 좌표계). - 관절 피벗 자동 산출:
pivot = centroid(opaque(bone) ∩ opaque(parent)). 눈대중 튜닝 0. - 풀캔버스 FK:
world = parentWorld · T(tx,ty)·T(pivot)·R(rot)·T(-pivot), 파츠는 원점에 그림. 휴지=마스터. - 배경춤 재생 + 반응(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), 트리거 APIMascot.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