Initial Dansori character workspace
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
# Rig.md — 스켈레톤 정의 (`rig.json`) 설명
|
||||
|
||||
경량 리그의 뼈대. 뷰어(`../07_Viewer/index.html`)와 WPF 앱이 **동일하게** 읽는다.
|
||||
|
||||
## 본 계층 (부모 → 자식)
|
||||
```
|
||||
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
|
||||
```
|
||||
16 파츠. 각 관절이 실제로 접힌다(팔꿈치·무릎·손목·발목·목·허리).
|
||||
|
||||
## 필드 스키마 (bones[])
|
||||
| 필드 | 의미 |
|
||||
|---|---|
|
||||
| `name` | 본 이름(= 애니메이션 트랙 키, = 파츠 파일 접두) |
|
||||
| `parent` | 부모 본 이름(root는 null). **배열은 부모가 먼저** 오도록 정렬됨 |
|
||||
| `pos` `[x,y]` | **부모 관절 기준** 이 본 관절의 오프셋(휴지 자세, px) |
|
||||
| `angle` | 휴지 각도(deg, **+ = 시계방향**). 팔은 살짝 벌린 춤-대기 자세로 프리셋 |
|
||||
| `z` | 그리기 순서(작을수록 뒤). 화면 왼팔(캐릭터 오른팔)=뒤, 화면 오른팔=앞 |
|
||||
| `image` | 파츠 PNG 파일명(`imageBase` + 이 값). 없으면 플레이스홀더 |
|
||||
| `imgAnchor` `[ax,ay]` | **파츠 이미지 안에서 관절이 위치한 정규화 좌표**(0~1) |
|
||||
| `imgScale` | 이미지 배율(기본 1) |
|
||||
| `col` / `ph` / `phW` | 플레이스홀더 색/도형(실제 아트 로드 전까지 사용) |
|
||||
|
||||
## 좌표계
|
||||
- 캔버스 520×900, y-아래(+y = 화면 아래). 회전 + = 시계방향.
|
||||
- 본의 **로컬 원점 = 그 본의 관절**. 자식 `pos`는 이 원점 기준.
|
||||
|
||||
## 튜닝 가이드 (실제 아트가 오면)
|
||||
1. 뷰어에서 **스켈레톤 오버레이 ON** → 관절 점(분홍)이 아트 관절 위에 오도록:
|
||||
- 위치 어긋남 → `pos` 조정 / 파츠가 관절에서 어긋나 회전 → `imgAnchor` 조정 / 크기 → `imgScale`.
|
||||
2. 겹침 이상 → `z`. 목 이음새 벌어짐 → 머리 회전 폭↓ 또는 `neck` 피벗 내림.
|
||||
|
||||
> 강체 회전 한계상 큰 각도에서 관절이 벌어질 수 있음. 오버랩 파츠 + z가림으로 완화. 더 필요하면 `../02_Architecture/Limits_and_Mitigations.md` 의 mesh-warp 승급.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 184 KiB |
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"pelvis": [
|
||||
259.4,
|
||||
455.0
|
||||
],
|
||||
"chest": [
|
||||
259.3,
|
||||
304.0
|
||||
],
|
||||
"neck": [
|
||||
259.5,
|
||||
240.0
|
||||
],
|
||||
"head": [
|
||||
260.4,
|
||||
20.0
|
||||
],
|
||||
"upperarm_r": [
|
||||
143.0,
|
||||
261.0
|
||||
],
|
||||
"forearm_r": [
|
||||
151.6,
|
||||
390.0
|
||||
],
|
||||
"hand_r": [
|
||||
77.2,
|
||||
412.0
|
||||
],
|
||||
"upperarm_l": [
|
||||
375.0,
|
||||
261.0
|
||||
],
|
||||
"forearm_l": [
|
||||
367.5,
|
||||
390.0
|
||||
],
|
||||
"hand_l": [
|
||||
440.0,
|
||||
412.0
|
||||
],
|
||||
"thigh_r": [
|
||||
195.3,
|
||||
558.0
|
||||
],
|
||||
"shin_r": [
|
||||
179.8,
|
||||
670.0
|
||||
],
|
||||
"foot_r": [
|
||||
171.8,
|
||||
790.0
|
||||
],
|
||||
"thigh_l": [
|
||||
323.3,
|
||||
558.0
|
||||
],
|
||||
"shin_l": [
|
||||
338.6,
|
||||
670.0
|
||||
],
|
||||
"foot_l": [
|
||||
346.4,
|
||||
790.0
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "Haruka",
|
||||
"canvas": { "width": 520, "height": 900 },
|
||||
"imageBase": "../03_Assets/Parts/Images/",
|
||||
"mode": "fullcanvas",
|
||||
"note": "Full-canvas parts (520x900, part at master position). Draw at origin; rotate about pivot (joint). pivot = auto-derived overlap centroid from Haruka's parts (_tools/rig_pivots_render.py).",
|
||||
"bones": [
|
||||
{ "name": "pelvis", "parent": null, "pivot": [259.4, 455.0], "z": 6, "image": "haruka_part_pelvis.png" },
|
||||
{ "name": "chest", "parent": "pelvis", "pivot": [259.3, 304.0], "z": 8, "image": "haruka_part_chest.png" },
|
||||
{ "name": "neck", "parent": "chest", "pivot": [259.5, 240.0], "z": 9, "image": "haruka_part_neck.png" },
|
||||
{ "name": "head", "parent": "neck", "pivot": [260.4, 20.0], "z": 10, "image": "haruka_part_head.png" },
|
||||
|
||||
{ "name": "upperarm_r", "parent": "chest", "pivot": [143.0, 261.0], "z": 5, "image": "haruka_part_upperarm_r.png" },
|
||||
{ "name": "forearm_r", "parent": "upperarm_r", "pivot": [151.6, 390.0], "z": 5, "image": "haruka_part_forearm_r.png" },
|
||||
{ "name": "hand_r", "parent": "forearm_r", "pivot": [77.2, 412.0], "z": 5, "image": "haruka_part_hand_r.png" },
|
||||
|
||||
{ "name": "upperarm_l", "parent": "chest", "pivot": [375.0, 261.0], "z": 12, "image": "haruka_part_upperarm_l.png" },
|
||||
{ "name": "forearm_l", "parent": "upperarm_l", "pivot": [367.5, 390.0], "z": 12, "image": "haruka_part_forearm_l.png" },
|
||||
{ "name": "hand_l", "parent": "forearm_l", "pivot": [440.0, 412.0], "z": 13, "image": "haruka_part_hand_l.png" },
|
||||
|
||||
{ "name": "thigh_r", "parent": "pelvis", "pivot": [195.3, 558.0], "z": 4, "image": "haruka_part_thigh_r.png" },
|
||||
{ "name": "shin_r", "parent": "thigh_r", "pivot": [179.8, 670.0], "z": 3, "image": "haruka_part_shin_r.png" },
|
||||
{ "name": "foot_r", "parent": "shin_r", "pivot": [171.8, 790.0], "z": 2, "image": "haruka_part_foot_r.png" },
|
||||
|
||||
{ "name": "thigh_l", "parent": "pelvis", "pivot": [323.3, 558.0], "z": 4, "image": "haruka_part_thigh_l.png" },
|
||||
{ "name": "shin_l", "parent": "thigh_l", "pivot": [338.6, 670.0], "z": 3, "image": "haruka_part_shin_l.png" },
|
||||
{ "name": "foot_l", "parent": "shin_l", "pivot": [346.4, 790.0], "z": 2, "image": "haruka_part_foot_l.png" }
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user