# 아키텍처 (Architecture) ## 레이어 모델 ``` [상황 이벤트] 예: "error" / "success" / "idle" │ ▼ [트리거 매퍼] reactions.json 상황키 → 반응 클립 이름 │ ▼ [반응 시퀀서] clips/.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`(알파 기반 목/어깨 검출) 로직을 재활용.