Files
2026-07-04 10:34:46 +09:00

48 lines
2.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Rig.md — 스켈레톤 정의 (`rig.json`, 풀캔버스 모드)
경량 리그 뼈대. 뷰어(`../07_Viewer/index.html`)와 WPF 앱이 동일하게 읽는다.
## 모델: 풀캔버스 (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
```
## 필드 (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) // 원점에 그림
```
## 피벗 산출(자동)
`pivot(bone) = centroid( opaque(bone) ∩ opaque(parent) )` — 인접 파츠의 오버랩 영역 무게중심 = 관절. (스크립트로 1회 산출해 여기 박음. 파츠 교체 시 재산출.)
## 검증됨
- 16파츠 스택 = 마스터(missed 0 / extra 0.03%).
- 자동 피벗으로 `dance_idle` 재생 시 관절이 자연스럽게 회전(헤드리스 렌더 t=0/0.5/1.0/1.5 확인).
## 튜닝 (필요 시)
- 관절 회전축이 어긋나면 해당 `pivot` 미세조정. 겹침 순서는 `z`.
- 큰 각도에서 이음새가 보이면 애니 진폭↓ 또는 후속 mesh-warp(`../02_Architecture/Limits_and_Mitigations.md`).