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

2.1 KiB
Raw Blame History

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).