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
-87
View File
@@ -1,87 +0,0 @@
> ⚠️ **아카이브** (소스 자산 생성 시기 기록, 이동된 소스 폴더 참조 포함). **현재 베이스 = `INTERACTIVE_RIG_HANDOFF.md` + `*_Profile/` + `README.md`.**
# HANDOFF — Dansori 캐릭터 자산 & Character Builder (세션 인수인계)
> 작성: 2026-07-02 (같은 날 저녁 갱신). 다른 세션에서 이어서 진행하기 위한 요약.
> **최신**: NewImage 88장을 각 `Images/`로 **이동 완료** · `Characters`/`Characters.Old` **삭제 예정** · 이미지 생성 계속 후 **내일(2026-07-03) 이어서**.
> 이 문서 = **캐릭터 자산 시스템(`Characters_Build_Docs`) + 조합 앱(`Character_Builder`)** 진행/계획.
> DansoriEQ **본체 앱 UI** 작업(메인화면 캐릭터 배치·전 창 네온·부유 동기화 등)은 `../docs/HANDOFF.md §8` 참조.
---
## 0. 한 줄 요약
Dansori 브랜드 마스코트(이소리·이단·듀오)를 **페이퍼돌 조립 방식**으로 관리하는 자산 체계와,
이를 **직접 보고 조합/저장(.md)** 하는 WPF 앱을 구축했다. **이미지 대량 생성은 진행 중**이며,
빌더 테스트는 **이미지가 충분히 생성된 뒤** 진행 예정.
## 1. 자산 시스템 구조 (`Characters_Build_Docs/`)
```
README.md # 브랜드 자산 규칙 + "새 캐릭터 추가 Playbook"(STEP 1~7) ← 단일 진실원
HANDOFF.md # (이 문서)
LeeSori/ # 이소리(민트/여)
LeeSori.md # 토대(정체성·조립규칙·네이밍·§8 새 베리에이션 절차·23 표준 바디 목록)
USAGE_FOR_DEV.md # 앱 통합 가이드(캐릭터 공통) — 조립/앵커/포터블 규칙
Reference/sori_sheet.png
Base/Base.md (+Images/) # 트랙슈트 헤드리스 바디: 파츠5 + 제스처18 = 23블록
Hair/Hair.md (+Images/) # 4모양(short/long/waveS/waveL) 개별블록 88 (머리+표정20+hairmask ×4)
Hair/Hair_{Long,Short,WaveS,WaveL}Neat.md # 단정·윤기 추가본 각 22 → 헤어 토큰 총 8종(원본4 + neat4)
Accessories/Accessories.md (+Images/) # 오버레이 11(착용7+소품4)
Variations/{DressShort,DressLong,Jeans,Tshirt,CeoPantsuit}/*.md (+Images/) # 각 23블록
LeeDan/ # 이단(시안/남) — LeeSori와 동일 구조
LeeDan.md · Reference/dan_sheet.png
Base/Base.md(23) · Hair/Hair.md(88: short/buzz/messy/slick ×22) · Accessories(3: headphones/smartwatch/cap)
Variations/{Suit,Casual,Club}/*.md(각 23)
LeeSori_and_LeeDan/ # 듀오(베이크드 장면, 리그 아님)
Duo.md · Reference/{combined_master_sheet,sori_sheet,dan_sheet}.png
Scenes/Scenes.md(+Images/) # 7장: backtoback·sidebyside·fistbump·present·wave·success·earbud_share
Character_Builder/ # WPF 조합 앱 (아래 §4)
```
- 구버전 레이어식 요청서는 `../docs/IMAGE_GEN_*`(및 `*.old`)에 **보존**(다른 세션 작업중, 건드리지 않음). 이 폴더는 그 내용을 캐릭터 중심으로 재정리한 독립본.
## 2. 페이퍼돌 조립 규칙 (모든 캐릭터 공통) — 상세 `README.md`
- 완성 캐릭터 = **헤드리스 바디(복장)** + **머리(헤어모양)** + **표정 프레임** + **악세서리(오버레이)** + **색상(코드 틴트)**.
- **정합 앵커**: 목(바디↔머리)·어깨·정수리/귀·목선·손목·발.
- **동작은 코드**(끄덕/갸웃/호흡/blink/talk = 트랜스폼+프레임 교체) — 이미지 아님.
- **색상은 코드**(hairmask로 hue-shift) — 색 변형 이미지 생성 안 함.
- 생성용 md = **영어 프롬프트 위주**, `Reference/<char>_sheet.png` 첨부 명시, 결과는 **각 md 옆 `Images/`**에 저장.
## 3. 이미지 생성 현황 (갱신 2026-07-02 저녁)
- **목표 총량 ≈ 516장**(md 이미지 블록 기준): 이소리 ~326 · 이단 183 · 듀오 7.
- **완료·배치됨: 88장(이소리)** — `Characters/NewImage`에서 각 `Images/`**이동 완료**(미일치 0):
- `LeeSori/Base/Images` **23**(트랙 바디 전부) · `LeeSori/Accessories/Images` **11**(전부) · `LeeSori/Hair/Images` **54**(short·long 완성 + waveS/waveL 일부)
- `Characters/NewImage` **잔여 0**.
- **미생성 ≈430**: 이소리 헤어 나머지(waveS/waveL 잔여 + **neat 4종 88**) + 복장변형 116 · **이단 183 전부** · **듀오 7**.
- **앞으로**: 생성물은 임시폴더 말고 **각 md 옆 `Images/`에 바로 저장**(분류 불필요). 순서 = 각 캐릭터 `_RUN_ORDER.md`.
## 4. Character Builder (WPF 앱) — `Character_Builder/`
- **상태**: **빌드 성공(오류0)**. `Character_Builder/bin/Debug/net8.0-windows/Character_Builder.exe`.
- 빌드: `dotnet build Characters_Build_Docs/Character_Builder/Character_Builder.csproj` (외부 패키지 없음, 오프라인 OK).
- **기능**: 캐릭터 리스트(시트 썸네일) → 선택 → 파츠 조합(바디/헤어모양/표정/헤어색/악세서리) →
**미리보기 합성****.md 저장(파일명 지정)/불러오기** → **제스처 미리보기**(포즈순환+깜빡임+부유).
- **자동 정렬**: `AlphaTools.cs` 가 알파(불투명) 분석으로 목 위치 검출 → 머리를 바디 목에 스냅 + 비율 스케일.
캐릭터/바디/헤어 변경 시 자동, [🎯 머리 자동 정렬] 버튼으로 재실행, 슬라이더로 미세조정.
- **.md(빌드파일) = Dansori 앱 개발용**: 좌표 규약(stage 520×680, 각 레이어 Height=680 Uniform·중심·center scale·(x,y)px)을
.md 헤더에 명시. 앱은 트랜스폼 직접 사용 또는 동일 정렬 알고리즘 재사용(`AlphaTools` 재활용).
- **테스트 보류**: 사용자가 **이미지가 충분히 생성된 뒤 테스트** 예정(내일).
- 현재 `LeeSori/{Base,Accessories,Hair}/Images`에 88장 배치됨 → **이소리 + short/long 헤어 + 트랙 바디 + 악세서리** 조합은 지금도 미리보기 가능.
## 5. DansoriEQ 본체 앱 (요약 — 상세 `../docs/HANDOFF.md §8`)
- 메인화면 EQ 그래프 좌측 배경에 **이소리(단독)** 크게 배치, 그래프 좌측이동/축소, 창 1600×980.
- 배경 이소리 **부유/말하기**를 아바타와 동기(`MainWindow.SetBgMascotTalking`).
- **전 팝업 창 모던 타이틀(FluentWindow+ui:TitleBar) + 파란 네온 프레임**, MainWindow 네온.
- 다음 코드작업: 배경 이소리 **통짜→헤드리스 리그 교체**(파츠 합성+표정프레임+고개회전+hairmask 틴트+악세 오버레이).
## 6. 앞으로 할 일 (우선순위)
1. **이미지 생성 계속** (사용자, 외부 이미지 AI): 각 `_RUN_ORDER.md` 순서로 **이소리 나머지 → 이단 전체 → 듀오**. 결과는 **각 md 옆 `Images/`에 바로 저장**(분류 불필요).
2.**NewImage → 각 `Images/` 분류 완료** (88장 이동, 미일치 0).
3. **구 자료 삭제**(사용자 직접, 예정): `../Characters`, `../Characters.Old`.
- 안전성 확인됨: 앱은 자체 `src/DansoriEQ.App/Assets/Characters`(13장) 사용, 시트는 Build_Docs에 백업.
- 유일본 손실 주의: Characters.Old의 구 파츠·흰배경 백업·추가포즈(새 파이프라인이 대체 예정).
4. **Character Builder 테스트**(이미지 후) → 자동정렬 정확도 튜닝(머리 스케일 비율 현재 0.32, 목밴드 6%),
필요 시 **드래그 이동**·색상 커스텀 추가.
5. **앱 통합**: `LeeSori/USAGE_FOR_DEV.md` 규칙대로 DansoriEQ(및 향후 Dansori 앱)에 리그 통합.
6. **폴더 이동**: `Characters_Build_Docs`를 Dansori 브랜드 루트로 이동(포터블 규칙 — 절대경로 없음, 통째 이동 가능).
## 7. 유지할 결정/제약
- 색상=코드(이미지X) · 절대경로 하드코딩 금지 · 헤드리스 바디+목 앵커 · 듀오=베이크드 장면 ·
생성 md=영어 프롬프트+시트 첨부 · 빌드 .md=앱 개발용(좌표규약 명시) · 모든 신규 이소리 베리에이션은 기본 리깅 상속.
-47
View File
@@ -1,47 +0,0 @@
> ⚠️ **아카이브** (소스 이미지 생성 기록). 하루카는 완성됨 — 현재 베이스 = `INTERACTIVE_RIG_HANDOFF.md` + `Haruka_Profile/`.
# Haruka Image Generation Progress Handoff
Updated: 2026-07-03 16:32 KST
## Scope
- This session handled **Haruka only**.
- `Isabel/` was intentionally excluded because it is being processed in another parallel session.
## Result
- Haruka `_RUN_ORDER.md` target set is complete.
- Total Haruka targets: **100**
- Verified OK: **100**
- Missing: **0**
- Bad alpha / bad format: **0**
## Completed Groups
- `Haruka/Reference`: 1 / 1
- `Haruka/Hair/Images`: 22 / 22
- `Haruka/Base/Images`: 23 / 23
- `Haruka/Accessories/Images`: 7 / 7
- `Haruka/Variations/Idol/Images`: 23 / 23
- `Haruka/Variations/Witch/Images`: 24 / 24
## Alpha Verification
All Haruka target PNGs were checked with `System.Drawing.Bitmap`.
Required condition:
- `PixelFormat == Format32bppArgb`
- Four corner pixels have `alpha == 0`
Verification summary:
```text
Haruka target total=100 ok=100 missing=0 bad=0
Haruka\Accessories\Images: total=7 ok=7 missing=0 bad=0
Haruka\Base\Images: total=23 ok=23 missing=0 bad=0
Haruka\Hair\Images: total=22 ok=22 missing=0 bad=0
Haruka\Reference: total=1 ok=1 missing=0 bad=0
Haruka\Variations\Idol\Images: total=23 ok=23 missing=0 bad=0
Haruka\Variations\Witch\Images: total=24 ok=24 missing=0 bad=0
```
## Notes
- Generated sources were produced with a flat chroma-key background, then converted locally with the installed `remove_chroma_key.py` helper.
- Existing images were not AI-edited for transparency; alpha was produced by local pixel-based chroma-key removal.
- The final assets are saved beside their source md files under each `Images/` folder, following `_RUN_ORDER.md`.
-50
View File
@@ -1,50 +0,0 @@
# 확정 결정 로그 (Decisions)
> 논의를 통해 확정된 결정과 근거. 뒤집을 땐 여기에 사유와 함께 갱신.
## D1. 표현 방식 = 하이브리드 (확정)
리그 + 베이크드 포즈 + 표정 프레임 스왑을 상황별로 조합.
- **근거**: 리그는 앰비언트/열린 제스처에 강하고, 팔짱·하트 같은 자기-가림 포즈는 베이크드 이미지가 자연스럽다. 각자의 강점만 사용.
## D2. 구현 레벨 = 코드 네이티브 경량 리그 (확정, Live2D/Spine 배제)
- **근거**: Live2D/Spine의 리깅은 **독점 GUI 에디터에서 사람이** 하는 작업 → **AI 자동화 목적과 상충**. 우리 코드로 리그/모션/반응을 소유하면 데이터(JSON)만으로 자동화·반복이 가능.
## D3. 분절 = 완전 해부학 16파츠 (확정)
head·neck·chest·pelvis + (상완·전완·손)×2 + (허벅지·종아리·발)×2.
- **근거**: 팔꿈치·무릎·손목·목·허리가 실제로 접혀야 제스처/춤이 자연스럽다.
## D4. 얼굴 = 표정 프레임 스왑 (확정)
20종 표정 이미지 교체 + 말하기 = talk 프레임 순환(유사 립싱크).
- **한계 인지**: 눈+입이 세트로 고정 → "감정+정밀 립싱크 동시"는 불가. 필요 시 D7로 승급.
## D5. 자기-가림 포즈 = 베이크드 이미지 (확정)
팔짱(armscross)·하트(heart) 등은 리그 보간 대신 **통짜 포즈 이미지**로. (기존 표준 18제스처 자산 재사용.)
## D6. 투명 알파 필수 (확정)
모든 파츠/프레임 = 32-bit RGBA(`Format32bppArgb`), 배경 alpha=0. 24-bit·매트 배경 금지.
## D7. mesh-warp(그리드 변형) = 옵션·후속 (보류)
목/얼굴 국소 mesh-warp(WebGL)로 목 이음새·정밀 립싱크·중간 각도 고개돌림을 승급.
- **승급 조건**: 강체 리그로 목/얼굴이 실제로 부족할 때, 그 부위에만 국소 도입. 전신 적용 안 함.
## D8. 이미지 = ChatGPT 자동생성 (확정)
사람이 안 그림. 생성용 `.md` 스펙을 우리가 제공.
## D9. 색상·모션 = 코드/데이터 (확정)
색 변형 = hairmask hue-shift. 모션 = 리그 클립. 반응 = 시퀀서 데이터.
## D10. 프로필 구조 (확정)
`Haruka_Profile` 구조를 복제해 **`Haruka_Profile`** 로 운용(캐릭터별 자료 구조 표준). 시트 표준 위치 = `03_Assets/Reference/haruka_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 둘 다.
@@ -1,29 +0,0 @@
# 목적과 방향 (Purpose & Direction)
## 최종 목적
하루카를 **앱에 탑재된 인터랙티브 마스코트**로 만든다. 사용자의 행동·앱 상태(상황)에 따라 캐릭터가 **적절한 제스처·표정·대사로 반응**해 살아있는 느낌을 준다.
## 대표 사용 시나리오 (상황 → 반응)
| 상황(트리거) | 반응 |
|---|---|
| 오류/금지된 동작 | 팔짱 끼고 인상 쓰며 고개 저으며 **"안돼요"** |
| 성공/완료/칭찬 | 손 하트 그리며 밝게 **"잘됐어요"** |
| 대기/유휴(배경) | 가볍게 **춤추는** 루프(앰비언트) |
| (확장) 인사 | 손 흔들며 "안녕하세요" |
| (확장) 안내/설명 | 한 손 제시(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** 국소 승급(옵션).
## 범위 밖(당분간 안 함)
- Live2D/Spine 도입(GUI 리깅=자동화와 상충). 전신 mesh-warp. 3D. 정밀 음소 립싱크(얼굴 mesh-warp 승급 시 재검토).
@@ -1,53 +0,0 @@
# 아키텍처 (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
```
## 레이어 책임
- **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) | 필요 정밀도에 따라 |
## 전환 (transition)
- rig→rig: 트랜스폼 보간(부드럽게).
- rig↔baked: 짧은 **크로스페이드**(150~250ms) 또는 리그로 근사 진입 후 스냅.
- 반응 종료 후 `return` 지정 클립(보통 `idle`/`dance_idle`)으로 복귀.
## 데이터 재사용
- `rig.json`·클립·`reactions.json`·표정/포즈 이미지는 **웹 뷰어와 WPF가 동일하게** 사용(플랫폼 독립 데이터).
- 앵커 정렬은 기존 `Character_Builder/AlphaTools.cs`(알파 기반 목/어깨 검출) 로직을 재활용.
@@ -1,29 +0,0 @@
# 한계와 완화 (Limits & Mitigations)
강체 컷아웃 + 프레임 스왑의 본질적 한계와, 우리가 쓰는 완화책. 그리고 mesh-warp 승급 기준.
## L1. 관절 이음새 (강체 회전)
- **문제**: 파츠를 크게 회전하면 관절 경계가 벌어지거나 겹침(특히 목). 분절을 늘려도 **근육 연속성은 해결 안 됨**(강체의 본질).
- **완화**: ① 회전 각도 작게 ② 피벗 낮게 ③ **근위단 오버랩 스텁**(부모가 틈을 덮음) ④ 옷깃/머리/초커로 **가림** ⑤ z-순서.
- **잔여 위험**: 큰 각도 고개돌림·큰 팔동작은 여전히 티남 → baked 포즈로 우회 또는 L4 승급.
## L2. 립싱크 (프레임 스왑 얼굴)
- **문제**: 표정이 눈+입 세트 고정 → "특정 감정 + 정밀 입모양" 동시 불가.
- **완화**: 감정 표정 + 고개짓 + talk/neutral 프레임 순환으로 **뉘앙스 전달**. 필요하면 **감정+talk 조합 머리**를 소수 추가 생성(`../03_Assets/Expressions_and_Poses.md`).
- **잔여 위험**: 음소 단위 정밀 립싱크는 불가 → L4 승급.
## L3. 자기-가림 포즈
- **문제**: 팔짱·하트 등 손이 몸/반대팔에 겹치는 포즈는 리그로 뚫림.
- **완화**: **baked 포즈 이미지**로 대체(기존 18제스처 자산). 진입은 크로스페이드.
## L4. mesh-warp 승급 (옵션·후속)
- **무엇**: 목/얼굴에 그리드 메시를 씌워 **피부 늘어남·입/눈썹 독립 변형·중간 각도 고개돌림**을 구현(WebGL). 우리 런타임 내 구현 → 자동화 유지.
- **승급 조건(하나라도 강하게 필요할 때)**: (a) 목 이음새가 baked/가림으로도 부족 (b) 감정+정밀 립싱크 동시 필요 (c) 중간 각도 고개돌림 필요.
- **한계(승급해도)**: 큰 각도(대략 30°↑) 고개돌림은 **가려진 반대면이 없어** 여전히 각도별 머리 아트 추가가 필요. 자동 워프가 없는 면을 만들지는 못함.
- **원칙**: 전신 아님, **국소(neck/head)만**. 품질 튜닝은 스크린샷 피드백 루프.
## 요약
> 강체+프레임스왑으로 **대부분의 상황 반응은 충분히 자연스럽게** 만든다(가림·baked·잔모션 조합). 정밀 립싱크/큰 고개돌림만 별도 승급(L4/각도 아트) 대상.
@@ -1,30 +0,0 @@
# 자산 전체 맵 (Assets Overview) — Haruka
> ✅ **완성** — 리그·소스 이미지·Library·반응 런타임 모두 완비. 프로필 자립(소스 원본은 별도 아카이브).
## 자산 (전부 프로필 내)
| 종류 | 개수 | 위치 |
|---|---|---|
| 시트 | 1 | `Reference/haruka_sheet.png` |
| 리그 파츠(마스터+16 풀캔버스) | 17 | `Parts/Images/` — 피벗 산출·배경춤 검증 완료 |
| 베이크드 포즈 | 54 | `Library/BakedPoses/` (Sailor·Idol·Witch 각 18) |
| 레거시 파츠 | 15 | `Library/CoarseParts/` (의상별 5) |
| 표정 프레임 | 20 (twin) | `Library/Heads/` (반응 head base `haruka_head_twin`) |
| hairmask / 악세서리 | 1 / 8 | `Library/Hairmasks/` · `Accessories/`(마녀모자 포함) |
| `_layout.json` | — | `06_Reactions/` (반응 목 정합) |
## 뷰어 (더블클릭 재생)
- 배경춤: `07_Viewer/index.html`
- 반응: `07_Viewer/reactions.html` — 트리거 idle / error / success
## dance 튜닝 (occlusion-aware)
세일러 **블라우스↔스커트가 별개 의상**`dance_idle`에서 **chest 리지드**(허리 봉인). 블라우스가 얇아 어깨 소켓 틈이 나기 쉬워 **팔 진폭 축소**(upperarm ±4), 생동감은 소매 안 forearm/hand로.
## 반응 매핑
| 상황 | Body(baked) | Face |
|---|---|---|
| error | `haruka_body_sailor_armscross` | `haruka_head_twin_negative` |
| success | `haruka_body_sailor_heart` | `haruka_head_twin_love` |
@@ -1,39 +0,0 @@
# 표정 & 베이크드 포즈 (Expressions & Poses)
반응 시퀀서의 **Face 레이어**(표정)와 **Body baked 모드**(포즈)가 쓰는 기존 자산 목록. 출처는 기존 Haruka 생성 md.
## 표정 프레임 20종 (Face 레이어)
출처: `(소스 아카이브)`(및 neat 변형). 헤어모양별로 동일 세트.
```
neutral · blink · talk · talk_wide · smile · positive · negative · confused · wink ·
surprised · laugh · thinking · cool · love · shy · sad · pout · sleepy · proud · playful
```
- **말하기**: `talk``talk_wide` ↔ (해당 감정 프레임) 순환으로 입 움직임 근사.
- **감정 표현**: 위 목록에서 상황에 맞는 프레임 선택.
## 베이크드 포즈 18종 (Body baked 모드)
출처: `(소스 아카이브)` (표준 제스처 바디, 헤드리스). 파일 `haruka_body_sailor_<pose>`.
```
idle_full · idle_upper · wave · handwave · listen · present · dj · piano · control ·
thumbsup · heart · clap · peace · armscross · shrug · point · cheer · joy
```
+ 파츠 5(apose·torso·arm_r·arm_l·legs) = 표준 23.
## 반응 3종이 쓰는 조합
| 반응 | Body | Face(감정) | Mouth |
|---|---|---|---|
| gesture_no | baked `armscross` | `negative` (또는 `pout`) | "안돼요" (negative↔talk 순환) |
| gesture_heart | baked `heart` | `love`/`positive`/`smile` | "잘됐어요" (love↔talk 순환) |
| dance_idle | rig 16파츠 | `smile`/`neutral` | — |
## (옵션) 감정+talk 조합 머리 — 립싱크 강화용
프레임 스왑 한계(L2)로 "감정 유지 + 입만 움직임"이 안 될 때만 소수 신규 생성.
- 후보: `haruka_head_<shape>_negative_talk`, `haruka_head_<shape>_love_talk` (+ positive_talk)
- **판단**: 먼저 표정↔talk 순환으로 충분한지 확인 후 결정(불충분하면 생성 또는 mesh-warp L4).
## 주의
- Face 프레임은 **선택한 헤어모양 세트**와 일치해야 함(예: short 바디엔 short 표정).
- 모든 프레임/포즈는 투명 알파 32-bit(`Format32bppArgb`).
Binary file not shown.

Before

Width:  |  Height:  |  Size: 476 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 674 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 596 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 748 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 817 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 742 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 666 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 966 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 909 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 918 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 974 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 914 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 917 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 562 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 864 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 988 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 926 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 867 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 926 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 852 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 876 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 919 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 660 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 627 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 957 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 546 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 562 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1006 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 784 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 559 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 786 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Some files were not shown because too many files have changed in this diff Show More