Initial Dansori character workspace
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# Live2D 리깅 스펙
|
||||
|
||||
이 폴더는 Live2D Cubism에서 설정할 파라미터, 디포머, 물리 방향을 정의한다.
|
||||
|
||||
## 파일 역할
|
||||
|
||||
| 파일 | 역할 |
|
||||
|---|---|
|
||||
| `live2d_parameters.json` | Cubism 표준 파라미터와 이소리용 확장 파라미터 |
|
||||
| `rig.json` | 파츠 좌표와 관절 기준 데이터 |
|
||||
|
||||
## 리깅 우선순위
|
||||
|
||||
1. **기본 얼굴**
|
||||
- `ParamAngleX/Y/Z`
|
||||
- `ParamEyeLOpen/ROpen`
|
||||
- `ParamEyeBallX/Y`
|
||||
- `ParamMouthOpenY`
|
||||
- `ParamMouthForm`
|
||||
|
||||
2. **상체 생동감**
|
||||
- `ParamBodyAngleX/Y/Z`
|
||||
- `ParamBreath`
|
||||
- `ParamShoulderY`
|
||||
|
||||
3. **머리카락/액세서리 물리**
|
||||
- `ParamHairFront`
|
||||
- `ParamHairSide`
|
||||
- `ParamHairBack`
|
||||
- 펜던트/후디 끈 보조 물리
|
||||
|
||||
4. **팔/손 제스처**
|
||||
- `ParamArmLA/LB`
|
||||
- `ParamArmRA/RB`
|
||||
- `ParamHandL/R`
|
||||
|
||||
5. **고급 표현**
|
||||
- 손하트/팔짱 swap part
|
||||
- 음소별 입 모양
|
||||
- 큰 각도 고개 회전용 face form
|
||||
|
||||
## 디포머 계층 권장안
|
||||
|
||||
```text
|
||||
D_Root
|
||||
D_Body_XYZ
|
||||
D_Breath
|
||||
D_Arm_L
|
||||
D_Hand_L
|
||||
D_Arm_R
|
||||
D_Hand_R
|
||||
D_Neck
|
||||
D_Head_XYZ
|
||||
D_Face
|
||||
D_Eye_L
|
||||
D_Eye_R
|
||||
D_Brow_L
|
||||
D_Brow_R
|
||||
D_Mouth
|
||||
D_Hair_Back
|
||||
D_Hair_Side_L
|
||||
D_Hair_Side_R
|
||||
D_Hair_Front
|
||||
D_Headphones
|
||||
```
|
||||
|
||||
## Cubism 작업 순서
|
||||
|
||||
1. `03_Assets/Live2D/sori_live2d_import.psd` import.
|
||||
2. 파츠 이름과 `layer_manifest.json`의 `id` 일치 확인.
|
||||
3. 기본 ArtMesh 생성.
|
||||
4. 얼굴, 머리카락, 입, 눈 ArtMesh 정리.
|
||||
5. `live2d_parameters.json`의 `core` 파라미터 키폼 생성.
|
||||
6. 눈깜빡임, 입열림, 고개 Z, 호흡 테스트.
|
||||
7. `ParamAngleX/Y`와 머리카락 물리 추가.
|
||||
8. 팔/손 제스처와 swap part 추가.
|
||||
|
||||
## 검수 기준
|
||||
|
||||
- `ParamEyeLOpen/ROpen` 0에서 눈이 자연스럽게 감긴다.
|
||||
- `ParamMouthOpenY` 0..1에서 입 안, 치아, 혀가 자연스럽다.
|
||||
- `ParamAngleX/Y`에서 귀, 옆머리, 목 밑그림이 자연스럽다.
|
||||
- `ParamBreath`만 켜도 대기 화면에서 생동감이 난다.
|
||||
- 머리카락 물리가 헤드폰과 자연스럽게 어울린다.
|
||||
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"name": "LeeSori Live2D Parameters",
|
||||
"version": 1,
|
||||
"target": "Live2D Cubism 5 import model",
|
||||
"coordinateNote": "L/R are from the character's point of view.",
|
||||
"groups": [
|
||||
{ "id": "ParamGroupHead", "name": "Head" },
|
||||
{ "id": "ParamGroupEyes", "name": "Eyes" },
|
||||
{ "id": "ParamGroupEyeballs", "name": "Eyeballs" },
|
||||
{ "id": "ParamGroupBrows", "name": "Brows" },
|
||||
{ "id": "ParamGroupMouth", "name": "Mouth" },
|
||||
{ "id": "ParamGroupBody", "name": "Body" },
|
||||
{ "id": "ParamGroupArms", "name": "Arms" },
|
||||
{ "id": "ParamGroupHands", "name": "Hands" },
|
||||
{ "id": "ParamGroupHair", "name": "Hair" },
|
||||
{ "id": "ParamGroupExpression", "name": "Expression" }
|
||||
],
|
||||
"parameters": [
|
||||
{ "id": "ParamAngleX", "name": "Angle X", "group": "ParamGroupHead", "min": -30, "default": 0, "max": 30, "priority": "core" },
|
||||
{ "id": "ParamAngleY", "name": "Angle Y", "group": "ParamGroupHead", "min": -30, "default": 0, "max": 30, "priority": "core" },
|
||||
{ "id": "ParamAngleZ", "name": "Angle Z", "group": "ParamGroupHead", "min": -30, "default": 0, "max": 30, "priority": "core" },
|
||||
|
||||
{ "id": "ParamEyeLOpen", "name": "Left Eye Open", "group": "ParamGroupEyes", "min": 0, "default": 1, "max": 1, "priority": "core" },
|
||||
{ "id": "ParamEyeROpen", "name": "Right Eye Open", "group": "ParamGroupEyes", "min": 0, "default": 1, "max": 1, "priority": "core" },
|
||||
{ "id": "ParamEyeLSmile", "name": "Left Eye Smile", "group": "ParamGroupEyes", "min": 0, "default": 0, "max": 1, "priority": "expression" },
|
||||
{ "id": "ParamEyeRSmile", "name": "Right Eye Smile", "group": "ParamGroupEyes", "min": 0, "default": 0, "max": 1, "priority": "expression" },
|
||||
{ "id": "ParamEyeBallX", "name": "Eyeball X", "group": "ParamGroupEyeballs", "min": -1, "default": 0, "max": 1, "priority": "core" },
|
||||
{ "id": "ParamEyeBallY", "name": "Eyeball Y", "group": "ParamGroupEyeballs", "min": -1, "default": 0, "max": 1, "priority": "core" },
|
||||
|
||||
{ "id": "ParamBrowLY", "name": "Left Brow Y", "group": "ParamGroupBrows", "min": -1, "default": 0, "max": 1, "priority": "expression" },
|
||||
{ "id": "ParamBrowRY", "name": "Right Brow Y", "group": "ParamGroupBrows", "min": -1, "default": 0, "max": 1, "priority": "expression" },
|
||||
{ "id": "ParamBrowLX", "name": "Left Brow X", "group": "ParamGroupBrows", "min": -1, "default": 0, "max": 1, "priority": "expression" },
|
||||
{ "id": "ParamBrowRX", "name": "Right Brow X", "group": "ParamGroupBrows", "min": -1, "default": 0, "max": 1, "priority": "expression" },
|
||||
{ "id": "ParamBrowLAngle", "name": "Left Brow Angle", "group": "ParamGroupBrows", "min": -1, "default": 0, "max": 1, "priority": "expression" },
|
||||
{ "id": "ParamBrowRAngle", "name": "Right Brow Angle", "group": "ParamGroupBrows", "min": -1, "default": 0, "max": 1, "priority": "expression" },
|
||||
{ "id": "ParamBrowLForm", "name": "Left Brow Form", "group": "ParamGroupBrows", "min": -1, "default": 0, "max": 1, "priority": "expression" },
|
||||
{ "id": "ParamBrowRForm", "name": "Right Brow Form", "group": "ParamGroupBrows", "min": -1, "default": 0, "max": 1, "priority": "expression" },
|
||||
|
||||
{ "id": "ParamMouthOpenY", "name": "Mouth Open", "group": "ParamGroupMouth", "min": 0, "default": 0, "max": 1.5, "priority": "core" },
|
||||
{ "id": "ParamMouthForm", "name": "Mouth Form", "group": "ParamGroupMouth", "min": -1, "default": 0, "max": 1, "priority": "core" },
|
||||
{ "id": "ParamCheek", "name": "Cheek", "group": "ParamGroupExpression", "min": 0, "default": 0, "max": 1, "priority": "expression" },
|
||||
|
||||
{ "id": "ParamBodyAngleX", "name": "Body Angle X", "group": "ParamGroupBody", "min": -10, "default": 0, "max": 10, "priority": "core" },
|
||||
{ "id": "ParamBodyAngleY", "name": "Body Angle Y", "group": "ParamGroupBody", "min": -10, "default": 0, "max": 10, "priority": "core" },
|
||||
{ "id": "ParamBodyAngleZ", "name": "Body Angle Z", "group": "ParamGroupBody", "min": -10, "default": 0, "max": 10, "priority": "core" },
|
||||
{ "id": "ParamBreath", "name": "Breath", "group": "ParamGroupBody", "min": 0, "default": 0, "max": 1, "priority": "core" },
|
||||
{ "id": "ParamShoulderY", "name": "Shoulder Y", "group": "ParamGroupBody", "min": -10, "default": 0, "max": 10, "priority": "gesture" },
|
||||
|
||||
{ "id": "ParamArmLA", "name": "Left Arm A", "group": "ParamGroupArms", "min": -30, "default": 0, "max": 60, "priority": "gesture" },
|
||||
{ "id": "ParamArmLB", "name": "Left Arm B", "group": "ParamGroupArms", "min": -30, "default": 0, "max": 60, "priority": "gesture" },
|
||||
{ "id": "ParamArmRA", "name": "Right Arm A", "group": "ParamGroupArms", "min": -30, "default": 0, "max": 60, "priority": "gesture" },
|
||||
{ "id": "ParamArmRB", "name": "Right Arm B", "group": "ParamGroupArms", "min": -30, "default": 0, "max": 60, "priority": "gesture" },
|
||||
{ "id": "ParamHandL", "name": "Left Hand", "group": "ParamGroupHands", "min": -10, "default": 0, "max": 10, "priority": "gesture" },
|
||||
{ "id": "ParamHandR", "name": "Right Hand", "group": "ParamGroupHands", "min": -10, "default": 0, "max": 10, "priority": "gesture" },
|
||||
|
||||
{ "id": "ParamHairFront", "name": "Hair Front", "group": "ParamGroupHair", "min": -1, "default": 0, "max": 1, "priority": "physics" },
|
||||
{ "id": "ParamHairSide", "name": "Hair Side", "group": "ParamGroupHair", "min": -1, "default": 0, "max": 1, "priority": "physics" },
|
||||
{ "id": "ParamHairBack", "name": "Hair Back", "group": "ParamGroupHair", "min": -1, "default": 0, "max": 1, "priority": "physics" },
|
||||
{ "id": "ParamHairFluffy", "name": "Hair Fluffy", "group": "ParamGroupHair", "min": -1, "default": 0, "max": 1, "priority": "physics" },
|
||||
|
||||
{ "id": "ParamBaseX", "name": "Overall X", "group": "ParamGroupBody", "min": -10, "default": 0, "max": 10, "priority": "runtime" },
|
||||
{ "id": "ParamBaseY", "name": "Overall Y", "group": "ParamGroupBody", "min": -10, "default": 0, "max": 10, "priority": "runtime" }
|
||||
],
|
||||
"deformerPlan": [
|
||||
{ "id": "D_Root", "parent": null, "parameters": ["ParamBaseX", "ParamBaseY"] },
|
||||
{ "id": "D_Body_XYZ", "parent": "D_Root", "parameters": ["ParamBodyAngleX", "ParamBodyAngleY", "ParamBodyAngleZ", "ParamBreath"] },
|
||||
{ "id": "D_Neck", "parent": "D_Body_XYZ", "parameters": ["ParamAngleX", "ParamAngleY", "ParamAngleZ"] },
|
||||
{ "id": "D_Head_XYZ", "parent": "D_Neck", "parameters": ["ParamAngleX", "ParamAngleY", "ParamAngleZ"] },
|
||||
{ "id": "D_Face", "parent": "D_Head_XYZ", "parameters": ["ParamAngleX", "ParamAngleY", "ParamAngleZ"] },
|
||||
{ "id": "D_Eye_L", "parent": "D_Face", "parameters": ["ParamEyeLOpen", "ParamEyeLSmile", "ParamEyeBallX", "ParamEyeBallY"] },
|
||||
{ "id": "D_Eye_R", "parent": "D_Face", "parameters": ["ParamEyeROpen", "ParamEyeRSmile", "ParamEyeBallX", "ParamEyeBallY"] },
|
||||
{ "id": "D_Mouth", "parent": "D_Face", "parameters": ["ParamMouthOpenY", "ParamMouthForm"] },
|
||||
{ "id": "D_Hair_Front", "parent": "D_Head_XYZ", "parameters": ["ParamHairFront", "ParamHairFluffy"] },
|
||||
{ "id": "D_Hair_Side_L", "parent": "D_Head_XYZ", "parameters": ["ParamHairSide"] },
|
||||
{ "id": "D_Hair_Side_R", "parent": "D_Head_XYZ", "parameters": ["ParamHairSide"] },
|
||||
{ "id": "D_Hair_Back", "parent": "D_Head_XYZ", "parameters": ["ParamHairBack"] },
|
||||
{ "id": "D_Arm_L", "parent": "D_Body_XYZ", "parameters": ["ParamArmLA", "ParamArmLB"] },
|
||||
{ "id": "D_Arm_R", "parent": "D_Body_XYZ", "parameters": ["ParamArmRA", "ParamArmRB"] }
|
||||
],
|
||||
"physicsPlan": [
|
||||
{ "name": "HairFront", "input": ["ParamAngleX", "ParamAngleZ"], "output": "ParamHairFront" },
|
||||
{ "name": "HairSide", "input": ["ParamAngleX", "ParamBodyAngleZ"], "output": "ParamHairSide" },
|
||||
{ "name": "HairBack", "input": ["ParamAngleX", "ParamAngleY"], "output": "ParamHairBack" },
|
||||
{ "name": "PendantAndStrings", "input": ["ParamBreath", "ParamBodyAngleZ"], "output": "ParamHairFluffy" }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "LeeSori",
|
||||
"status": "legacy_canvas_reference",
|
||||
"live2dNote": "Final WPF mascot target is Live2D Cubism. This file is kept only as Canvas FK/A-pose reference; use live2d_parameters.json for Cubism rigging.",
|
||||
"canvas": { "width": 520, "height": 900 },
|
||||
"imageBase": "../03_Assets/Parts/Images/",
|
||||
"mode": "fullcanvas",
|
||||
"note": "Full-canvas parts: each PNG is 520x900 with the part already at its master position. Renderer draws each image at the ORIGIN (0,0) and rotates it about its pivot (the joint). pivot = auto-derived centroid of the opaque overlap between the part and its parent. At rest (all rot/tx/ty = 0) every world matrix is identity, so stacking reproduces the master.",
|
||||
"bones": [
|
||||
{ "name": "pelvis", "parent": null, "pivot": [259.6, 363.4], "z": 6, "image": "sori_part_pelvis.png" },
|
||||
{ "name": "chest", "parent": "pelvis", "pivot": [259.6, 363.4], "z": 8, "image": "sori_part_chest.png" },
|
||||
{ "name": "neck", "parent": "chest", "pivot": [262.0, 229.3], "z": 9, "image": "sori_part_neck.png" },
|
||||
{ "name": "head", "parent": "neck", "pivot": [259.8, 209.3], "z": 10, "image": "sori_part_head.png" },
|
||||
|
||||
{ "name": "upperarm_r", "parent": "chest", "pivot": [174.2, 287.2], "z": 5, "image": "sori_part_upperarm_r.png" },
|
||||
{ "name": "forearm_r", "parent": "upperarm_r", "pivot": [137.3, 358.0], "z": 5, "image": "sori_part_forearm_r.png" },
|
||||
{ "name": "hand_r", "parent": "forearm_r", "pivot": [134.2, 400.8], "z": 5, "image": "sori_part_hand_r.png" },
|
||||
|
||||
{ "name": "upperarm_l", "parent": "chest", "pivot": [346.0, 286.5], "z": 12, "image": "sori_part_upperarm_l.png" },
|
||||
{ "name": "forearm_l", "parent": "upperarm_l", "pivot": [382.9, 357.6], "z": 12, "image": "sori_part_forearm_l.png" },
|
||||
{ "name": "hand_l", "parent": "forearm_l", "pivot": [389.6, 400.6], "z": 13, "image": "sori_part_hand_l.png" },
|
||||
|
||||
{ "name": "thigh_r", "parent": "pelvis", "pivot": [226.3, 455.0], "z": 4, "image": "sori_part_thigh_r.png" },
|
||||
{ "name": "shin_r", "parent": "thigh_r", "pivot": [233.3, 609.1], "z": 3, "image": "sori_part_shin_r.png" },
|
||||
{ "name": "foot_r", "parent": "shin_r", "pivot": [236.5, 729.4], "z": 2, "image": "sori_part_foot_r.png" },
|
||||
|
||||
{ "name": "thigh_l", "parent": "pelvis", "pivot": [294.1, 455.0], "z": 4, "image": "sori_part_thigh_l.png" },
|
||||
{ "name": "shin_l", "parent": "thigh_l", "pivot": [286.9, 609.1], "z": 3, "image": "sori_part_shin_l.png" },
|
||||
{ "name": "foot_l", "parent": "shin_l", "pivot": [283.9, 729.5], "z": 2, "image": "sori_part_foot_l.png" }
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user