Files
Dansori_Characters/INTERACTIVE_RIG_HANDOFF.md
T
2026-07-04 10:34:46 +09:00

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캐릭터 실증)

  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