Initial Dansori character workspace

This commit is contained in:
eKeerar
2026-07-04 10:34:46 +09:00
commit 5a419816ff
2480 changed files with 38692 additions and 0 deletions
+84
View File
@@ -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" }
]
}
+31
View File
@@ -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" }
]
}