Consolidate character profiles and image production docs

This commit is contained in:
eKeerar
2026-07-04 12:54:11 +09:00
parent 351c3d65ad
commit f8db111d71
1366 changed files with 3743 additions and 21740 deletions
+16 -39
View File
@@ -1,47 +1,24 @@
# 확정 결정 로그 (Decisions)
# Decisions
> 논의를 통해 확정된 결정과 근거. 뒤집을 땐 여기에 사유와 함께 갱신.
## 최종 폴더
## D1. 표현 방식 = 하이브리드 (확정)
리그 + 베이크드 포즈 + 표정 프레임 스왑을 상황별로 조합.
- **근거**: 리그는 앰비언트/열린 제스처에 강하고, 팔짱·하트 같은 자기-가림 포즈는 베이크드 이미지가 자연스럽다. 각자의 강점만 사용.
- LeeSori의 최종 기준 폴더는 `LeeSori_Profile`이다.
- 프로필, 이미지, Live2D, 리그, 댄스 모션, 앱 통합 문서는 모두 이 폴더 안에서 관리한다.
## D2. 구현 레벨 = 코드 네이티브 경량 리그 (확정, Live2D/Spine 배제)
- **근거**: Live2D/Spine의 리깅은 **독점 GUI 에디터에서 사람이** 하는 작업 → **AI 자동화 목적과 상충**. 우리 코드로 리그/모션/반응을 소유하면 데이터(JSON)만으로 자동화·반복이 가능.
## 런타임 방향
## D3. 분절 = 완전 해부학 16파츠 (확정)
head·neck·chest·pelvis + (상완·전완·손)×2 + (허벅지·종아리·발)×2.
- **근거**: 팔꿈치·무릎·손목·목·허리가 실제로 접혀야 제스처/춤이 자연스럽다.
- DansoriEQ에서는 가벼운 웹 기반 캐릭터 호스트를 사용한다.
- 단기 앱 적용은 파츠 기반 런타임으로 처리한다.
- 장기 제작 기준은 Live2D Cubism에서 사용할 수 있는 세분화 파츠와 파라미터 세트다.
## D4. 얼굴 = 표정 프레임 스왑 (확정)
20종 표정 이미지 교체 + 말하기 = talk 프레임 순환(유사 립싱크).
- **한계 인지**: 눈+입이 세트로 고정 → "감정+정밀 립싱크 동시"는 불가. 필요 시 D7로 승급.
## 댄스 기준
## D5. 자기-가림 포즈 = 베이크드 이미지 (확정)
팔짱(armscross)·하트(heart) 등은 리그 보간 대신 **통짜 포즈 이미지**로. (기존 표준 18제스처 자산 재사용.)
- 주 댄스 레퍼런스는 `Solo Dance 3`다.
- 모션 목표는 몸 중심 이동, 흉곽/골반 counter motion, 팔 lift arc, 손목 roll, 손가락 변화, 헤어 secondary motion이다.
- 팔 중복을 방지하기 위해 파츠는 겹침이 명확히 통제된 레이어로 분리한다.
## D6. 투명 알파 필수 (확정)
모든 파츠/프레임 = 32-bit RGBA(`Format32bppArgb`), 배경 alpha=0. 24-bit·매트 배경 금지.
## 자산 관리
## D7. mesh-warp(그리드 변형) = 옵션·후속 (보류)
목/얼굴 국소 mesh-warp(WebGL)로 목 이음새·정밀 립싱크·중간 각도 고개돌림을 승급.
- **승급 조건**: 강체 리그로 목/얼굴이 실제로 부족할 때, 그 부위에만 국소 도입. 전신 적용 안 함.
## D8. 이미지 = ChatGPT 자동생성 (확정)
사람이 안 그림. 생성용 `.md` 스펙을 우리가 제공.
## D9. 색상·모션 = 코드/데이터 (확정)
색 변형 = hairmask hue-shift. 모션 = 리그 클립. 반응 = 시퀀서 데이터.
## D10. 폴더 통합 (확정)
`LeeSori_Rigging`**`LeeSori_Profile`로 통합, Rigging 폐기.** 시트 표준 위치 = `03_Assets/Reference/sori_sheet.png`.
## D11. 리그 파츠 생성 = 마스터-슬라이스 우선, 개별생성 폴백/attachment (확정)
- 핵심 16파츠는 **마스터 1장 → 로컬 슬라이스**(같은 좌표계 → 관절 자동 정합, 접합 오차↓)가 **1순위**. 파츠 개별 생성은 그 **폴백**(같은 16파츠를 만드는 대체 방법 — 둘 다 만들 필요 없음).
- **슬라이스 출력 = 풀캔버스**: 각 파츠는 **크롭 없이 마스터와 동일한 520×900 캔버스에 제자리 배치**(그 외 투명). 16장 스택 시 마스터 복원 → 위치정보 보존, 앵커 튜닝 불필요. (타이트 크롭하면 위치정보가 사라져 정합이 깨짐.)
- **단 마스터에 없는 변형 파츠**(핑거하트·주먹·가리킴 등 대체 손 attachment)는 **개별 생성으로만** 가능 → 그 용도엔 개별 생성이 별도로 필요.
- **근거**: 슬라이스는 좌표 정합에 강함(반복 수정 원인 제거). 생성 AI는 픽셀 좌표를 못 맞추므로 접합 좌표는 **생성 후 이미지에서 측정**(정규화 앵커 `imgAnchor`)해 `rig.json`에 저장.
## 열린 결정 (미확정)
- **O1. 최종 런타임 호스트**: 프로토타입=웹(Canvas). 본체=WPF. WPF에 동일 리그/시퀀서를 이식(C#) 할지, 아니면 WebView2로 웹 런타임을 임베드할지 → `../08_Roadmap/App_Integration.md` 에서 결정 예정.
- **O2. 대사 표시**: 말풍선 캡션 vs TTS 음성 vs 둘 다.
- 모든 의상, 포즈, 제스처, 파츠는 재사용 가능한 카테고리로 분류한다.
- 앱 적용용 baked pose와 Live2D용 source part를 구분한다.
- 임시 확인 이미지와 작업용 디버그 파일은 캐릭터 패키지에 포함하지 않는다.
@@ -1,26 +1,24 @@
# 목적과 방향 (Purpose & Direction)
# Purpose and Direction
## 최종 목적
이소리를 **앱에 탑재된 인터랙티브 마스코트**로 만든다. 사용자의 행동·앱 상태(상황)에 따라 캐릭터가 **적절한 제스처·표정·대사로 반응**해 살아있는 느낌을 준다.
LeeSori는 음악, EQ, 재생 상태, 작업 흐름을 시각적으로 안내하는 메인 캐릭터다. 핵심 인상은 차분한 전문성, 밝은 반응성, 음악 작업에 익숙한 디지털 파트너다.
## 대표 사용 시나리오 (상황 → 반응)
| 상황(트리거) | 반응 |
|---|---|
| 오류/금지된 동작 | 팔짱 끼고 인상 쓰며 고개 저으며 **"안돼요"** |
| 성공/완료/칭찬 | 손 하트 그리며 밝게 **"잘됐어요"** |
| 대기/유휴(배경) | 가볍게 **춤추는** 루프(앰비언트) |
| (확장) 인사 | 손 흔들며 "안녕하세요" |
| (확장) 안내/설명 | 한 손 제시(present) + 말하기 |
| (확장) 생각중/로딩 | 갸웃 + thinking 표정 |
> 확장 반응은 같은 프레임워크로 계속 추가한다(`../06_Reactions/Reactions.md`).
## 캐릭터 역할
## 방향성 (핵심 원칙)
1. **AI 자동화**: 모든 캐릭터 이미지는 **ChatGPT로 생성**(각 생성용 `.md` 스펙 제공). 사람이 그리지 않는다.
2. **동작·색상은 코드/데이터**: 모션(리그 클립)·반응 시퀀스·색 변형(hairmask hue-shift)은 이미지가 아니라 코드/데이터. → 재사용·자동화·경량.
3. **하이브리드 표현**: 상황에 맞춰 **리그(앰비언트/열린 제스처)** + **베이크드 포즈(자기-가림 포즈)** + **표정 프레임 스왑(감정/말하기)** 을 조합.
4. **경량·포터블**: 에디터/외주 없이 **우리 코드**로 리그·모션·반응을 소유. 데이터(JSON)는 뷰어(웹)와 WPF 앱이 동일하게 사용.
5. **투명 알파 필수**: 모든 파츠/프레임은 32-bit RGBA(`Format32bppArgb`), 배경 alpha=0.
6. **점진적 품질 상향**: 강체 리그로 시작 → 필요한 곳(목/얼굴)만 **mesh-warp** 국소 승급(옵션).
- 사용자의 명령을 기다리는 대기 상태 표현
- 분석/처리 중인 상태 표현
- 완료, 오류, 음소거, 경고 등 앱 상태 피드백
- 음악 관련 행동과 감정 표현
- DansoriEQ의 브랜드 캐릭터 역할
## 범위 밖(당분간 안 함)
- Live2D/Spine 도입(GUI 리깅=자동화와 상충). 전신 mesh-warp. 3D. 정밀 음소 립싱크(얼굴 mesh-warp 승급 시 재검토).
## 시각 방향
- 헤드셋과 청록 계열 포인트를 주요 식별 요소로 사용한다.
- 상체 중심 표현에서 얼굴, 손, 팔, 상체 실루엣이 명확히 보여야 한다.
- 앱 우측 패널에서는 무릎 위부터 머리끝까지 보이는 구도를 기본으로 한다.
- 과도한 장식보다 반복 사용에 견디는 선명한 실루엣과 안정적인 파츠 분리를 우선한다.
## 모션 방향
- idle은 사용자의 명령을 기다리는 상태로 자연스럽고 과하지 않게 유지한다.
- dance는 Solo Dance 3 기준으로 상체 리듬, 팔 올림, 손목 회전, 손바닥 방향, 헤어 follow-through를 포함한다.
- 모션은 정지 이미지 컷 전환이 아니라 파츠 리그, 보정 파츠, z-order 이벤트, easing curve로 구성한다.
+28 -45
View File
@@ -1,50 +1,33 @@
# 아키텍처 (Architecture)
# Architecture
## 레이어 모델
```
[상황 이벤트] 예: "error" / "success" / "idle"
[트리거 매퍼] reactions.json 상황키 → 반응 클립 이름
[반응 시퀀서] clips/<name>.json 타임라인으로 아래 레이어들을 조율
├─ Body 레이어 ── 리그 클립(rig.json+track) │ 또는 │ 베이크드 포즈 이미지
├─ Face 레이어 ── 표정 프레임 스왑(neutral/negative/love/…)
├─ Mouth 레이어 ── 말하기(talk 프레임 순환, 유사 립싱크)
├─ Transform 레이어 ── 리그 위에 덧입히는 잔모션(고개젓기·바운스)
└─ FX/Caption 레이어 ── 말풍선·효과음(옵션)
[컴포지터] 파츠 합성 + 표정 오버레이 + 앵커 정렬(AlphaTools 재활용)
[렌더러] Canvas(웹 프로토타입) / WPF(본체) — 60fps
```
LeeSori 패키지는 캐릭터 설정, 이미지 라이브러리, Live2D 파츠, 리그, 모션, 앱 통합 자료를 한 폴더 안에서 관리한다.
## 레이어 책임
- **Body**: 캐릭터 몸의 자세/모션. 두 모드.
- `rig` 모드 = 16파츠 리그를 클립으로 구동(앰비언트·열린 제스처·전환).
- `baked` 모드 = 통짜 포즈 이미지 1장(자기-가림 포즈: 팔짱·하트).
- **Face**: 감정 = 표정 프레임 교체(머리 이미지 스왑).
- **Mouth**: 말하기 = talk/neutral 프레임 순환(유사 립싱크). *정밀 립싱크는 mesh-warp 승급 시.*
- **Transform**: 리그 본에 delta를 더하는 잔모션(고개 좌우·호흡·바운스). Body가 baked여도 전체 트랜스폼은 적용 가능.
- **FX/Caption**: 말풍선 텍스트·효과음(옵션).
## 구성 계층
## 하이브리드 선택 규칙 (언제 무엇을)
| 상황 | Body 모드 | 근거 |
|---|---|---|
| 배경춤·유휴·호흡 | **rig** | 부드러운 앰비언트, 자산 최소 |
| 손 흔들기·가리키기·제시·박수 | **rig** | 열린 자세 → 리그로 자연스러움 |
| 고개 끄덕/젓기 | **rig**(Transform) | 작은 각도 + 가림 |
| 팔짱·핑거하트·볼하트 | **baked** | 손이 몸에 겹침 → 리그는 뚫림/어색 |
| 큰 감정 포즈(만세·좌절) | **baked** 또는 rig(joy/cheer) | 필요 정밀도에 따라 |
1. Character Identity
- 이름, 역할, 성격, 주요 시각 요소
2. Asset Library
- 헤드, 의상, 포즈, 액세서리, baked pose
3. Live2D Source
- PSD, 레이어 PNG, 레이어 manifest, 파츠 분리 기준
4. Rig
- bone hierarchy, pivot, z-order, deformation group
5. Motion
- idle, reaction, dance, transition, loop segment
6. Runtime Integration
- DansoriEQ 캐릭터 호스트, 상태 매핑, 제스처 레지스트리
## 전환 (transition)
- rig→rig: 트랜스폼 보간(부드럽게).
- rig↔baked: 짧은 **크로스페이드**(150~250ms) 또는 리그로 근사 진입 후 스냅.
- 반응 종료 후 `return` 지정 클립(보통 `idle`/`dance_idle`)으로 복귀.
## 최종 자산 원칙
## 데이터 재사용
- `rig.json`·클립·`reactions.json`·표정/포즈 이미지는 **웹 뷰어와 WPF가 동일하게** 사용(플랫폼 독립 데이터).
- 앵커 정렬은 기존 `Character_Builder/AlphaTools.cs`(알파 기반 목/어깨 검출) 로직을 재활용.
- 원본 제작 자산과 앱 런타임 자산을 같은 패키지에서 추적한다.
- 파일명은 캐릭터, 의상, 파츠, 상태, 방향을 식별할 수 있어야 한다.
- 파츠는 독립 회전/변형이 가능한 단위로 분리한다.
- 겹침이 필요한 영역은 z-order 이벤트나 보정 파츠로 관리한다.
## 주요 데이터
- `layer_manifest.json`: Live2D 레이어 구조
- `rig.json`: 앱/뷰어용 리그 정의
- `live2d_parameters.json`: Live2D 파라미터 정의
- `live2d_motion_plan.json`: 모션 설계 데이터
- `reactions.json`: 상태별 제스처 매핑
@@ -1,26 +1,23 @@
# 한계와 완화 (Limits & Mitigations)
# Limits and Mitigations
강체 컷아웃 + 프레임 스왑의 본질적 한계와, 우리가 쓰는 완화책. 그리고 mesh-warp 승급 기준.
## 리그 한계
## L1. 관절 이음새 (강체 회전)
- **문제**: 파츠를 크게 회전하면 관절 경계가 벌어지거나 겹침(특히 목). 분절을 늘려도 **근육 연속성은 해결 안 됨**(강체의 본질).
- **완화**: ① 회전 각도 작게 ② 피벗 낮게 ③ **근위단 오버랩 스텁**(부모가 틈을 덮음) ④ 옷깃/머리/초커로 **가림** ⑤ z-순서.
- **잔여 위험**: 큰 각도 고개돌림·큰 팔동작은 여전히 티남 → baked 포즈로 우회 또는 L4 승급.
Live2D 수준의 자연스러운 움직임은 단일 전신 이미지나 큰 팔 파츠만으로 만들 수 없다. 자연스러운 결과를 위해서는 상체, 팔, 손, 손가락, 머리카락, 의상 보정 파츠가 필요하다.
## L2. 립싱크 (프레임 스왑 얼굴)
- **문제**: 표정이 눈+입 세트 고정 → "특정 감정 + 정밀 입모양" 동시 불가.
- **완화**: 감정 표정 + 고개짓 + talk/neutral 프레임 순환으로 **뉘앙스 전달**. 필요하면 **감정+talk 조합 머리**를 소수 추가 생성(`../03_Assets/Expressions_and_Poses.md`).
- **잔여 위험**: 음소 단위 정밀 립싱크는 불가 → L4 승급.
## 보완 원칙
## L3. 자기-가림 포즈
- **문제**: 팔짱·하트 등 손이 몸/반대팔에 겹치는 포즈는 리그로 뚫림.
- **완화**: **baked 포즈 이미지**로 대체(기존 18제스처 자산). 진입은 크로스페이드.
| 한계 | 보완 방식 |
|---|---|
| 팔 전체가 한 파츠이면 팔꿈치가 굽혀지지 않음 | 상완, 팔꿈치 보정, 전완, 손목, 손, 손가락 파츠 분리 |
| 상체가 회전하면 의상 라인이 끊김 | 가슴/복부/자켓/후드/지퍼 보정 파츠 추가 |
| 손바닥 방향이 바뀌지 않음 | palm, backhand, side hand, fist, open hand 상태 추가 |
| 머리카락이 몸과 함께 굳어 보임 | 앞머리, 옆머리, 뒷머리, 끝머리 sway 파츠 분리 |
| 팔이 몸 앞뒤를 오갈 때 어색함 | z-order 이벤트와 occlusion mask 사용 |
| 정지 이미지 전환처럼 보임 | motion curve, easing, overshoot, follow-through 적용 |
## L4. mesh-warp 승급 (옵션·후속)
- **무엇**: 목/얼굴에 그리드 메시를 씌워 **피부 늘어남·입/눈썹 독립 변형·중간 각도 고개돌림**을 구현(WebGL). 우리 런타임 내 구현 → 자동화 유지.
- **승급 조건(하나라도 강하게 필요할 때)**: (a) 목 이음새가 baked/가림으로도 부족 (b) 감정+정밀 립싱크 동시 필요 (c) 중간 각도 고개돌림 필요.
- **한계(승급해도)**: 큰 각도(대략 30°↑) 고개돌림은 **가려진 반대면이 없어** 여전히 각도별 머리 아트 추가가 필요. 자동 워프가 없는 면을 만들지는 못함.
- **원칙**: 전신 아님, **국소(neck/head)만**. 품질 튜닝은 스크린샷 피드백 루프.
## 품질 기준
## 요약
> 강체+프레임스왑으로 **대부분의 상황 반응은 충분히 자연스럽게** 만든다(가림·baked·잔모션 조합). 정밀 립싱크/큰 고개돌림만 별도 승급(L4/각도 아트) 대상.
- 팔은 한쪽당 최소 상완/전완/손 3단계 이상으로 나뉜다.
- 손은 최소 relaxed, open palm, fist, pointing 상태를 갖는다.
- 상체는 neutral, left bend, right bend, forward bend, chest-up 보정이 가능해야 한다.
- 댄스 루프는 2.5~4초 단위로 재사용 가능해야 한다.
+15 -23
View File
@@ -1,28 +1,20 @@
# 자산 전체 맵 (Assets Overview) — LeeSori
# Assets Overview
> ✅ **완성** — 리그·소스 이미지·Library·반응 런타임 모두 완비. 프로필 자립(소스 원본은 별도 아카이브).
LeeSori 자산은 앱 적용과 Live2D 제작을 모두 지원한다.
## 자산 (전부 프로필 내)
| 종류 | 개수 | 위치 |
## 자산 범주
| 범주 | 위치 | 내용 |
|---|---|---|
| 시트 | 1 | `Reference/sori_sheet.png` |
| 리그 파츠(마스터+16 풀캔버스) | 17 | `Parts/Images/` — 피벗 산출·배경춤 검증 완료 |
| 베이크드 포즈 | 다수 | `Library/BakedPoses/` (Track·Campus·CeoPantsuit·DressLong·DressShort·Jeans·Tshirt) |
| 레거시 파츠 | — | `Library/CoarseParts/` (의상별 5) |
| 표정 프레임 | 20/헤어모양 | `Library/Heads/` (반응 head base `sori_head_short`) |
| hairmask / 악세서리 | — | `Library/Hairmasks/` · `Accessories/` |
| `_layout.json` | — | `06_Reactions/` (반응 바디↔머리 목 정합) |
> **이미지 2부류**: ① 관절 분할 파츠(`Parts/`, RIG용) + ② 통짜 포즈(`Library/BakedPoses/`, baked용). 역할 분담.
| Reference | `03_Assets/Reference` | 기준 이미지, A-pose, 시트 |
| Parts | `03_Assets/Parts` | 앱/리그용 기본 신체 파츠 |
| Live2D | `03_Assets/Live2D` | PSD, 레이어 PNG, manifest, preview |
| Library | `03_Assets/Library` | 의상, 헤드, 포즈, 액세서리, 변형 자료 |
| Dance | `03_Assets/Dance` | Solo Dance 3 포즈/프레임/리그 자료 |
## 뷰어 (더블클릭 재생)
- 배경춤: `07_Viewer/index.html`
- 반응: `07_Viewer/reactions.html` — 트리거 idle / error / success
## 제작 기준
## dance 튜닝 (occlusion-aware)
크롭탑으로 **미드리프(맨살) 노출**`dance_idle`에서 **chest 트랙 없음(골반에 리지드)** 으로 허리 이음새 봉인. 스웨이는 pelvis가 상체 통째로.
## 반응 매핑
| 상황 | Body(baked) | Face |
|---|---|---|
| error | `sori_body_track_armscross` | `sori_head_short_negative` |
| success | `sori_body_track_heart` | `sori_head_short_love` |
- 원본과 파생 이미지는 폴더로 분리한다.
- 앱용 preview와 제작용 source layer를 혼동하지 않는다.
- 손, 팔, 머리카락, 의상 라인은 독립 파츠와 보정 파츠를 모두 갖춘다.
- 파츠가 겹치는 경우 목적과 z-order를 manifest에 기록한다.
+61 -39
View File
@@ -1,47 +1,69 @@
# Rig.md — 스켈레톤 정의 (`rig.json`, 풀캔버스 모드)
# Rig Specification
경량 리그 뼈대. 뷰어(`../07_Viewer/index.html`)와 WPF 앱이 동일하게 읽는다.
LeeSori 리그는 앱 런타임용 경량 파츠 리그와 Live2D 제작용 세분화 리그를 함께 고려한다.
## 모델: 풀캔버스 (full-canvas)
- 각 파츠 PNG = **520×900 풀캔버스**, 파츠가 **마스터 제자리**에 있음.
- 렌더러는 파츠를 **원점(0,0)에 그리고, 관절 피벗을 중심으로 회전**한다.
- **휴지 자세(모든 rot/tx/ty=0)** 에서는 모든 월드행렬 = 단위행렬 → 16장 스택 = 마스터 복원.
- 그래서 **위치 앵커 튜닝이 필요 없다**(위치는 이미 파츠에 baked).
## 기본 계층
## 본 계층
```
pelvis (root)
├─ chest
│ ├─ neck ─ head
│ ├─ upperarm_r ─ forearm_r ─ hand_r (캐릭터 오른팔 = 화면 왼쪽)
│ └─ upperarm_l ─ forearm_l ─ hand_l
├─ thigh_r ─ shin_r ─ foot_r
└─ thigh_l ─ shin_l ─ foot_l
```
- Root
- Pelvis
- Abdomen
- Chest
- Neck
- Head
- Hair groups
- Left arm groups
- Right arm groups
- Left leg groups
- Right leg groups
- Clothing overlays
- Accessory overlays
## 필드 (bones[])
| 필드 | 의미 |
|---|---|
| `name` | 본 이름(= 애니메이션 트랙 키) |
| `parent` | 부모(root=null). 배열은 부모 먼저 |
| `pivot` `[x,y]` | **회전 중심 = 관절 좌표**(520×900 캔버스 픽셀). **파츠 오버랩 centroid로 자동 산출** |
| `z` | 그리기 순서(작을수록 뒤) |
| `image` | 파츠 PNG(`imageBase`+이 값), 520×900 풀캔버스 |
## 필수 파츠
## FK (렌더 수식)
```
world[bone] = world[parent] · Mlocal
Mlocal = T(tx,ty) · T(pivot) · R(rot) · T(-pivot) // rot/tx/ty = 애니메이션 delta
draw: setTransform(world); drawImage(part, 0, 0) // 원점에 그림
```
### Body
## 피벗 산출(자동)
`pivot(bone) = centroid( opaque(bone) ∩ opaque(parent) )` — 인접 파츠의 오버랩 영역 무게중심 = 관절. (스크립트로 1회 산출해 여기 박음. 파츠 교체 시 재산출.)
- pelvis
- abdomen
- chest
- neck
- head
- breast/cloth corrective overlays
- waist/hip corrective overlays
## 검증됨
- 16파츠 스택 = 마스터(missed 0 / extra 0.03%).
- 자동 피벗으로 `dance_idle` 재생 시 관절이 자연스럽게 회전(헤드리스 렌더 t=0/0.5/1.0/1.5 확인).
### Arms and Hands
## 튜닝 (필요 시)
- 관절 회전축이 어긋나면 해당 `pivot` 미세조정. 겹침 순서는 `z`.
- 큰 각도에서 이음새가 보이면 애니 진폭↓ 또는 후속 mesh-warp(`../02_Architecture/Limits_and_Mitigations.md`).
- upperarm L/R
- elbow corrective L/R
- forearm L/R
- wrist cuff L/R
- palm L/R
- backhand L/R
- finger groups L/R
- hand pose swaps: relaxed, open, fist, pointing
### Hair
- back hair base
- back hair tips
- front hair center/L/R
- side hair L/R
- hair highlights
### Clothes
- hoodie front
- hoodie strings
- jacket body
- jacket sleeve L/R
- hood front/back
- pants base
- waistband/drawstring overlays
## 모션 제어
- rootX/rootY로 전체 리듬을 만든다.
- pelvis와 chest는 반대 방향 회전을 기본으로 한다.
- head는 chest보다 약간 늦게 따라온다.
- hair는 head보다 더 늦게 움직인다.
- arms는 shoulder, elbow, wrist, palm 방향을 분리 제어한다.
- z-order 이벤트로 arm-over-body, body-over-arm, hair-over-shoulder 상태를 전환한다.
+26 -25
View File
@@ -1,30 +1,31 @@
# Animation.md — 리그 클립 (`dance_idle.json`) 설명
# Animation Specification
리그(16파츠)를 움직이는 **본 단위 키프레임** 클립. 뷰어가 매 프레임 샘플링해 60fps 재생. 이 스키마는 반응 시퀀서(`../06_Reactions/`)의 `transform` 레이어에도 쓰인다.
LeeSori 애니메이션은 상태 반응과 댄스 루프를 모두 지원한다.
## 스키마
```jsonc
{
"duration": 2.0, "loop": true,
"defaultEase": "sine", // "linear"도 가능
"tracks": {
"<boneName>": {
"rot": [ {"t":0,"v":0}, {"t":0.5,"v":7}, ... ], // 회전 delta(deg, +=시계)
"tx": [...], "ty": [...], // 부모 프레임 이동 delta(px, +y=아래)
"sx": [...], "sy": [...] // 스케일 delta(0=변화없음→배율1)
}
}
}
```
- 값은 **리그 휴지 자세에 더해진다**(`rest + delta`).
- **각 트랙 첫 키 = 마지막 키** 로 두면 루프가 이음매 없이 반복.
## 기본 상태
## 현재 클립: `dance_idle` (가벼운 2박 그루브, 2초 루프)
- pelvis: 바운스+스웨이 / chest: 반대 카운터 / head: 좌우 ±7°(+neck 지연) / 팔: 좌우 교대 펌핑 / 다리: 무릎 교대 굽힘.
- idle: 대기, 부드러운 호흡, 미세한 머리/상체 움직임
- thinking: 처리 중, 약간 빠른 상체 리듬과 시선 변화
- success: 완료, 밝은 반응과 가벼운 팔 동작
- error: 오류, 짧은 흔들림과 표정 변화
- muted: 차분한 낮은 에너지 상태
## 강도 조절
- 과하면 모든 `v`×0.6~0.8 / 목 벌어지면 `head.rot` 폭↓ / 신나게 pelvis `ty`↑ / 빠르게 `duration`↓.
## 댄스 모션
## 새 클립
- 이 파일 복제 → 원하는 본 트랙만 작성(첫=끝) → 뷰어 "애니메이션 불러오기"로 확인.
- 상시 포즈 오프셋은 클립이 아니라 `../04_Rig/rig.json``angle`로 주는 게 깔끔(클립은 그 위 흔들림만).
Solo Dance 3를 기준으로 다음 모션을 제작한다.
- idle groove
- hand forward / palm push
- wrist roll
- arms up
- hair touch / head follow
- side turn
- return settle
## 커브 기준
- linear 보간은 사용하지 않는다.
- 팔 올림은 ease-out과 overshoot를 사용한다.
- 몸통 bounce는 sine/cubic loop를 사용한다.
- 머리와 머리카락은 phase offset을 둔다.
- 손목과 손가락은 팔보다 작고 빠른 움직임을 갖는다.
+17 -58
View File
@@ -1,63 +1,22 @@
# 반응 시퀀서 & 트리거 (Reactions)
# Reactions
상황 → 반응을 정의하는 레이어. **트리거 매퍼**(`reactions.json`) + **반응 클립**(`clips/*.json`)으로 구성.
> ✅ **Phase 2 런타임 구현됨**: `../07_Viewer/reactions.html`(더블클릭). idle=배경춤(풀캔버스 리그, 허리 봉인 튜닝) + 트리거(idle/error/success). baked 바디 + 표정 머리(목 정합·회전)는 `../../_tools/reactions_layout_render.py`→`_layout.json` 사용. head base=`sori_head_short`. 오프라인 검증 `_reaction_preview.png`.
LeeSori 리액션은 DansoriEQ 상태와 연결된다.
## 트리거 매퍼 (`reactions.json`)
상황키 → 반응 클립 이름. 앱은 상황키만 던지면 된다.
```json
{ "error": "gesture_no", "success": "gesture_heart", "idle": "dance_idle" }
```
## 상태 매핑
## 반응 클립 스키마 (`clips/<name>.json`)
하나의 반응 = 레이어드 타임라인.
```jsonc
{
"name": "gesture_no",
"duration": 2.4, // 초
"return": "idle", // 종료 후 복귀 클립(보통 배경 idle)
"layers": {
"body": [ // Body 트랙: 시간에 따라 rig 클립 or baked 포즈
{ "t":0.0, "mode":"rig", "clip":"idle" },
{ "t":0.15,"mode":"baked", "image":"sori_body_track_armscross", "fade":0.2 }
],
"face": [ // 표정 프레임 트랙
{ "t":0.0, "expr":"neutral" },
{ "t":0.3, "expr":"negative" }
],
"mouth": [ // 말하기(유사 립싱크): expr↔talk 순환
{ "t":0.5, "say":"안돼요", "dur":1.2, "pattern":"talk" }
],
"transform": { // 리그 위 잔모션(본별 delta) — Animation.md 스키마와 동일
"head": { "rot":[ {"t":0.5,"v":0},{"t":0.8,"v":9},{"t":1.1,"v":-9},{"t":1.4,"v":9},{"t":1.7,"v":0} ] },
"chest":{ "ty":[ {"t":0.0,"v":0},{"t":0.2,"v":-4},{"t":0.5,"v":0} ] }
},
"caption": [ { "t":0.5, "text":"안돼요", "dur":1.6 } ], // 옵션 말풍선
"sfx": [ { "t":0.5, "id":"nope" } ] // 옵션 효과음
}
}
```
### 필드 규칙
- `body[]`: 시간순. `mode:"rig"`+`clip` 또는 `mode:"baked"`+`image`(파일명, 확장자 생략 가능). `fade`=크로스페이드 초.
- `face[]`: `expr` = 표정 프레임 키(20종 중). 시간에 스냅.
- `mouth[]`: `say` 대사, `dur` 길이, `pattern:"talk"`(talk/talk_wide/현재 감정 프레임 순환). 립싱크는 근사.
- `transform`: 본별 키프레임(리그 delta). Body가 baked여도 head/chest 등 트랜스폼은 적용(단 baked는 통짜라 파츠 분리 트랜스폼은 제한적 → 주로 전체/머리에 적용).
- `caption`/`sfx`: 옵션. 앱 설정(말풍선/TTS)에 따라 사용.
| 상태 | 표현 |
|---|---|
| idle | 명령 대기, 자연스러운 호흡과 시선 |
| listening | 사용자의 입력을 듣는 집중 상태 |
| thinking | 처리 중, 상체와 손의 작은 움직임 |
| success | 완료, 밝은 표정과 짧은 축하 제스처 |
| error | 문제 발생, 짧은 흔들림과 걱정 표정 |
| muted | 소리/반응 억제 상태 |
| dance | 음악적 루프 동작 |
## 상황 → 반응 카탈로그
| 상황키 | 클립 | Body | Face | Mouth | 잔모션 |
|---|---|---|---|---|---|
| `error` | `gesture_no` | baked armscross | negative | "안돼요" | 고개 젓기 |
| `success` | `gesture_heart` | baked heart | love/positive | "잘됐어요" | 통통 바운스 |
| `idle` | `dance_idle` | rig | smile/neutral | — | 그루브 루프 |
| *(확장)* `greet` | `gesture_wave` | rig wave | smile | "안녕하세요" | 손 흔들기 |
| *(확장)* `explain` | `gesture_present` | rig present | neutral | 안내 대사 | 제시 |
| *(확장)* `thinking` | `gesture_think` | rig idle_upper | thinking | — | 갸웃 |
## 제스처 원칙
## 트리거 API(개념)
```
Mascot.React("success") // reactions.json으로 클립 결정 → 시퀀서 재생 → 종료 후 return 클립
Mascot.SetIdle("dance_idle")// 배경 기본 루프
Mascot.Say("...", expr) // 임시 대사(mouth+face)만
```
상세 앱 연동: `../08_Roadmap/App_Integration.md`.
- 앱 사용을 방해하지 않는 범위에서 움직인다.
- 루프 시작과 끝은 자연스럽게 연결된다.
- 팔과 손이 몸통을 가릴 때 z-order를 명시한다.
- 표정, 머리, 상체, 팔은 서로 다른 타이밍으로 움직인다.
+14 -22
View File
@@ -1,27 +1,19 @@
# Viewer.md — 리그 뷰어 (`index.html`) 사용법
# Viewer
자립형 캔버스 런타임(프로토타입). **더블클릭만으로** 이소리 리그가 60fps로 춤춘다(이미지 없이 플레이스홀더로).
> 현 단계 뷰어는 **리그 클립 재생기**(Phase 1 검증용). 반응 시퀀서(베이크드+표정 레이어 합성)는 Phase 2에서 확장 → `../08_Roadmap/Roadmap.md`.
Viewer는 LeeSori 자산과 리그를 빠르게 확인하기 위한 로컬 검증 도구다.
## 실행
- `index.html` 를 브라우저로 열기(더블클릭). 서버·빌드 불필요. 기본 리그/애니메이션 내장.
## 확인 항목
## 컨트롤
| 버튼 | 기능 |
|---|---|
| ⏸/▶ | 재생 토글 · 속도 슬라이더 0~2배 |
| 🖼 아트 사용 | 파츠 PNG로 렌더 ↔ 플레이스홀더 |
| 🦴 스켈레톤 | 관절점·본 라인 오버레이(튜닝용) |
| 📂 rig.json / animation.json | 외부 파일 로드(수정본 반영) |
| 🖼 파츠 PNG(다중) | 파츠 이미지 직접 지정(파일명 매칭) |
- 파츠 누락 여부
- z-order 오류
- 팔/손/머리카락 겹침
- 프레이밍
- 루프 연결성
- 상태별 반응 전환
- 앱 우측 패널 크롭
## 이미지 붙이
1. **자동**: ChatGPT 결과를 `../03_Assets/Parts/Images/` 에 정확한 파일명으로 저장 → 뷰어 자동 로드 → 🖼 아트 사용 ON.
2. **수동**(상대경로 차단 시): 🖼 파츠 PNG(다중)로 직접 선택. 우측 패널 `파츠 이미지 로드: N/16` 확인.
## 기
## 튜닝
- 🦴+🖼 켜고 분홍 관절점이 아트 관절에 오도록 `../04_Rig/rig.json``imgAnchor/pos` 수정 → 📂 rig.json 재로드.
- 모션은 `../05_Animation/dance_idle.json` 수정 → 📂 animation.json 재로드.
## 참고
- 내장 리그/클립은 `../04_Rig/rig.json`·`../05_Animation/dance_idle.json` 의 사본. 파일 수정 후 📂로 로드하거나 index.html 상단 `DEFAULT_RIG`/`DEFAULT_ANIM` 갱신.
- 캐릭터는 무릎 위부터 머리끝까지 자연스럽게 보여야 한다.
- 팔이 두 쌍으로 보이거나 파츠가 중복되면 리그 실패로 판단한다.
- 정지 이미지 컷 전환처럼 보이면 모션 커브와 파츠 분리가 부족한 상태다.
+20 -29
View File
@@ -1,36 +1,27 @@
# 앱 통합 (App Integration)
# App Integration
이소리 반응 시스템을 **DansoriEQ(및 향후 Dansori 앱)** 에 탑재하는 방식.
LeeSori는 DansoriEQ의 캐릭터 호스트에서 표시된다.
## 런타임 호스트 두 선택지 (O1 — 결정 예정)
| 옵션 | 방식 | 장점 | 단점 |
|---|---|---|---|
| **A. WPF-C# 이식** | 리그·시퀀서를 C#로 포팅, WPF 캔버스에 렌더 | 네이티브·경량·기존 `AlphaTools` 재활용 | 런타임을 두 벌(웹/C#) 유지 |
| **B. WebView2 임베드** | 웹 런타임(뷰어 진화형)을 WPF WebView2에 임베드 | 런타임 1벌(데이터·코드 공유) | WebView2 의존·상호작용 브리지 필요 |
> 프로토타입은 웹으로 계속. Phase 3에서 A/B 결정. 어느 쪽이든 **데이터(`rig.json`·클립·`reactions.json`·이미지)는 그대로 재사용**.
## 앱 표시 기준
## 트리거 API (앱 ↔ 마스코트)
```
Mascot.SetIdle("dance_idle") // 배경 기본 루프 지정
Mascot.React("success") // 상황키 → reactions.json → 클립 재생 → 끝나면 return(idle)
Mascot.React("error")
Mascot.Say("환영합니다", "smile") // 임시 대사(mouth+face)만, 포즈 유지
Mascot.Stop() / Mascot.SetVisible(b)
```
- 앱 이벤트(버튼 실패/성공, 화면 진입 등)에서 상황키만 던진다. 표현 방법은 마스코트가 데이터로 결정.
- 위치: 앱 우측 캐릭터 영역
- 기본 프레이밍: 무릎 위부터 머리끝까지
- 우선 상태: idle, thinking, success, error, muted, dance
- 파일 기준: Profile 패키지에서 검증된 런타임 자산만 앱에 반영
## 리소스 번들
- **필요한 PNG만** 앱 리소스로 복사(전부 아님): 리그 16파츠 + 사용하는 표정 세트 + 사용하는 baked 포즈 + hairmask.
- 데이터 파일(`rig.json`·클립·`reactions.json`)은 소스로 번들.
## 런타임 요구
## 좌표·정렬 규약
- 스테이지 캔버스 기준(현재 리그 520×900). 앱 배치 시 전체 스케일/위치만 트랜스폼.
- 파츠 앵커 정렬은 기존 `Character_Builder/AlphaTools.cs`(알파 기반 목/어깨 검출)와 동일 알고리즘 재활용.
- 색 변형은 런타임 hairmask hue-shift(이미지 추가 없음).
- 캐릭터 manifest
- rig.json
- gesture registry
- state-to-gesture mapping
- asset cache busting
- z-order event support
## 배경 마스코트 연동(DansoriEQ 예시)
- 메인화면 배경 이소리를 **통짜 → 리그**로 교체(부유+말하기 동기화는 기존 `MainWindow.SetBgMascotTalking` 훅 활용).
- 참고: `../../HANDOFF.md`, DansoriEQ `docs/HANDOFF.md §8`.
## 품질 기준
## 포터블 원칙
- 절대경로 금지. `LeeSori_Profile`은 통째 이동 가능하게 상대경로만 사용.
- 팔 중복 없음
- 파츠 절단선 최소화
- 의상 라인 자연스러움
- 손/손목 방향 변화 표현
- 루프 연결 자연스러움
+29 -28
View File
@@ -1,36 +1,37 @@
# 로드맵 (Roadmap)
# Roadmap
단계별 구현 계획. 각 Phase는 **완료조건**을 만족하면 다음으로.
## 1. 기준 자료 확정
## Phase 0 — 방향·설계 (완료)
- 하이브리드 방식·구현레벨 확정(`../01_Overview/Decisions.md`).
- 리그 스키마(`../04_Rig/rig.json`) + 배경춤 프로토타입(`../05_Animation/dance_idle.json`) + 뷰어(`../07_Viewer/`).
- **완료조건**: 뷰어에서 플레이스홀더 춤 재생 확인. ✅
- Solo Dance 3 키포즈 24~32개 추출
- keyframe label 작성
- motion reference manifest 작성
## Phase 1 — 자산 생성 & 리그 실아트 검증
1. 이소리 **시트 투명알파 재확정**(`(소스 아카이브)`).
2. **리그 16파츠 확보****방법 A(마스터-슬라이스) 우선**: 슬라이스용 마스터 1장 생성 → 로컬에서 16조각(관절 자동 정합). 어려우면 **방법 B(개별 생성)** 폴백. (대체 손 attachment는 B로.) 스펙: `../이미지작업_의뢰서.md` · `../03_Assets/Parts/Parts.md``Parts/Images/`.
3. 뷰어에서 실아트 로드 → `rig.json``imgAnchor/pos` 튜닝(관절 정합).
4. 배경춤(`dance_idle`)이 실제 이소리로 자연스러운지 확인.
- **완료조건**: 실제 파츠로 배경춤이 이음새 없이 자연스럽게 루프.
## 2. 파츠 확장
## Phase 2 — 반응 시퀀서 런타임
1. 시퀀서 구현: `reactions.json` + `clips/*.json`**Body/Face/Mouth/Transform/Caption** 레이어 합성·전환(크로스페이드).
2. 뷰어 확장(또는 별도 러너)으로 `gesture_no`·`gesture_heart`·`dance_idle` 재생.
3. 베이크드 포즈(armscross/heart) + 표정 프레임 연동. 말하기 근사 립싱크.
- **완료조건**: 상황키 3종(error/success/idle)으로 반응 재생·복귀 동작.
- 상완/전완/손/손가락 분리
- 상체/의상 보정 파츠 생성
- 머리카락 sway 파츠 생성
- z-order mask 생성
## Phase 3 — 앱 통합 (WPF 본체)
1. 런타임 호스트 결정(WPF-C# 이식 vs WebView2 임베드 — `App_Integration.md` 참고).
2. 트리거 API(`Mascot.React/SetIdle/Say`)로 앱 이벤트 연결.
3. 리소스 번들(필요한 PNG만) + 좌표규약.
- **완료조건**: 앱에서 실제 상황에 캐릭터가 반응.
## 3. 리그 구축
## Phase 4 — (옵션) 얼굴 mesh-warp 승급
- 조건 충족 시(정밀 립싱크/중간 각도 고개돌림 — `../02_Architecture/Limits_and_Mitigations.md` L4) neck/head 국소 WebGL mesh-warp 도입.
- bone hierarchy 작성
- pivot 정리
- Live2D parameter 정의
- 앱 런타임용 경량 rig 변환
## 반응 확장 (상시)
- 같은 프레임워크로 greet/explain/thinking 등 반응을 계속 추가(`../06_Reactions/`).
## 4. 모션 제작
## 현재 위치
> **Phase 1 진입 지점.** 다음 액션 = 시트 재확정 + 리그 파츠 생성 의뢰.
- idle groove
- hand forward
- arms up
- side turn
- return settle
- reaction clips
## 5. 앱 통합
- DansoriEQ 상태 매핑
- gesture registry 등록
- 우측 패널 프레이밍 확인
- 성능 검증
@@ -0,0 +1,57 @@
# Dance Rig Required Parts
Solo Dance 3 수준의 자연스러운 댄스 모션을 위해 다음 파츠를 제작한다.
## 팔/손
- upperarm L/R
- elbow corrective L/R
- forearm L/R
- wrist cuff L/R
- palm L/R
- backhand L/R
- thumb/index/middle/ring/pinky group L/R
- relaxed hand L/R
- open palm L/R
- soft fist L/R
- pointing hand L/R
## 상체/의상
- chest base
- chest left/right cloth stretch
- under-bust shadow
- abdomen front
- waist bend corrective L/R
- jacket body
- jacket inner flap L/R
- hoodie collar L/R
- zipper/string overlays
## 하체
- pelvis
- hip corrective L/R
- thigh L/R
- knee corrective L/R
- shin L/R
- foot L/R
- pants fold overlays
## 머리/헤어
- face base
- front hair center/L/R
- side hair L/R
- back hair mass
- hair tip L/R
- headset band and cups
- choker/pendant overlays
## 마스크와 레이어 이벤트
- arm over torso
- torso over arm
- hand over face
- hair over shoulder
- shoulder over hair
@@ -0,0 +1,53 @@
# Dance Rig Extension Specification
## 리그 목표
- 팔이 몸 앞뒤를 자연스럽게 오간다.
- 상체와 골반이 반대 방향으로 움직인다.
- 손목과 손바닥 방향이 프레임마다 달라진다.
- 손가락이 펴지고 굽혀지는 변화를 표현한다.
- 의상 라인이 파츠 이동 중에도 이어진다.
## Bone Hierarchy
- Root
- Pelvis
- Abdomen
- Chest
- Neck
- Head
- Hair groups
- Arm L
- UpperArm L
- ForeArm L
- Hand L
- Fingers L
- Arm R
- UpperArm R
- ForeArm R
- Hand R
- Fingers R
- Leg L
- Leg R
## Motion Channels
- rootX, rootY
- pelvisRotateZ, pelvisX, pelvisY
- abdomenBendX, abdomenBendY
- chestRotateZ, chestX, chestY
- headRotateZ, headX, headY
- shoulderRaise L/R
- elbowBend L/R
- wristRoll L/R
- palmOpen L/R
- fingerCurl L/R
- hairSway L/R
## Z-order Events
- armFront L/R
- armBack L/R
- handFrontFace L/R
- hairFrontShoulder L/R
- torsoFrontArm L/R
@@ -0,0 +1,35 @@
# Live2D Parameter and Motion Specification
## Parameters
| Parameter | Range | Purpose |
|---|---:|---|
| ParamRootX | -1..1 | 전체 좌우 이동 |
| ParamRootY | -1..1 | bounce |
| ParamPelvisAngleZ | -30..30 | 골반 회전 |
| ParamChestAngleZ | -30..30 | 흉곽 회전 |
| ParamBodyBendX | -1..1 | 상체 좌우 굽힘 |
| ParamBodyBendY | -1..1 | 상체 전후 굽힘 |
| ParamHeadAngleZ | -30..30 | 머리 회전 |
| ParamArmLiftL/R | 0..1 | 팔 올림 |
| ParamElbowBendL/R | 0..1 | 팔꿈치 굽힘 |
| ParamWristRollL/R | -1..1 | 손목 회전 |
| ParamPalmOpenL/R | 0..1 | 손바닥 개방 |
| ParamFingerCurlL/R | 0..1 | 손가락 굽힘 |
| ParamHairSwayL/R | -1..1 | 머리카락 흔들림 |
## Motion Loops
- Loop A: idle groove
- Loop B: hand forward / palm push
- Loop C: arms up
- Loop D: side turn / hair swing
- Loop E: return settle
## Timing
- root와 pelvis가 리듬을 만든다.
- chest는 pelvis보다 반 박자 늦거나 반대 방향으로 움직인다.
- head는 chest보다 늦게 따라온다.
- hair는 head보다 더 늦게 움직인다.
- hand/finger는 짧고 빠른 accent로 처리한다.
@@ -0,0 +1,292 @@
# SampleDance Motion Reference Requirements
작성일: 2026-07-04
대상 경로: `D:\Project\SampleDance`
목적: LeeSori / Dansori 캐릭터 댄스 리그를 자연스럽게 만들기 위해 SampleDance 자료를 검토하고, 추가 제작해야 할 자료와 리그/모션 요구사항을 취합한다.
## 1. 현재 자료 목록
| 파일 | 형식 | 해상도 / 길이 | 프레임 | 1차 판단 |
|---|---:|---:|---:|---|
| `Group Dance 1.mp4` | video | 604x340 / 5.70s | 57 frames, 10fps | 군무/애니메이션 스타일 참고. 하체 스텝, 동시 팔동작, 실루엣 변화 참고용. LeeSori 주 리그 자료로는 우선순위 낮음. |
| `Solo Dance 1.mp4` | video | 550x232 / 5.43s | 132 frames, 약 24fps | 애니 캐릭터의 간단한 상체/팔 제스처 참고. 해상도와 크롭이 작아 세부 리그 추출용으로는 약함. |
| `Solo Dance 2.png` | image | 500x658 | static | 양팔 머리 위 포즈, 상체 S라인, 머리카락/가슴/허리 실루엣 참고. 모션보다는 키포즈/파츠 분리 참고용. |
| `Solo Dance 3.mp4` | video | 576x1024 / 15.05s | 450 frames, 약 30fps | 최우선 목표 자료. 상체 회전, 팔 올림, 손바닥/손가락, 머리카락, 몸통 웨이브, 측면 회전이 풍부함. |
생성한 검토 이미지:
- `D:\Project\SampleDance\_analysis\Group_Dance_1_contact.png`
- `D:\Project\SampleDance\_analysis\Solo_Dance_1_contact.png`
- `D:\Project\SampleDance\_analysis\Solo_Dance_3_contact_1fps.png`
- `D:\Project\SampleDance\_analysis\Solo_Dance_3_contact_2fps.png`
## 2. 자료별 사용 방향
### Solo Dance 3.mp4 - 주 목표
가장 중요한 레퍼런스다. 현재 이소리 리그가 정지 포즈 전환처럼 보이는 문제를 해결하려면, 이 영상에서 다음 요소를 별도 자료로 추출해야 한다.
- 몸 중심축이 좌우로 이동하는 리듬
- 골반과 흉곽이 서로 반대로 움직이는 counter motion
- 상체가 앞으로 숙여졌다가 다시 펴지는 bounce
- 팔이 아래에서 앞으로, 앞으로에서 머리 위로 올라가는 lift arc
- 손바닥이 카메라를 향했다가 손등/측면으로 돌아가는 wrist roll
- 손가락이 펴짐, 살짝 굽힘, 엄지/검지 제스처로 바뀌는 변화
- 머리가 상체보다 늦게 따라오는 follow-through
- 머리카락이 몸 회전보다 늦게 흔들리는 secondary motion
- 측면 회전 시 어깨, 가슴, 허리, 골반의 실루엣 변화
- 팔이 몸 앞을 지나갈 때 생기는 occlusion / 앞뒤 레이어 순서 변화
### Solo Dance 2.png - 키포즈 보조
정적 이미지이므로 자연스러운 모션 추출에는 한계가 있다. 대신 다음 자료 제작에 쓴다.
- 양팔 머리 위 포즈의 최종 키포즈
- 겨드랑이/어깨/가슴 라인이 무너지지 않도록 하는 보정 파츠 참고
- 머리카락이 팔과 겹칠 때 앞/뒤 레이어 분리 참고
- 치마/허벅지/상체가 한 포즈에서 자연스럽게 이어지는 실루엣 참고
### Solo Dance 1.mp4 - 단순 루프 보조
해상도와 크롭이 작아서 세부 손/몸통 추출은 어렵다. 다만 캐릭터풍 간단 루프 제작 시 참고 가능하다.
- 작은 폭의 손 흔들기
- 정면 캐릭터가 제자리에서 리듬을 타는 최소 모션
- 눈에 거슬리지 않는 idle dance loop 타이밍 참고
### Group Dance 1.mp4 - 실루엣/하체 보조
주 캐릭터 리그에는 우선순위가 낮지만, 하체와 단체 동작 아이디어에는 쓸 수 있다.
- 좌우 스텝 타이밍
- 무릎 들어올림 / 발 딛기 실루엣
- 팔과 다리의 대칭/반대칭 리듬
- 여러 캐릭터 제스처를 나중에 재사용할 때 카테고리 분류 참고
## 3. 추가로 필요한 자료 - 우선순위별
### P0. 반드시 필요한 자료
1. `Solo Dance 3` 키포즈 프레임 세트
- 최소 16개, 권장 24~32개.
- 0.0s, 0.5s, 1.0s 식 균등 샘플이 아니라, 동작 전환점 기준으로 선별해야 한다.
- 필요 포즈: 준비, 손 앞으로, 손바닥 펼침, 손목 회전, 한팔 올림, 양팔 올림, 머리 위 손, 측면 회전, 등/후면 회전, 복귀, 바운스 다운, 바운스 업.
2. 신체 관절 추적 데이터
- head, neck, chest, waist, pelvis
- left/right shoulder, elbow, wrist, palm center
- left/right hip, knee, ankle
- 가능하면 finger landmarks: thumb/index/middle/ring/pinky root/tip
- 프레임 단위 CSV 또는 JSON 필요.
3. 파츠 분리용 기준 이미지
- 정면 기본 포즈
- 좌회전 30~60도 포즈
- 우회전 30~60도 포즈
- 양팔 위 포즈
- 손바닥 정면 포즈
- 손등/측면 포즈
- 팔이 몸 앞을 가리는 포즈
4. 실제 리그 파츠 세분화
- 현재 whole-arm 임시 방식은 팔 중복을 없애는 데는 좋지만 팔꿈치 자연스러움이 부족하다.
- 상완/전완/손/손가락/소매/자켓 외곽/그림자 보정 파츠를 분리해야 한다.
### P1. 자연스러움 향상 자료
1. 흉곽/가슴/상의 라인 보정 파츠
- chest front
- left breast cloth stretch
- right breast cloth stretch
- center zipper/string overlay
- under-bust shadow
- side torso shadow
- hoodie inner flap left/right
- jacket outer flap left/right
2. 허리/골반/하체 보정 파츠
- waist front
- abdomen highlight/shadow
- pelvis front
- pants waistband
- drawstring front overlay
- left/right hip side cloth
- thigh left/right
- knee left/right corrective fold
- shin left/right
- foot left/right
3. 팔/손 파츠
- upperarm left/right front
- upperarm left/right back or sleeve underside
- elbow corrective patch left/right
- forearm left/right
- wrist cuff left/right
- palm left/right
- back-of-hand left/right
- thumb, index, middle, ring, pinky grouped layers or at least 3-state hand sprites
- fist, open palm, relaxed hand, pointing/finger-heart-like pose if needed
4. 머리/헤어 파츠
- head base
- face
- front bangs clusters
- left/right side hair
- back hair mass
- hair tip sways
- headset left/right separated if head rotates
- neck/choker overlay
5. 레이어 순서 전환 자료
- arm behind torso
- arm in front of torso
- hand in front of face/hair
- hair in front of shoulder
- shoulder/jacket in front of hair for side turn
### P2. 고급 모션 자료
1. 모션 커브
- rootY bounce
- rootX sway
- pelvis rotateZ
- pelvis translateX/Y
- waist bendX/Y/Z
- chest rotateZ
- chest translateX/Y
- head rotateZ / delayed follow
- shoulder left/right raise
- elbow left/right bend
- wrist left/right roll
- palm open amount
- finger curl amount
2. 보간 방식
- linear 금지.
- 팔 올림은 ease-out + overshoot 필요.
- 몸통 bounce는 sine/cubic 기반 loop 필요.
- 머리카락은 2~4프레임 지연 또는 phase offset 필요.
- 손목/손가락은 팔보다 빠르고 작게 움직여야 한다.
3. 루프 설계
- 15초 전체를 그대로 재현하기보다 2.5~4.0초 단위의 reusable loop로 분해한다.
- loop A: idle groove
- loop B: hand forward / palm push
- loop C: arms up
- loop D: side turn / hair swing
- loop E: return / settle
## 4. LeeSori 리그 확장 제안
### 최소 안정 리그
현재 앱에 넣을 수 있는 안정 단계.
- torso group
- pelvis group
- head group
- left whole arm
- right whole arm
- legs static or light sway
- hair sway overlay
장점: 팔 중복이 적고 빠르게 안정화 가능.
단점: 팔꿈치/손목/손가락 자연스러움 부족.
### 권장 프로덕션 리그
Solo Dance 3 수준을 목표로 하면 최소 다음 파츠가 필요하다.
- Root
- Pelvis
- Abdomen
- Chest
- Neck
- Head
- Hair front / side / back / tips
- Jacket torso left/right/front/back
- Hoodie collar left/right
- Shirt torso + chest corrective overlays
- Left upper arm / left forearm / left cuff / left hand / left fingers
- Right upper arm / right forearm / right cuff / right hand / right fingers
- Left thigh / knee / shin / foot
- Right thigh / knee / shin / foot
- Occlusion masks: torso-over-arm, arm-over-torso, hair-over-shoulder
### 고품질 댄스 리그
움직임이 실제 영상처럼 보이려면 다음이 필요하다.
- 각 팔 최소 4~6개 레이어: upper arm, elbow patch, forearm, cuff, palm/backhand, fingers
- 각 손 최소 4개 상태: relaxed, open palm, fist/soft fist, pointing/finger gesture
- 상체 최소 5개 corrective: neutral, left bend, right bend, forward bend, chest-up
- 골반/복부 최소 4개 corrective: neutral, left hip, right hip, pelvis forward, pelvis back
- 머리카락 최소 6개 sway layer: front L/R, side L/R, back mass, tips
- 레이어 순서 전환용 z-index event table
## 5. SampleDance 기준 작업 산출물 목록
다른 세션과 취합하기 위해 다음 파일 단위로 생성하는 것이 좋다.
1. `motion_reference_manifest.json`
- 각 영상/이미지의 역할, 우선순위, 사용할 구간, 생성된 분석 파일 목록.
2. `solo_dance_3_keyframes.json`
- timecode, frame index, pose label, motion notes.
3. `solo_dance_3_landmarks.csv`
- frame, time, joint, x, y, confidence.
4. `solo_dance_3_motion_curves.json`
- root/chest/pelvis/head/arm/wrist/finger curve values.
5. `leesori_required_parts.md`
- 필요한 파츠 목록, 기존 파츠 상태, 새로 만들어야 할 파츠, 우선순위.
6. `leesori_rig_hierarchy.json`
- bone hierarchy, pivot, z-order, constraints.
7. `leesori_z_order_events.json`
- 특정 포즈/시간에서 arm-over-body, hair-over-arm 같은 레이어 순서 변화.
8. `leesori_corrective_parts_plan.md`
- 몸매/의상 라인 연결을 위한 보정 파츠 목록.
9. `solo_dance_3_loop_segments.md`
- 2.5~4초 단위 재사용 루프 구간 정의.
10. `qa_motion_checklist.md`
- 팔 중복, 절단, 어깨 탈구, 손목 뒤틀림, 의상 라인 끊김, 머리카락 부자연스러움 확인 항목.
## 6. 현재 자료만으로 가능한 것과 불가능한 것
가능:
- Solo Dance 3의 대략적인 상체 리듬과 팔 올림 타이밍 추정
- 손바닥 정면/손목 회전/양팔 위 키포즈 추출
- 골반-흉곽 반대 움직임 패턴 설계
- 머리카락 follow-through 방향 설계
- reusable gesture category 설계
부족:
- 손가락별 정확한 굽힘 추출은 영상 해상도/모션블러 때문에 제한적이다.
- 의상 라인과 몸매 라인을 완벽히 이어 붙이려면 별도 파츠 원화가 필요하다.
- 기존 LeeSori clean 파츠는 임시 whole-arm 구조라 팔꿈치 리깅에는 부족하다.
- 진짜 자연스러운 팔 올림을 위해서는 상완/전완/손/손가락을 새로 분리해야 한다.
## 7. 권장 다음 순서
1. `Solo Dance 3`에서 24~32개 키포즈 프레임을 추출한다.
2. 각 키포즈에 pose label을 붙인다.
3. 관절 랜드마크를 추출해 CSV/JSON으로 정리한다.
4. LeeSori 기준 신규 파츠 요구 목록을 확정한다.
5. 임시 whole-arm 리그를 유지한 채, production arm rig를 별도 브랜치/폴더에서 만든다.
6. 팔/손/상체 corrective 파츠를 생성한다.
7. `Solo Dance 3`를 2.5~4초 루프로 분해해 gesture library에 등록한다.
8. DansoriEQ runtime에는 `poseSequence`가 아니라 `partsRig + curve animation + z-order events`로 적용한다.
## 8. 검토 결론
- 주 자료는 `Solo Dance 3.mp4`로 확정하는 것이 맞다.
- 현재 필요한 것은 단순 이미지 추가가 아니라, 키포즈/랜드마크/모션커브/세분화 파츠/보정 파츠/레이어 이벤트 전체 세트다.
- 팔이 4개로 보였던 문제는 파츠가 충분히 잘게, 정확히 분리되지 않은 상태에서 회전 애니메이션을 적용했기 때문이다.
- 자연스러운 결과를 위해서는 `whole-arm 임시 리그``production segmented rig`를 분리해서 관리해야 한다.
- 다른 세션에서 준비 중인 작업과 취합할 때는 위 산출물 파일명을 기준으로 병합하면 된다.
@@ -0,0 +1,28 @@
# Dance Motion
LeeSori 댄스 모션은 Solo Dance 3를 기준으로 제작한다. 목표는 정지 이미지의 연속 재생이 아니라 파츠 리그, 모션 커브, z-order 이벤트를 이용한 연속적인 몸 움직임이다.
## 핵심 모션 요소
- 몸 중심 좌우 이동
- 골반과 흉곽의 반대 회전
- 상체 bounce와 forward bend
- 팔 lift arc
- 팔꿈치 bend
- 손목 roll
- 손바닥 방향 전환
- 손가락 curl/open 변화
- 머리 follow-through
- 머리카락 secondary motion
- 하체 무릎/골반 리듬
## 산출물
- keyframes
- landmarks
- motion curves
- rig hierarchy
- required parts
- corrective parts
- z-order events
- QA checklist
@@ -0,0 +1,47 @@
# LeeSori Character Identity
모든 이미지, 파츠, 리그, Live2D 산출물은 이 문서를 기준으로 한다. 컨셉별 의상과 분위기가 달라져도 LeeSori라는 동일 캐릭터로 인식되어야 한다.
## 기본 정체성
- 이름: LeeSori
- 역할: DansoriEQ 메인 어시스턴트
- 성격: 차분함, 전문성, 밝은 반응성, 음악 작업에 익숙함
- 핵심 인상: EQ/음악을 이해하는 디지털 파트너
- 앱 위치: DansoriEQ 우측 캐릭터 영역
## 고정 시각 요소
- 청록/민트 계열 포인트 컬러
- 헤드셋 또는 음악 작업자 액세서리
- 선명한 눈매와 밝은 표정
- 자연스럽게 정리된 헤어 실루엣
- 상체와 손 제스처가 잘 보이는 구도
- 앱 화면에서 과하게 튀지 않는 명확한 실루엣
## 얼굴 기준
- 얼굴 비율은 컨셉별로 변하지 않는다.
- 눈, 코, 입, 턱선, 귀 위치는 Live2D 리그 재사용이 가능해야 한다.
- 표정은 자연스럽게 바뀌되 캐릭터 정체성은 유지한다.
- 웃음, 집중, 생각, 놀람, 걱정, 자랑, 부끄러움, 말하기 입모양을 지원한다.
## 몸 기준
- 앱 기본 구도는 무릎 위부터 머리끝까지다.
- Live2D용 기준 이미지는 전신 A-pose와 상체 close-up을 모두 제작한다.
- 몸매와 의상 라인은 컨셉별 실루엣을 살리되, 파츠가 움직여도 끊기지 않게 보정 파츠를 포함한다.
- 가슴/허리/골반/어깨 라인은 과도하게 왜곡하지 않고 자연스러운 애니 스타일로 유지한다.
## 손과 팔 기준
- LeeSori는 앱에서 손동작을 자주 사용하므로 손과 팔 파츠 품질이 중요하다.
- 손바닥, 손등, 측면 손, 손가락 굽힘이 모두 필요하다.
- 팔은 상완, 전완, 팔꿈치 보정, 손목, 손, 손가락으로 분리한다.
- 팔이 몸 앞을 지나갈 때 필요한 z-order와 occlusion mask를 만든다.
## 댄스 기준
- Solo Dance 3의 자연스러운 상체 리듬을 목표로 한다.
- 몸 중심 이동, 골반/흉곽 counter motion, 팔 lift arc, 손목 roll, 손가락 변화, 머리카락 follow-through가 필요하다.
- 정지 포즈 컷 전환이 아니라 Live2D 파츠와 motion curve로 이어지는 자료를 만든다.
@@ -0,0 +1,78 @@
# Dance Reference Specification
LeeSori 댄스 이미지는 Solo Dance 3를 주 기준으로 한다. 목표는 실제 영상처럼 팔, 손, 손가락, 상체, 하체, 머리카락이 서로 다른 타이밍으로 자연스럽게 이어지는 Live2D 제작 자료를 만드는 것이다.
## 필수 모션 요소
- root sway: 몸 중심 좌우 이동
- root bounce: 리듬에 맞는 상하 움직임
- pelvis counter: 골반이 흉곽과 반대로 움직임
- chest lead/follow: 가슴/상체가 리듬을 따라 늦게 반응
- shoulder lift: 팔이 올라갈 때 어깨가 같이 올라감
- elbow bend: 팔꿈치가 단계적으로 굽혀짐
- wrist roll: 손목이 카메라 방향과 측면 방향을 오감
- palm direction: 손바닥, 손등, 손날 방향 변화
- finger curl: 손가락이 펴짐/굽힘/강조 제스처로 변함
- head follow: 머리가 상체보다 약간 늦게 따라옴
- hair follow-through: 머리카락이 머리보다 늦게 흔들림
- torso bend: 상체가 앞/좌/우로 굽혀짐
- lower body rhythm: 무릎과 골반이 미세하게 리듬을 만듦
## Solo Dance 3 키포즈 그룹
최소 24개, 권장 32개 키포즈를 제작한다.
1. ready smile
2. relaxed downbeat
3. hand forward prep
4. palm push front
5. wrist roll front
6. wrist roll side
7. shoulder bounce
8. one arm lift half
9. one arm lift high
10. both arms lift prep
11. both arms high
12. hair touch
13. chest bounce down
14. chest bounce up
15. side turn left prep
16. side turn left
17. back/three-quarter hair swing
18. return from turn
19. hand near face
20. finger accent
21. hip left
22. hip right
23. settle wave
24. loop return
추가 권장:
25. open palm close-up
26. wrist crossed high
27. elbow tucked
28. arm behind torso
29. arm in front of torso
30. laugh bounce
31. hair follow-through extreme
32. final idle groove
## 루프 분해
- Loop A: idle groove, 2.5~3.0s
- Loop B: hand forward / palm push, 2.0~2.5s
- Loop C: wrist roll, 1.5~2.0s
- Loop D: arms up, 2.5~3.5s
- Loop E: side turn / hair swing, 2.5~4.0s
- Loop F: return settle, 2.0~3.0s
## 산출물
- key pose PNG set
- key pose contact sheet
- motion curve draft json
- z-order event draft json
- hand/finger close-up sheet
- torso corrective sheet
- hair sway sheet
@@ -0,0 +1,67 @@
# Output Specification
## 기본 출력 위치
모든 제작 산출물은 `LeeSori_Profile` 내부에 컨셉별로 정리한다.
권장 루트:
- `03_Assets/Library/BakedPoses/<Concept>`: 앱용 baked gesture 이미지
- `03_Assets/Library/Sheets/<Concept>`: 전체 시트, 제스처 시트, 손 시트, 표정 시트
- `03_Assets/Library/Parts/<Concept>`: 컨셉별 파츠 이미지
- `03_Assets/Library/Live2D/<Concept>`: Live2D 레이어 PNG, PSD, manifest
- `03_Assets/Library/Dance/<Concept>`: Solo Dance 3 키포즈와 댄스 루프 이미지
- `04_Rig/Concepts/<Concept>`: rig, pivot, z-order, parameter 자료
- `05_Animation/Concepts/<Concept>`: motion curve, loop segment 자료
## 파일명 규칙
기본 형식:
`leesori_<concept>_<category>_<name>_<variant>.<ext>`
예시:
- `leesori_track_pose_idle_upper.png`
- `leesori_track_gesture_open_palm.png`
- `leesori_track_dance_solo3_key_001_ready.png`
- `leesori_track_part_upperarm_L.png`
- `leesori_track_live2d_layer_manifest.json`
- `leesori_track_rig_pivots.json`
## 이미지 기본 규격
| 용도 | 권장 크기 | 배경 |
|---|---:|---|
| full body reference | 1536x2304 또는 2048x3072 | 투명 또는 chroma key |
| app upper body | 1024x1536 | 투명 |
| gesture baked pose | 1024x1536 | 투명 |
| Live2D layer PNG | 동일 캔버스 고정 | 투명 |
| hand sheet | 2048x2048 | 투명 또는 흰색 검수판 |
| expression sheet | 2048x2048 | 투명 또는 흰색 검수판 |
| dance contact sheet | 가변 | 흰색/검수 배경 |
## 필수 파일 세트
각 컨셉은 최소 다음 파일 그룹을 갖는다.
- reference sheet
- expression sheet
- hand pose sheet
- gesture image set
- dance key pose set
- Live2D layer PNG set
- PSD assembly guide
- rig json
- pivot json
- motion curve json
- z-order event json
- QA checklist result
## 품질 조건
- 동일 컨셉 내 모든 이미지의 얼굴과 체형이 일관되어야 한다.
- 투명 PNG 가장자리에 chroma key 잔여색이 없어야 한다.
- 파츠 PNG는 같은 캔버스 좌표계를 공유해야 한다.
- 모든 파츠는 누락 없이 manifest에 등록한다.
- baked pose와 Live2D part는 목적을 구분한다.
@@ -0,0 +1,101 @@
# Pose and Gesture Set
모든 컨셉은 같은 제스처 이름을 사용한다. 컨셉별 의상과 분위기는 다르지만 제스처 파일명과 의미는 통일한다.
## 기본 포즈
| ID | 설명 |
|---|---|
| idle_full | 전신 기본 대기 |
| idle_upper | 앱 우측 패널용 상체 대기 |
| neutral_apose | Live2D 파츠 제작용 A-pose |
| neutral_tpose_soft | 팔 분리 확인용 부드러운 T/A 중간 포즈 |
| app_wait | 사용자 명령 대기, 차분한 손 위치 |
| headset_touch | 헤드셋에 손을 올린 대기/청취 포즈 |
| armscross | 팔짱 대기 포즈 |
## 앱 제스처
| ID | 설명 |
|---|---|
| listen | 사용자 입력을 듣는 상태 |
| thinking | 처리 중, 턱/손/시선 중심 |
| present | 정보를 보여주는 손동작 |
| point | 특정 위치를 가리키는 손동작 |
| control | EQ/슬라이더를 조작하는 손동작 |
| handwave | 가벼운 손 흔들기 |
| wave | 큰 인사 손동작 |
| peace | 브이 포즈 |
| thumbsup | 긍정/완료 포즈 |
| clap | 박수 포즈 |
| cheer | 양손 응원 포즈 |
| joy | 기쁜 반응 |
| heart | 하트 제스처 |
| shrug | 모름/중립 반응 |
| piano | 피아노/키보드 연주 제스처 |
| dj | DJ/믹서 조작 제스처 |
| error_soft | 부드러운 오류/미안함 표현 |
| muted | 조용한 상태, 손가락/입 주변 제스처 |
## 표정 세트
- neutral
- smile
- positive
- proud
- laugh
- talk
- talk_wide
- blink
- wink
- thinking
- confused
- surprised
- negative
- sad
- shy
- sleepy
- pout
- love
- cool
- playful
## 손 세트
각 손은 좌우 모두 필요하다.
- relaxed
- open_palm_front
- open_palm_side
- backhand
- soft_fist
- point_index
- thumbsup
- peace
- heart_half
- piano_curve
- dj_touch
- headset_touch
- clap_contact
- wrist_roll_A
- wrist_roll_B
## Live2D용 파츠 확인 포즈
- arm_down_relaxed
- arm_forward
- arm_side
- arm_up_half
- arm_up_full
- elbow_bent_front
- elbow_bent_side
- hand_near_face
- hand_over_chest
- hand_behind_body
- torso_left_bend
- torso_right_bend
- torso_forward_bend
- pelvis_left
- pelvis_right
- side_turn_left
- side_turn_right
@@ -0,0 +1,93 @@
# Dance Image Specification
Solo Dance 3를 모든 컨셉 의상으로 재구성한다. 결과물은 정지 이미지 감상이 아니라 Live2D 리그와 모션 제작을 위한 단계별 자료여야 한다.
## 필수 키포즈
각 컨셉마다 24~32개 키포즈 PNG를 제작한다.
파일명:
`leesori_<concept>_dance_solo3_key_###_<label>.png`
필수 label:
- ready
- downbeat
- hand_forward_prep
- palm_push
- wrist_roll_front
- wrist_roll_side
- shoulder_bounce
- arm_lift_half_L
- arm_lift_half_R
- arm_lift_high_L
- arm_lift_high_R
- both_arms_up_prep
- both_arms_up
- hair_touch
- chest_down
- chest_up
- side_turn_left
- side_turn_right
- back_turn_hair_swing
- hand_near_face
- finger_accent
- hip_left
- hip_right
- return_settle
## 루프별 산출물
- Loop A: idle groove
- Loop B: hand forward / palm push
- Loop C: wrist roll
- Loop D: arms up
- Loop E: side turn / hair swing
- Loop F: return settle
각 루프마다 다음 자료를 만든다.
- keyframe PNG sequence
- contact sheet
- motion notes md
- motion curve draft json
- z-order event draft json
## 신체 모션 요구
### 상체
- chest가 pelvis보다 늦게 따라오거나 반대로 움직인다.
- forward bend와 side bend가 모두 있어야 한다.
- 가슴/상의 라인이 파츠 이동 중 끊기지 않도록 보정 파츠가 필요하다.
### 팔
- 팔은 shoulder lift, elbow bend, wrist roll을 분리해서 표현한다.
- 팔이 머리 위로 올라갈 때 어깨, 소매, 겨드랑이 라인이 자연스럽게 이어져야 한다.
- 팔이 몸 앞을 지나갈 때 arm-over-torso z-order 이벤트가 필요하다.
### 손/손가락
- open palm, side palm, backhand, soft fist, point, finger accent가 필요하다.
- 손가락은 최소 그룹 파츠라도 분리되어야 한다.
- 손목 회전은 손바닥 방향이 바뀌는 것으로 확인 가능해야 한다.
### 하체
- 골반 좌우 이동과 무릎의 미세 굽힘이 있어야 한다.
- 앱 crop에서 하체가 많이 보이지 않아도 골반 리듬은 상체 움직임에 영향을 준다.
### 헤어/액세서리
- 머리카락은 head보다 늦게 움직인다.
- 헤드셋은 머리 회전에 맞지만 컵과 밴드가 어색하게 분리되지 않아야 한다.
## 실패 조건
- 포즈만 바뀌고 중간 동작을 유추할 자료가 없음
- 팔과 몸통이 함께 굳어 보임
- 손목 방향 변화가 없음
- 몸통과 골반이 같은 방향으로만 움직임
- 머리카락 follow-through 자료가 없음
@@ -0,0 +1,54 @@
# Gesture Image Specification
모든 컨셉은 같은 제스처 세트를 제작한다. 각 제스처는 앱용 baked image와 Live2D 제작용 참조 포즈를 모두 고려한다.
## 공통 제작 조건
- 모든 이미지는 동일 캐릭터 비율과 얼굴을 유지한다.
- 배경은 투명 PNG를 기본으로 한다.
- 앱용 이미지는 1024x1536 세로 캔버스를 기본으로 한다.
- 전신 포즈와 앱 상체 포즈가 필요한 제스처는 둘 다 제작한다.
- 손가락이 중요한 제스처는 손 close-up crop도 함께 제작한다.
## 제스처별 요구사항
| Gesture | 핵심 포인트 | 손/팔 조건 | 앱 용도 |
|---|---|---|---|
| idle_full | 안정적인 전신 대기 | 양팔 자연스럽게 아래 또는 몸 앞 | 기본 전신 참고 |
| idle_upper | 무릎 위~머리끝 구도 | 손이 화면 안에 들어옴 | 앱 기본 대기 |
| listen | 귀/헤드셋 주의 | 한 손이 헤드셋 또는 귀 주변 | 입력 대기 |
| thinking | 턱/입 주변 손 | 팔꿈치와 손목 자연스러움 | 처리 중 |
| present | 한 손 또는 양손 안내 | open palm front/side 명확 | 안내 |
| point | 검지 방향 명확 | index finger 별도 표현 | 선택/강조 |
| control | 슬라이더/노브 조작 | 손가락 곡선, 손목 회전 | EQ 제어 |
| handwave | 작은 인사 | 손바닥 보임 | 친근한 반응 |
| wave | 큰 인사 | 팔 위로, 손목 자연스러움 | 환영/완료 |
| peace | 브이 손가락 | 검지/중지 분리 | 긍정 |
| thumbsup | 엄지 명확 | fist + thumb 분리 | 성공 |
| clap | 양손 접촉 | 손바닥 방향 일치 | 축하 |
| cheer | 양팔 위 | 어깨/팔꿈치 연결 자연스러움 | 기쁨 |
| joy | 밝은 표정 | 몸통 bounce 가능 | 성공/즐거움 |
| heart | 양손 하트 | 좌우 손 half-heart | 애정/감사 |
| armscross | 팔짱 | 팔 앞뒤 z-order 명확 | 대기/자신감 |
| shrug | 어깨 들림 | 양손 open side | 모름/중립 |
| piano | 손가락 곡선 | 양손 finger curve | 음악/키보드 |
| dj | 믹서 조작 | 한 손 turn, 한 손 touch | 음악/DJ |
| error_soft | 조심스러운 사과 | 손이 가슴/얼굴 근처 | 오류 |
| muted | 조용히 | 입 주변 검지 또는 낮은 손 | 음소거 |
## 추가 close-up 산출물
각 컨셉마다 손 close-up을 만든다.
- `leesori_<concept>_hand_relaxed_sheet.png`
- `leesori_<concept>_hand_open_palm_sheet.png`
- `leesori_<concept>_hand_finger_gesture_sheet.png`
- `leesori_<concept>_hand_wrist_roll_sheet.png`
## 실패 조건
- 손가락이 뭉개져 제스처 의미를 알 수 없음
- 팔이 몸과 분리되어 떠 보임
- 팔이 두 쌍으로 보임
- 소매와 팔 피부가 어긋남
- 앱 crop에서 손이 화면 밖으로 잘림
@@ -0,0 +1,113 @@
# Live2D Parts Specification
모든 컨셉은 Live2D 제작 가능한 파츠 세트를 가져야 한다. 파츠는 같은 캔버스 좌표계를 공유하며 투명 PNG로 저장한다.
## Body Parts
- root guide
- pelvis base
- abdomen skin
- abdomen shadow
- chest skin
- breast/cloth stretch L/R
- under-bust shadow
- neck front
- neck back fill
- head base
- face shadow
- cheek L/R
## Arm Parts
좌우 모두 필요하다.
- shoulder cover
- upperarm skin/clothes
- elbow corrective front
- elbow corrective side
- forearm skin/clothes
- wrist/cuff
- palm
- backhand
- thumb group
- index group
- middle/ring/pinky group
- fingernail/highlight if visible
## Hair Parts
- back hair base
- back hair shadow
- back hair strand L/R
- back hair tip L/R
- front hair center
- front hair L/R
- side hair L/R
- hair highlight front
- hair loose strand optional
## Face Parts
- eye white L/R
- iris L/R
- pupil L/R
- highlight L/R
- upper lash L/R
- lower lash L/R
- lid L/R
- brow L/R
- nose
- mouth upper line
- mouth lower line
- mouth inside
- teeth upper/lower
- tongue
- lip highlight
## Clothes Parts
컨셉별로 이름은 다를 수 있지만 기능은 유지한다.
- top base
- top shadow
- collar/neckline L/R
- sleeve upper L/R
- sleeve forearm L/R
- lower garment base
- waistband/belt/string
- jacket/body outer L/R if exists
- accessory overlays
- movement corrective patches
## Z-order Masks
- arm over torso L/R
- torso over arm L/R
- hand over face L/R
- hair over shoulder L/R
- shoulder over hair L/R
- skirt/dress over leg if applicable
- leg over dress slit if applicable
## Manifest Required Fields
각 파츠는 manifest에 다음 정보를 가진다.
- id
- file
- group
- side
- zDefault
- pivotHint
- deformType
- parentBone
- visibleInPoses
- notes
## 실패 조건
- 파츠가 전신 이미지를 통째로 포함함
- 같은 팔 영역이 여러 파츠에 중복되어 팔이 두 개로 보임
- 손 파츠가 비어 있음
- 캔버스 크기가 서로 다름
- 의상 보정 파츠가 없어 움직일 때 라인이 끊김
@@ -0,0 +1,94 @@
# Rig and Motion Specification
## Rig Hierarchy
- Root
- Pelvis
- Abdomen
- Chest
- Neck
- Head
- Face
- HairFront
- HairSideL/R
- HairBack
- Headset
- ShoulderL
- UpperArmL
- ForeArmL
- HandL
- FingersL
- ShoulderR
- UpperArmR
- ForeArmR
- HandR
- FingersR
- LegL
- LegR
## Required Parameters
- ParamRootX
- ParamRootY
- ParamPelvisAngleZ
- ParamPelvisX
- ParamPelvisY
- ParamBodyBendX
- ParamBodyBendY
- ParamChestAngleZ
- ParamChestX
- ParamChestY
- ParamHeadAngleX
- ParamHeadAngleY
- ParamHeadAngleZ
- ParamShoulderRaiseL/R
- ParamArmLiftL/R
- ParamElbowBendL/R
- ParamWristRollL/R
- ParamPalmOpenL/R
- ParamFingerCurlL/R
- ParamHairSwayL/R
- ParamBreath
- ParamMouthOpen
- ParamEyeBlinkL/R
## Motion Curves
모든 모션은 cubic/ease 기반이다. linear 보간만으로 제작하지 않는다.
- root bounce: sine/cubic loop
- pelvis: root보다 약간 빠르게 리듬 생성
- chest: pelvis와 반대 방향 또는 지연
- head: chest보다 2~4프레임 지연
- hair: head보다 3~6프레임 지연
- arm lift: ease-out + overshoot
- wrist roll: 짧은 accent curve
- finger curl: 손목보다 작은 진폭과 빠른 타이밍
## Z-order Events
다음 이벤트를 JSON으로 정의한다.
- armFrontL
- armFrontR
- armBackL
- armBackR
- handFrontFaceL
- handFrontFaceR
- hairFrontShoulderL
- hairFrontShoulderR
- torsoFrontArmL
- torsoFrontArmR
- dressOverLeg
- legOverDress
## Runtime Outputs
각 컨셉마다 다음을 만든다.
- `leesori_<concept>_rig_hierarchy.json`
- `leesori_<concept>_pivot_map.json`
- `leesori_<concept>_live2d_parameters.json`
- `leesori_<concept>_motion_curves.json`
- `leesori_<concept>_z_order_events.json`
- `leesori_<concept>_runtime_rig.json`
@@ -0,0 +1,59 @@
# QA Checklist
각 컨셉의 이미지/파츠/리그/Live2D 자료는 아래 항목을 통과해야 한다.
## Identity
- LeeSori 얼굴로 일관되게 보인다.
- 헤드셋 또는 음악 작업자 아이덴티티가 유지된다.
- 청록 포인트가 컨셉 안에서 자연스럽게 포함된다.
## Image Quality
- 투명 PNG 가장자리에 배경색 찌꺼기가 없다.
- 손가락, 눈, 입, 액세서리가 뭉개지지 않는다.
- 앱 crop에서 얼굴과 손 제스처가 보인다.
- 전신 reference에서 발끝, 머리끝이 잘리지 않는다.
## Gesture
- 모든 공통 제스처가 있다.
- 제스처 의미가 즉시 구분된다.
- 손 close-up이 제스처와 일치한다.
- 팔이 두 쌍으로 보이지 않는다.
## Dance
- Solo Dance 3 키포즈 24개 이상이 있다.
- 팔 lift arc가 단계적으로 보인다.
- 손목 roll과 손바닥 방향 변화가 있다.
- 상체/골반 counter motion을 만들 자료가 있다.
- 머리카락 follow-through 자료가 있다.
## Live2D Parts
- 모든 파츠가 같은 캔버스다.
- 파츠가 전신을 통째로 포함하지 않는다.
- 상완/전완/손/손가락이 분리되어 있다.
- 의상 보정 파츠가 있다.
- z-order mask가 있다.
## Rig
- pivot이 관절 위치에 있다.
- 팔꿈치와 손목이 자연스럽게 움직일 수 있다.
- chest/pelvis/head/hair가 서로 다른 타이밍으로 움직일 수 있다.
- z-order event가 정의되어 있다.
## Fail Conditions
하나라도 해당하면 재작업한다.
- 팔 중복
- 빈 손 파츠
- 손가락 의미 불명확
- 의상 라인 절단
- 얼굴 정체성 변화
- 앱 crop 실패
- 정지 이미지 전환처럼 보이는 댄스 자료
- Live2D 파츠로 사용할 수 없는 통짜 이미지
@@ -0,0 +1,55 @@
# LeeSori Image Production Package
이 폴더는 `../이미지작업_의뢰서.md`가 호출하는 LeeSori 이미지 제작 종속 실행 패키지다. AI 작업자는 먼저 `../이미지작업_의뢰서.md`를 읽고, 이어서 이 `README.md``_RUN_ORDER.md`, 연결된 하위 md를 순서대로 처리한다.
## 목표
LeeSori를 모든 컨셉에서 동일한 캐릭터 정체성을 유지하면서 자연스러운 앱 제스처와 Live2D 리그까지 제작 가능한 수준으로 완성한다.
- 컨셉별 기본 시트 제작
- 컨셉별 BakedPoses 전 제스처 재제작
- 컨셉별 댄스 키포즈 및 루프 시트 제작
- 컨셉별 세분화 파츠 제작
- 컨셉별 Live2D 레이어 PNG / PSD 조립 자료 제작
- 컨셉별 리그/피벗/z-order/모션커브 자료 제작
- DansoriEQ 앱 적용용 상체/무릎 위 프레이밍 이미지 제작
## 적용 컨셉
| 컨셉 | 폴더 | 핵심 이미지 |
|---|---|---|
| Campus | `01_Concepts/Campus.md` | 밝고 젊은 캠퍼스/캐주얼 스타일 |
| CeoPantsuit | `01_Concepts/CeoPantsuit.md` | 전문적이고 차분한 CEO 팬츠수트 스타일 |
| DressLong | `01_Concepts/DressLong.md` | 긴 드레스, 우아한 실루엣 |
| DressShort | `01_Concepts/DressShort.md` | 짧은 드레스, 밝은 무대형 실루엣 |
| Jeans | `01_Concepts/Jeans.md` | 데님 캐주얼, 자연스러운 일상형 스타일 |
| Track | `01_Concepts/Track.md` | 트랙 재킷/스포티, DansoriEQ 기본 활동형 스타일 |
| Tshirt | `01_Concepts/Tshirt.md` | 티셔츠 캐주얼, 편안한 기본형 스타일 |
## 우선순위
1. `Track`: DansoriEQ 기본 앱 캐릭터와 가장 가까운 기준 컨셉
2. `Campus`, `Tshirt`, `Jeans`: 앱 제스처 재사용 우선
3. `CeoPantsuit`: 전문/업무형 반응 우선
4. `DressShort`, `DressLong`: 무대/댄스/감정 표현 우선
## 필수 실행 문서
- `../이미지작업_의뢰서.md`: 단일 최상위 의뢰서
- `_RUN_ORDER.md`: 전체 작업 순서
- `00_Common/CHARACTER_IDENTITY.md`: 모든 컨셉 공통 캐릭터 정체성
- `00_Common/OUTPUT_SPEC.md`: 산출물 경로와 파일명 규칙
- `00_Common/POSE_AND_GESTURE_SET.md`: 모든 컨셉 공통 제스처 목록
- `03_Live2D/LIVE2D_PARTS_SPEC.md`: Live2D 파츠 제작 기준
- `03_Live2D/RIG_AND_MOTION_SPEC.md`: 리그/모션 기준
- `04_QA/QA_CHECKLIST.md`: 최종 검수 기준
## 제작 원칙
- 기존 BakedPose 이미지를 그대로 사용하지 않는다. 모든 컨셉별 이미지는 최종 기준으로 새로 제작한다.
- 컨셉이 달라도 LeeSori의 얼굴, 헤드셋, 청록 계열 포인트, 음악 작업자 이미지는 유지한다.
- 팔/손/손가락/상체/의상 라인은 Live2D용 파츠 분리가 가능하도록 명확하게 만든다.
- 정지 포즈 이미지만 만들지 않고, 파츠/리그/모션 제작까지 이어질 자료를 함께 만든다.
- 모든 산출물은 컨셉별로 동일한 파일명 체계를 사용한다.
@@ -0,0 +1,124 @@
# LeeSori Image Production Run Order
AI 작업자는 `../이미지작업_의뢰서.md`를 단일 최상위 의뢰서로 사용하고, 이 순서를 그대로 따른다. 하위 문서를 누락 없이 처리한다.
## 0. 사전 확인
1. `../이미지작업_의뢰서.md`를 읽는다.
2. `README.md`를 읽는다.
3. `00_Common/CHARACTER_IDENTITY.md`를 읽고 LeeSori 정체성을 고정한다.
4. `00_Common/OUTPUT_SPEC.md`를 읽고 파일명과 폴더 규칙을 확정한다.
5. `00_Common/POSE_AND_GESTURE_SET.md`를 읽고 모든 컨셉에서 제작할 포즈 목록을 확정한다.
6. `00_Common/DANCE_REFERENCE_SPEC.md`를 읽고 Solo Dance 3 기준 댄스 요구사항을 확인한다.
## 1. 컨셉별 기본 이미지 제작
아래 순서대로 각 컨셉 md를 읽고 진행한다.
1. `01_Concepts/Track.md`
2. `01_Concepts/Campus.md`
3. `01_Concepts/Tshirt.md`
4. `01_Concepts/Jeans.md`
5. `01_Concepts/CeoPantsuit.md`
6. `01_Concepts/DressShort.md`
7. `01_Concepts/DressLong.md`
각 컨셉에서 먼저 제작할 기본 산출물:
- full body neutral sheet
- upper body app framing sheet
- expression sheet
- hand sheet
- gesture sheet
- dance key pose sheet
- Live2D layer reference sheet
## 2. 공통 제스처 제작
각 컨셉마다 `02_Gestures/GESTURE_IMAGE_SPEC.md`를 적용한다.
필수 제스처:
- idle_full
- idle_upper
- listen
- thinking
- present
- point
- control
- handwave
- wave
- peace
- thumbsup
- clap
- cheer
- joy
- heart
- armscross
- shrug
- piano
- dj
- error_soft
- muted
## 3. 댄스 자료 제작
각 컨셉마다 `02_Gestures/DANCE_IMAGE_SPEC.md`를 적용한다.
필수 댄스 산출물:
- Solo Dance 3 key poses 24~32장
- loop A idle groove
- loop B hand forward / palm push
- loop C wrist roll
- loop D arms up
- loop E side turn / hair swing
- loop F return settle
- frame contact sheet
- motion note sheet
## 4. Live2D 파츠 제작
`03_Live2D/LIVE2D_PARTS_SPEC.md`를 적용한다.
각 컨셉마다 다음을 제작한다.
- Live2D LayerPNGs
- part manifest
- PSD assembly guide
- PSD file if supported
- part contact sheet
- corrective part sheet
- z-order event sheet
## 5. 리그와 모션 제작
`03_Live2D/RIG_AND_MOTION_SPEC.md`를 적용한다.
각 컨셉마다 다음을 제작한다.
- rig hierarchy json
- pivot map
- Live2D parameter list
- motion curve json
- z-order event json
- app runtime rig json
## 6. QA
`04_QA/QA_CHECKLIST.md`를 적용한다.
불합격이면 해당 컨셉의 이미지/파츠/리그 문서로 되돌아가 수정한다.
## 7. 완료 조건
한 컨셉은 다음이 모두 있을 때 완료다.
- 컨셉 md 요구사항 충족
- 모든 공통 제스처 이미지 존재
- 댄스 키포즈/루프 자료 존재
- Live2D 파츠와 manifest 존재
- 리그/피벗/모션/z-order 자료 존재
- QA 체크리스트 통과
+25 -22
View File
@@ -1,29 +1,32 @@
# LeeSori_Profile — 이소리 인터랙티브 캐릭터 시스템 (단일 진실원)
# LeeSori Profile
> **최종 목적**: 이소리를 **앱에 탑재**해 **상황별로 반응하는** 살아있는 마스코트로 만든다.
> (예: 오류 → 팔짱+인상+"안돼요", 성공 → 하트+"잘됐어요", 대기 → 배경 가벼운 춤 …)
> **원칙**: 이미지는 **ChatGPT 자동생성**, 리그·모션·반응 시퀀스·색상은 **코드/데이터**. 방식은 **하이브리드**(리그 + 베이크드 포즈 + 표정 프레임 스왑).
LeeSori는 Dansori 프로젝트의 메인 EQ 어시스턴트 캐릭터다. 이 폴더는 캐릭터 설정, 이미지 자산, Live2D 제작 자료, 리그 사양, 모션 사양, 앱 통합 기준을 모두 포함하는 최종 기준 패키지다.
이 폴더는 목적·방향·구현레벨·방법·자산·로드맵을 한곳에 모은 **source of truth**다. (구 `LeeSori_Rigging`는 이 폴더로 통합·폐기됨.)
## 목표
- DansoriEQ 우측 캐릭터 영역에서 자연스럽게 대기, 반응, 안내, 성공/오류 피드백을 수행한다.
- Live2D 기반 파츠 리그와 재사용 가능한 제스처 라이브러리를 갖춘다.
- Solo Dance 3를 기준으로 상체, 팔, 손, 손가락, 머리카락, 골반 리듬이 살아 있는 댄스 모션을 제작한다.
- 모든 의상과 포즈는 재사용 가능한 자산 단위로 분류한다.
## 주요 폴더
## 폴더 안내
| 폴더 | 내용 |
|---|---|
| `01_Overview/` | 목적·방향(`Purpose_and_Direction.md`), 확정 결정 로그(`Decisions.md`) |
| `02_Architecture/` | 레이어 아키텍처·하이브리드 규칙(`Architecture.md`), 한계·완화·mesh-warp 승급(`Limits_and_Mitigations.md`) |
| `03_Assets/` | 자산 전체 맵(`Assets_Overview.md`), 리그 파츠 생성 스펙(`Parts/`), 표정·베이크드 포즈(`Expressions_and_Poses.md`) |
| `04_Rig/` | 스켈레톤 정의 `rig.json` + `Rig.md` |
| `05_Animation/` | 리그 클립(배경춤) `dance_idle.json` + `Animation.md` |
| `06_Reactions/` | 반응 시퀀서·트리거 설계(`Reactions.md`), 매핑 `reactions.json`, 샘플 클립 `clips/` |
| `07_Viewer/` | 프로토타입 뷰어 `index.html`(더블클릭 재생) + `Viewer.md` |
| `08_Roadmap/` | 단계별 구현 계획(`Roadmap.md`), 앱 통합(`App_Integration.md`) |
| `01_Overview` | 캐릭터 방향, 역할, 결정 사항 |
| `02_Architecture` | 제작 구조, 파츠/리그/앱 통합 구조 |
| `03_Assets` | 이미지, 파츠, Live2D 레이어, 의상/포즈 라이브러리 |
| `04_Rig` | 리그 계층, 피벗, 파라미터, 런타임 구조 |
| `05_Animation` | 기본 모션, 댄스 모션, 모션 커브 |
| `06_Reactions` | 상태별 리액션, 제스처 클립 |
| `07_Viewer` | 로컬 확인용 뷰어 |
| `08_Roadmap` | 앱 적용 및 제작 순서 |
| `09_DanceMotion` | 댄스 리그 확장, 추가 파츠, Live2D 모션 사양 |
## 한 눈에 (현재 확정 상태)
- **구현 레벨**: 코드 네이티브 경량 리그(강체 컷아웃) + 하이브리드. Live2D/Spine 미사용(자동화 위해). mesh-warp는 **옵션/후속**.
- **분절**: 해부학 16파츠(head·neck·chest·pelvis + 팔3×2 + 다리3×2).
- **얼굴**: 표정 프레임 스왑 20종 + 말하기 talk 프레임(유사 립싱크).
- **완료**: 방향 확정 · 리그 스키마 · 배경춤 프로토타입(뷰어에서 플레이스홀더로 재생 확인 가능).
- **다음**: 시트 투명알파 재확정 → 리그 파츠 생성(ChatGPT) → 배경춤 실아트 검증 → 반응 시퀀서 → 앱 통합. (상세 `08_Roadmap/Roadmap.md`)
## 제작 기준
## 지금 바로
`07_Viewer/index.html` 더블클릭 → 이소리 스켈레톤이 가볍게 춤추는 것을 확인.
- 최종 기준 폴더는 `LeeSori_Profile`이다.
- Live2D 제작 자산과 일반 프로필 자산은 같은 캐릭터 패키지 안에서 관리한다.
- 정지 이미지 연속 재생이 아니라, 파츠 리그와 모션 커브 기반의 연속 동작을 목표로 한다.
- 팔, 손, 손가락, 의상 라인, 헤어, 상체와 골반은 별도 파츠와 보정 파츠로 분리한다.
- 앱 통합용 경량 런타임과 Live2D 제작용 원본 자료를 함께 보관한다.
+50 -60
View File
@@ -1,73 +1,63 @@
# 이소리(Lee Sori) 리그 파츠 이미지 작업 의뢰서 — 마스터-슬라이스 · 풀캔버스
# LeeSori 이미지작업 의뢰서
> **이 문서 하나만 작업자(ChatGPT)에게 주면 됩니다.** 상세 파츠 정의: `03_Assets/Parts/Parts.md`.
> 목적: 이소리를 코드 리그로 춤·제스처 시키기 위한 **관절 파츠 PNG**.
이 문서는 LeeSori 이미지 제작의 단일 진입점이다. AI 작업자는 이 문서를 먼저 읽고, `10_ImageProduction/README.md``10_ImageProduction/_RUN_ORDER.md`를 따라 모든 하위 제작 문서를 순서대로 처리한다.
## 만들 것 (총 17장)
- **마스터 1장**: `sori_part_master_apose.png`
- **관절 파츠 16장**: `sori_part_head` · `neck` · `chest` · `pelvis` · `upperarm_r/l` · `forearm_r/l` · `hand_r/l` · `thigh_r/l` · `shin_r/l` · `foot_r/l`
## 작업 목적
## 첨부
- 정체성 시트: **`03_Assets/Reference/sori_sheet.png`** (동일 인물 유지).
LeeSori의 모든 컨셉별 이미지, 제스처, 댄스 포즈, Live2D 파츠, 리그 자료, 앱 런타임 자료를 최종 기준으로 제작한다. 기존 BakedPose 이미지를 단순 재사용하지 않고, 각 컨셉에 맞는 최종 제작용 자료를 새 기준으로 정리한다.
## 방법: 마스터-슬라이스 (풀캔버스 출력)
1. 아래 프롬프트로 **마스터 A-포즈 1장**을 만든다.
2. 마스터를 16조각(관절 단위)으로 **슬라이스**한다.
3. **★핵심 — 각 파츠를 크롭하지 말 것.** 각 조각을 **마스터와 동일한 520×900 캔버스에, 마스터에서의 원위치 그대로** 배치해 저장한다(그 파츠 외 영역은 완전 투명). → 16장을 그냥 겹치면 마스터가 그대로 복원된다(= **같은 좌표계 → 관절 자동 정합**).
## 실행 순서
## 공통 규칙
- **진짜 투명 알파 PNG — 32-bit RGBA, 배경 alpha = 0.** 흰/회색/체커보드/매트 채움·불투명 24-bit 금지.
- **캔버스 = 520×900 고정** (마스터·모든 파츠 동일 크기·동일 정렬). 파츠는 그 캔버스 위 **제자리**, 나머지 투명.
- **관절 오버랩**: 부모와 붙는 쪽(근위단)은 **관절 뒤로 조금 더 남겨** 부모 밑에 들어가게(회전 시 틈 가림). 반대쪽(원위단)은 라운드 캡.
- **가장자리**: 깨끗한 안티에일리어스, **흰 후광·프린지 금지**(머리카락 포함).
- **의상 = 트랙슈트**(화이트 크롭후디 + 민트/블랙 트랙재킷 + 블랙 트랙팬츠 + 블랙/민트 스니커즈). 헤드폰·초커는 머리 파츠에 포함.
- **좌우**: `_r` = 캐릭터 오른쪽(**화면 왼쪽**), `_l` = 캐릭터 왼쪽(**화면 오른쪽**).
- **저장**: `03_Assets/Parts/Images/` , 파일명 정확히. **한 조각 = 1파일.**
1. `10_ImageProduction/README.md`를 읽는다.
2. `10_ImageProduction/_RUN_ORDER.md`를 읽는다.
3. `10_ImageProduction/00_Common`의 공통 기준을 모두 읽는다.
4. `10_ImageProduction/01_Concepts`의 7개 컨셉 문서를 순서대로 처리한다.
5. `10_ImageProduction/02_Gestures`의 제스처/댄스 제작 기준을 모든 컨셉에 적용한다.
6. `10_ImageProduction/03_Live2D`의 파츠/리그/모션 기준을 모든 컨셉에 적용한다.
7. `10_ImageProduction/04_QA/QA_CHECKLIST.md`로 결과를 검수한다.
---
## 제작 대상 컨셉
## 마스터 프롬프트
## sori_part_master_apose.png
```
Draw the SAME woman 이소리 (from the attached reference sheet) as ONE clean full-body FRONT NEUTRAL A-POSE on a
520x900 PORTRAIT canvas, designed to be sliced into rig parts. Track outfit (white cropped hoodie + mint/black
track jacket + black track pants with mint side stripe + black/mint sneakers), white over-ear headphones, black
choker with teal teardrop pendant. GLAMOROUS adult hourglass (tasteful), about 7 heads tall. POSE FOR SLICING:
standing straight, front view, BOTH ARMS held clearly AWAY from the torso (a wide A-pose) so the arms do NOT
overlap the body; elbows straight; palms facing forward, fingers slightly spread; legs straight and APART so
they do NOT touch; EVERY joint (shoulders, elbows, wrists, hips, knees, ankles, neck) clearly visible and
unobstructed. Flat even lighting, thin clean anime semi-real linework matching the sheet. FULLY TRANSPARENT
background, 32-bit RGBA, background alpha = 0 — no white, no shadow, no rim light. Clean anti-aliased edges, no
white halo/fringe around hair or body. No text. Avoid: white/opaque background, arms touching the torso, legs
touching each other, bent/crossed limbs, dynamic pose, extra fingers, deformed hands, chibi.
```
- Track
- Campus
- Tshirt
- Jeans
- CeoPantsuit
- DressShort
- DressLong
---
## 필수 산출물
## 슬라이스 컷 & 16 파일 (각각 520×900 풀캔버스, 제자리)
- **컷 라인(관절)**: 목(위·아래) · 어깨 · 팔꿈치 · 손목 · 허리 · 골반(양 고관절) · 무릎 · 발목.
- **각 파츠 범위 · 근위단(오버랩)**:
각 컨셉마다 다음 자료를 제작한다.
| 파일 | 범위 | 근위단(관절 뒤로 오버랩) |
|---|---|---|
| `sori_part_head.png` | 두개골·얼굴·귀·민트단발·헤드폰·초커 (+목 살짝) | 목(가슴 밑) |
| `sori_part_neck.png` | 턱~쇄골 목기둥 | 양끝 |
| `sori_part_chest.png` | 어깨~허리 (후디+트랙재킷) | 허리·양 어깨 |
| `sori_part_pelvis.png` | 허리~허벅지 상단 (트랙팬츠) | 허리(가슴 밑) |
| `sori_part_upperarm_r.png` / `_l` | 어깨~팔꿈치 (재킷 소매) | 어깨(가슴 밑) |
| `sori_part_forearm_r.png` / `_l` | 팔꿈치~손목 (재킷 소매) | 팔꿈치 |
| `sori_part_hand_r.png` / `_l` | 손목~손끝 (펼친 손) | 손목 |
| `sori_part_thigh_r.png` / `_l` | 고관절~무릎 (트랙팬츠) | 고관절(골반 밑) |
| `sori_part_shin_r.png` / `_l` | 무릎~발목 (트랙팬츠) | 무릎 |
| `sori_part_foot_r.png` / `_l` | 발목~발끝 (스니커즈) | 발목 |
- 기본 전신 기준 이미지
- 앱 우측 패널용 상체/무릎 위 이미지
- 표정 시트
- 손/손가락 시트
- 공통 제스처 이미지 세트
- Solo Dance 3 기반 댄스 키포즈 세트
- 댄스 루프용 contact sheet
- Live2D 레이어 PNG
- PSD 조립 자료
- 파츠 manifest
- rig hierarchy
- pivot map
- motion curve
- z-order event
- QA 결과
## 검수 (제출 전)
1. 마스터 + 16파츠 = **17장**, 파일명 정확.
2. 전부 **520×900, 32-bit RGBA, 배경 alpha=0.**
3. **16장을 (0,0) 기준으로 겹치면 마스터가 복원**된다(= 제자리 배치·자동 정합 확인).
4. 머리/관절 가장자리 흰 후광 없음, 근위단 오버랩 있음.
## 중복 방지 원칙
---
- 이 문서가 최상위 의뢰서다.
- `10_ImageProduction/README.md`는 제작 패키지 설명서다.
- `10_ImageProduction/_RUN_ORDER.md`는 실행 순서다.
- 컨셉별 세부 지시사항은 `10_ImageProduction/01_Concepts` 아래에만 작성한다.
- 제스처와 Live2D 공통 기준은 `10_ImageProduction/02_Gestures`, `10_ImageProduction/03_Live2D`에만 작성한다.
- 같은 내용을 다른 위치에 반복 작성하지 않는다.
## (선택 · 후속) 대체 손 attachment
- 핑거하트·주먹·가리킴 등 **마스터에 없는 손 모양**은 이 작업 범위 밖. 필요할 때 별도 요청(개별 생성).
## 품질 기준
- LeeSori의 얼굴, 헤드셋, 청록 포인트, 음악 작업자 이미지는 모든 컨셉에서 유지한다.
- 팔, 손, 손가락, 상체, 골반, 머리카락이 자연스럽게 움직일 수 있도록 충분히 세분화된 파츠를 제작한다.
- 앱용 baked pose와 Live2D 제작용 파츠를 구분한다.
- 정지 이미지 연속 재생처럼 보이지 않도록 모션 커브와 리그 자료까지 함께 제작한다.