Initial Dansori character workspace
@@ -0,0 +1,56 @@
|
||||
# AI PSD 제작 워크플로
|
||||
|
||||
## 1. 입력 자료 지정
|
||||
|
||||
입력 자료는 다음 순서로 사용한다.
|
||||
|
||||
1. `03_Assets/Reference/haruka_sheet.png`
|
||||
2. `03_Assets/Parts/Images/haruka_part_master_apose.png`
|
||||
3. `03_Assets/Library/Heads/`
|
||||
4. `03_Assets/Library/BakedPoses/Track/`
|
||||
|
||||
## 2. AI 생성 방식
|
||||
|
||||
AI 이미지 도구가 layered PSD를 만들 수 있으면 다음 파일을 만든다.
|
||||
|
||||
- `haruka_live2d_material_separation.psd`
|
||||
- `haruka_live2d_import.psd`
|
||||
|
||||
PNG 레이어 방식으로 작업할 경우 다음 순서를 따른다.
|
||||
|
||||
1. `layer_manifest.json`의 각 `file` 이름대로 투명 PNG 레이어를 생성한다.
|
||||
2. 모든 PNG는 같은 캔버스 크기와 같은 원점 좌표를 유지한다.
|
||||
3. Photoshop 또는 Clip Studio에서 PNG를 레이어로 쌓는다.
|
||||
4. `Guide` 레이어는 숨김 처리한다.
|
||||
5. import PSD는 각 파츠를 단일 레이어로 정리해 저장한다.
|
||||
|
||||
## 3. 생성 프롬프트 핵심 문구
|
||||
|
||||
```text
|
||||
Create Live2D Cubism-ready separated character art layers for the same adult woman Haruka.
|
||||
Keep identical face identity, mint teal short hair, white headphones, black choker with teal pendant,
|
||||
white cropped hoodie, mint/black track jacket, black track pants, black/mint sneakers.
|
||||
Each layer must be transparent PNG, same artboard, same registration, no background, no white halo.
|
||||
Paint hidden areas underneath overlaps so the model can rotate and deform in Live2D.
|
||||
Use the exact layer id and file name from the manifest.
|
||||
```
|
||||
|
||||
## 4. PSD import 전 검수
|
||||
|
||||
- RGB, 8bit/channel, sRGB.
|
||||
- 레이어 이름 중복 없음.
|
||||
- 불필요한 먼지 픽셀 없음.
|
||||
- layer mask, clipping mask 잔여 없음.
|
||||
- import PSD의 각 파츠는 단일 레이어.
|
||||
- 눈, 입, 눈썹 레이어가 독립적으로 보인다.
|
||||
- 머리카락 레이어가 앞, 옆, 뒤로 분리된다.
|
||||
|
||||
## 5. Cubism import 후 검수
|
||||
|
||||
- ArtMesh가 각 파츠에 생성된다.
|
||||
- texture atlas가 과도하게 낭비되지 않는다.
|
||||
- `ParamEyeLOpen/ROpen`, `ParamMouthOpenY`, `ParamAngleX/Y/Z`, `ParamBodyAngleX/Y/Z`, `ParamBreath`가 정상 동작한다.
|
||||
- 눈깜빡임, 입열림, 고개 좌우, 호흡이 자연스럽다.
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
# Live2D 자산 체크리스트
|
||||
|
||||
## 입력 자료
|
||||
|
||||
| 항목 | 위치 | 용도 |
|
||||
|---|---|---|
|
||||
| 정체성 시트 | `03_Assets/Reference/haruka_sheet.png` | 얼굴, 헤어, 의상, 색상 기준 |
|
||||
| A-pose 이미지 | `03_Assets/Parts/Images/haruka_part_master_apose.png` | 비율과 관절 위치 기준 |
|
||||
| 표정 이미지 | `03_Assets/Library/Heads/*.png` | expression 목표 설정 |
|
||||
| 포즈 이미지 | `03_Assets/Library/BakedPoses/*.png` | motion 키포즈 설정 |
|
||||
| 머리 영역 이미지 | `03_Assets/Library/Hairmasks/*.png` | hair layer 분리 |
|
||||
| 액세서리 이미지 | `03_Assets/Library/Accessories/*.png` | 소품 레이어 분리 |
|
||||
|
||||
## 필수 산출물
|
||||
|
||||
1. `03_Assets/Live2D/LayerPNGs/*.png`
|
||||
2. `03_Assets/Live2D/haruka_live2d_material_separation.psd`
|
||||
3. `03_Assets/Live2D/haruka_live2d_import.psd`
|
||||
4. `04_Rig/live2d_parameters.json` 기준 Cubism model
|
||||
5. `05_Animation/live2d_motion_plan.json` 기준 motions
|
||||
6. `06_Reactions/reactions.json` 기준 runtime map
|
||||
|
||||
## 검수 항목
|
||||
|
||||
- required 레이어 전체 생성.
|
||||
- PSD import 조건 충족: RGB, 8bit/channel, sRGB.
|
||||
- 투명 배경 유지.
|
||||
- 레이어명 중복 없음.
|
||||
- 눈, 눈썹, 입, 머리카락, 손, 의상 겹침 부위 분리.
|
||||
- 숨은 밑그림 채색.
|
||||
- Cubism import 성공.
|
||||
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 436 KiB |
|
After Width: | Height: | Size: 304 KiB |
|
After Width: | Height: | Size: 141 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 162 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 224 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 309 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 336 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 137 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 352 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 166 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 177 KiB |
|
After Width: | Height: | Size: 171 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 66 KiB |
@@ -0,0 +1,90 @@
|
||||
# Live2D Layer PNG Bundle
|
||||
|
||||
- Generated: 2026-07-03T19:23:29
|
||||
- Canvas: 1600x2800, transparent RGBA
|
||||
- Layers: 78
|
||||
- Required non-empty: 67/67
|
||||
- PSD note: layered PSD was not written here; assemble these PNGs in manifest order in Photoshop/Clip Studio/Cubism workflow.
|
||||
|
||||
## Files
|
||||
|
||||
| Group | ID | File | Required | Non-empty |
|
||||
|---|---|---|---:|---:|
|
||||
| Guide | `guide_haruka_sheet` | `00_Guide/guide_haruka_sheet.png` | true | true |
|
||||
| Guide | `guide_apose_current` | `00_Guide/guide_apose_current.png` | true | true |
|
||||
| BackHair | `back_hair_base` | `10_BackHair/back_hair_base.png` | true | true |
|
||||
| BackHair | `back_hair_shadow` | `10_BackHair/back_hair_shadow.png` | true | true |
|
||||
| BackHair | `back_hair_tip_L` | `10_BackHair/back_hair_tip_L.png` | true | true |
|
||||
| BackHair | `back_hair_tip_R` | `10_BackHair/back_hair_tip_R.png` | true | true |
|
||||
| BackHair | `back_hair_strand_L01` | `10_BackHair/back_hair_strand_L01.png` | true | true |
|
||||
| BackHair | `back_hair_strand_R01` | `10_BackHair/back_hair_strand_R01.png` | true | true |
|
||||
| Body | `neck_back_fill` | `20_Body/neck_back_fill.png` | true | true |
|
||||
| Body | `neck_front` | `20_Body/neck_front.png` | true | true |
|
||||
| Body | `torso_skin` | `20_Body/torso_skin.png` | true | true |
|
||||
| Body | `arm_upper_L` | `20_Body/arm_upper_L.png` | true | true |
|
||||
| Body | `arm_fore_L` | `20_Body/arm_fore_L.png` | true | true |
|
||||
| Body | `hand_L_base` | `20_Body/hand_L_base.png` | true | true |
|
||||
| Body | `arm_upper_R` | `20_Body/arm_upper_R.png` | true | true |
|
||||
| Body | `arm_fore_R` | `20_Body/arm_fore_R.png` | true | true |
|
||||
| Body | `hand_R_base` | `20_Body/hand_R_base.png` | true | true |
|
||||
| Body | `leg_upper_L` | `20_Body/leg_upper_L.png` | false | true |
|
||||
| Body | `leg_lower_L` | `20_Body/leg_lower_L.png` | false | true |
|
||||
| Body | `leg_upper_R` | `20_Body/leg_upper_R.png` | false | true |
|
||||
| Body | `leg_lower_R` | `20_Body/leg_lower_R.png` | false | true |
|
||||
| Clothes | `hood_back` | `30_Clothes/hood_back.png` | true | true |
|
||||
| Clothes | `hood_front_L` | `30_Clothes/hood_front_L.png` | true | true |
|
||||
| Clothes | `hood_front_R` | `30_Clothes/hood_front_R.png` | true | true |
|
||||
| Clothes | `jacket_body` | `30_Clothes/jacket_body.png` | true | true |
|
||||
| Clothes | `jacket_sleeve_L` | `30_Clothes/jacket_sleeve_L.png` | true | true |
|
||||
| Clothes | `jacket_sleeve_R` | `30_Clothes/jacket_sleeve_R.png` | true | true |
|
||||
| Clothes | `hoodie_front` | `30_Clothes/hoodie_front.png` | true | true |
|
||||
| Clothes | `hoodie_string_L` | `30_Clothes/hoodie_string_L.png` | true | true |
|
||||
| Clothes | `hoodie_string_R` | `30_Clothes/hoodie_string_R.png` | true | true |
|
||||
| Clothes | `pants_base` | `30_Clothes/pants_base.png` | false | true |
|
||||
| Clothes | `shoe_L` | `30_Clothes/shoe_L.png` | false | true |
|
||||
| Clothes | `shoe_R` | `30_Clothes/shoe_R.png` | false | true |
|
||||
| Head | `face_base` | `40_Head/face_base.png` | true | true |
|
||||
| Head | `face_shadow` | `40_Head/face_shadow.png` | true | true |
|
||||
| Head | `ear_L` | `40_Head/ear_L.png` | true | true |
|
||||
| Head | `ear_R` | `40_Head/ear_R.png` | true | true |
|
||||
| Head | `nose` | `40_Head/nose.png` | true | true |
|
||||
| Head | `cheek_L` | `40_Head/cheek_L.png` | true | true |
|
||||
| Head | `cheek_R` | `40_Head/cheek_R.png` | true | true |
|
||||
| Eyes | `eye_L_white` | `50_Eyes/eye_L_white.png` | true | true |
|
||||
| Eyes | `eye_L_iris` | `50_Eyes/eye_L_iris.png` | true | true |
|
||||
| Eyes | `eye_L_pupil` | `50_Eyes/eye_L_pupil.png` | true | true |
|
||||
| Eyes | `eye_L_highlight` | `50_Eyes/eye_L_highlight.png` | true | true |
|
||||
| Eyes | `eye_L_upper_lash` | `50_Eyes/eye_L_upper_lash.png` | true | true |
|
||||
| Eyes | `eye_L_lower_lash` | `50_Eyes/eye_L_lower_lash.png` | true | true |
|
||||
| Eyes | `eye_L_lid` | `50_Eyes/eye_L_lid.png` | true | true |
|
||||
| Eyes | `eye_R_white` | `50_Eyes/eye_R_white.png` | true | true |
|
||||
| Eyes | `eye_R_iris` | `50_Eyes/eye_R_iris.png` | true | true |
|
||||
| Eyes | `eye_R_pupil` | `50_Eyes/eye_R_pupil.png` | true | true |
|
||||
| Eyes | `eye_R_highlight` | `50_Eyes/eye_R_highlight.png` | true | true |
|
||||
| Eyes | `eye_R_upper_lash` | `50_Eyes/eye_R_upper_lash.png` | true | true |
|
||||
| Eyes | `eye_R_lower_lash` | `50_Eyes/eye_R_lower_lash.png` | true | true |
|
||||
| Eyes | `eye_R_lid` | `50_Eyes/eye_R_lid.png` | true | true |
|
||||
| Brows | `brow_L` | `55_Brows/brow_L.png` | true | true |
|
||||
| Brows | `brow_R` | `55_Brows/brow_R.png` | true | true |
|
||||
| Mouth | `mouth_inside` | `60_Mouth/mouth_inside.png` | true | true |
|
||||
| Mouth | `teeth_upper` | `60_Mouth/teeth_upper.png` | true | true |
|
||||
| Mouth | `teeth_lower` | `60_Mouth/teeth_lower.png` | true | true |
|
||||
| Mouth | `tongue` | `60_Mouth/tongue.png` | true | true |
|
||||
| Mouth | `mouth_line_upper` | `60_Mouth/mouth_line_upper.png` | true | true |
|
||||
| Mouth | `mouth_line_lower` | `60_Mouth/mouth_line_lower.png` | true | true |
|
||||
| Mouth | `lip_highlight` | `60_Mouth/lip_highlight.png` | true | true |
|
||||
| FrontHair | `front_hair_center` | `70_FrontHair/front_hair_center.png` | true | true |
|
||||
| FrontHair | `front_hair_L` | `70_FrontHair/front_hair_L.png` | true | true |
|
||||
| FrontHair | `front_hair_R` | `70_FrontHair/front_hair_R.png` | true | true |
|
||||
| FrontHair | `side_hair_L` | `70_FrontHair/side_hair_L.png` | true | true |
|
||||
| FrontHair | `side_hair_R` | `70_FrontHair/side_hair_R.png` | true | true |
|
||||
| FrontHair | `hair_highlight_front` | `70_FrontHair/hair_highlight_front.png` | true | true |
|
||||
| Accessories | `headphone_band` | `80_Accessories/headphone_band.png` | true | true |
|
||||
| Accessories | `headphone_L` | `80_Accessories/headphone_L.png` | true | true |
|
||||
| Accessories | `headphone_R` | `80_Accessories/headphone_R.png` | true | true |
|
||||
| Accessories | `choker_band` | `80_Accessories/choker_band.png` | true | true |
|
||||
| Accessories | `pendant` | `80_Accessories/pendant.png` | true | true |
|
||||
| SwapParts | `swap_hand_heart_L` | `90_SwapParts/swap_hand_heart_L.png` | false | true |
|
||||
| SwapParts | `swap_hand_heart_R` | `90_SwapParts/swap_hand_heart_R.png` | false | true |
|
||||
| SwapParts | `swap_arm_cross_L` | `90_SwapParts/swap_arm_cross_L.png` | false | true |
|
||||
| SwapParts | `swap_arm_cross_R` | `90_SwapParts/swap_arm_cross_R.png` | false | true |
|
||||
@@ -0,0 +1,54 @@
|
||||
# Live2D 레이어 Manifest
|
||||
|
||||
이 문서는 AI 또는 작업자가 만들어야 할 Live2D 원화 레이어 목록이다. 기계 처리용 목록은 `layer_manifest.json`을 따른다.
|
||||
|
||||
## 기본 규격
|
||||
|
||||
- 권장 캔버스: 1600x2800.
|
||||
- 배경: 완전 투명.
|
||||
- 색공간: sRGB.
|
||||
- PSD import: RGB, 8bit/channel.
|
||||
- 좌표: 모든 PNG 레이어는 같은 캔버스와 원점.
|
||||
- 좌우: `L/R`은 캐릭터 기준이다. `L`은 화면 오른쪽, `R`은 화면 왼쪽이다.
|
||||
|
||||
## 레이어 그룹
|
||||
|
||||
| 그룹 | 목적 |
|
||||
|---|---|
|
||||
| `Guide` | 기준 이미지. Cubism import 때 숨김 |
|
||||
| `BackHair` | 뒤쪽 머리와 목 뒤 머리카락 |
|
||||
| `Body` | 피부, 목, 팔, 손, 다리 |
|
||||
| `Clothes` | 후디, 재킷, 팬츠, 신발 |
|
||||
| `Head` | 얼굴 베이스, 귀, 코, 볼 |
|
||||
| `Eyes` | 눈 흰자, 홍채, 동공, 하이라이트, 속눈썹, 눈꺼풀 |
|
||||
| `Brows` | 좌우 눈썹 |
|
||||
| `Mouth` | 입 안, 치아, 혀, 입선, 입술 |
|
||||
| `FrontHair` | 앞머리, 옆머리, 잔머리 |
|
||||
| `Accessories` | 헤드폰, 초커, 펜던트 |
|
||||
| `SwapParts` | 하트 손, 팔짱 손 등 후속 교체 파츠 |
|
||||
|
||||
## MVP 필수 레이어
|
||||
|
||||
MVP는 전신 정밀 댄스보다 **WPF 앱 마스코트의 상반신 반응 품질**을 우선한다.
|
||||
|
||||
1. 얼굴 회전: face, ear, nose, cheek, front/side/back hair.
|
||||
2. 눈깜빡임: upper/lower lash, eyelid, eyeball, highlight.
|
||||
3. 말하기: mouth inside, teeth, tongue, mouth line, lips.
|
||||
4. 호흡/상체: neck, torso, hoodie, jacket.
|
||||
5. 손 제스처: upperarm, forearm, hand.
|
||||
6. 물리: front hair, side hair, back hair, pendant.
|
||||
|
||||
## 산출 방식
|
||||
|
||||
AI가 PSD를 만들 수 없으면 `LayerPNGs/` 아래에 manifest의 `file` 이름으로 투명 PNG를 만든다. 이후 Photoshop/Clip Studio에서 레이어로 쌓아 `haruka_live2d_import.psd`를 만든다.
|
||||
|
||||
## 검수 키포인트
|
||||
|
||||
- 눈꺼풀을 닫아도 눈동자/하이라이트가 이상하게 남지 않는다.
|
||||
- 입을 열었을 때 입 안, 치아, 혀가 자연스럽게 보인다.
|
||||
- 고개를 좌우로 돌릴 때 귀와 옆머리의 앞뒤 관계가 맞다.
|
||||
- 머리카락 물리 적용 시 빈 구멍이 보이지 않는다.
|
||||
- 팔을 움직일 때 어깨/소매 밑그림이 드러나도 자연스럽다.
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
# PSD Assembly Guide
|
||||
|
||||
현재 세션에서는 layered PSD를 직접 저장할 수 있는 라이브러리나 ImageMagick/Krita가 없어 PSD 파일을 바로 생성하지 않았다. 대신 Cubism 조립에 필요한 투명 PNG 레이어 번들을 완료했고, Photoshop 조립용 JSX를 함께 생성했다.
|
||||
|
||||
## 생성된 이미지 산출물
|
||||
|
||||
- `LayerPNGs/`: `layer_manifest.json`의 `file` 경로와 동일한 78개 PNG.
|
||||
- `haruka_live2d_layer_preview.png`: import 레이어 기본 합성 프리뷰.
|
||||
- `haruka_live2d_layer_preview_checker.png`: 체크 배경 검수용 프리뷰.
|
||||
- `haruka_live2d_swap_parts_preview_checker.png`: swap part 포함 프리뷰.
|
||||
- `layer_generation_report.json`: 파일 존재, bbox, required 여부 검수 결과.
|
||||
- `LayerPNGs_README.md`: 사람이 읽는 PNG 목록.
|
||||
|
||||
## PSD 조립 방법
|
||||
|
||||
Photoshop에서 다음 파일을 실행한다.
|
||||
|
||||
`photoshop_assemble_live2d_psd.jsx`
|
||||
|
||||
실행하면 프로젝트 루트 폴더를 선택하라는 창이 뜬다. `Haruka_Live2D` 폴더를 선택하면 다음 PSD를 저장한다.
|
||||
|
||||
- `haruka_live2d_material_separation.psd`
|
||||
- `haruka_live2d_import.psd`
|
||||
|
||||
## 조립 규칙
|
||||
|
||||
- 캔버스: 1600x2800 px.
|
||||
- 모드: RGB, 8bit/channel, sRGB.
|
||||
- PNG는 모두 같은 원점과 같은 캔버스를 유지한다.
|
||||
- import PSD에는 `import: true` 레이어만 포함한다.
|
||||
- Guide 레이어는 작업 PSD에만 들어가며 숨김 처리한다.
|
||||
- SwapParts 레이어는 포함하지만 기본 visibility는 꺼 둔다.
|
||||
|
||||
## 현재 한계
|
||||
|
||||
이 번들은 Live2D 제작을 이어가기 위한 1차 분리 원화다. 기존 A-pose 파츠를 기반으로 마스크/영역/보강 드로잉을 적용했으므로, Cubism import 전 Photoshop 또는 Clip Studio에서 눈/입/머리카락 경계와 숨은 밑그림을 한 번 더 수작업 보정하는 것을 권장한다.
|
||||
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.5 MiB |
@@ -0,0 +1,110 @@
|
||||
{
|
||||
"name": "Haruka Live2D Layer Manifest",
|
||||
"version": 1,
|
||||
"canvas": {
|
||||
"width": 1600,
|
||||
"height": 2800,
|
||||
"background": "transparent",
|
||||
"colorProfile": "sRGB",
|
||||
"psdMode": "RGB 8bit/channel"
|
||||
},
|
||||
"coordinateRule": "All layer PNGs use the same canvas and origin. L/R are from the character's point of view.",
|
||||
"output": {
|
||||
"materialPsd": "03_Assets/Live2D/haruka_live2d_material_separation.psd",
|
||||
"importPsd": "03_Assets/Live2D/haruka_live2d_import.psd",
|
||||
"layerPngBase": "03_Assets/Live2D/LayerPNGs/"
|
||||
},
|
||||
"layers": [
|
||||
{ "id": "guide_haruka_sheet", "group": "Guide", "file": "00_Guide/guide_haruka_sheet.png", "import": false, "required": true },
|
||||
{ "id": "guide_apose_current", "group": "Guide", "file": "00_Guide/guide_apose_current.png", "import": false, "required": true },
|
||||
|
||||
{ "id": "back_hair_base", "group": "BackHair", "file": "10_BackHair/back_hair_base.png", "import": true, "required": true, "physics": "ParamHairBack" },
|
||||
{ "id": "back_hair_shadow", "group": "BackHair", "file": "10_BackHair/back_hair_shadow.png", "import": true, "required": true, "physics": "ParamHairBack" },
|
||||
{ "id": "back_hair_tip_L", "group": "BackHair", "file": "10_BackHair/back_hair_tip_L.png", "import": true, "required": true, "physics": "ParamHairSide" },
|
||||
{ "id": "back_hair_tip_R", "group": "BackHair", "file": "10_BackHair/back_hair_tip_R.png", "import": true, "required": true, "physics": "ParamHairSide" },
|
||||
{ "id": "back_hair_strand_L01", "group": "BackHair", "file": "10_BackHair/back_hair_strand_L01.png", "import": true, "required": true, "physics": "ParamHairSide" },
|
||||
{ "id": "back_hair_strand_R01", "group": "BackHair", "file": "10_BackHair/back_hair_strand_R01.png", "import": true, "required": true, "physics": "ParamHairSide" },
|
||||
|
||||
{ "id": "neck_back_fill", "group": "Body", "file": "20_Body/neck_back_fill.png", "import": true, "required": true },
|
||||
{ "id": "neck_front", "group": "Body", "file": "20_Body/neck_front.png", "import": true, "required": true, "deformer": "D_Neck" },
|
||||
{ "id": "torso_skin", "group": "Body", "file": "20_Body/torso_skin.png", "import": true, "required": true, "deformer": "D_Body" },
|
||||
{ "id": "arm_upper_L", "group": "Body", "file": "20_Body/arm_upper_L.png", "import": true, "required": true, "deformer": "D_Arm_L" },
|
||||
{ "id": "arm_fore_L", "group": "Body", "file": "20_Body/arm_fore_L.png", "import": true, "required": true, "deformer": "D_Arm_L" },
|
||||
{ "id": "hand_L_base", "group": "Body", "file": "20_Body/hand_L_base.png", "import": true, "required": true, "deformer": "D_Hand_L" },
|
||||
{ "id": "arm_upper_R", "group": "Body", "file": "20_Body/arm_upper_R.png", "import": true, "required": true, "deformer": "D_Arm_R" },
|
||||
{ "id": "arm_fore_R", "group": "Body", "file": "20_Body/arm_fore_R.png", "import": true, "required": true, "deformer": "D_Arm_R" },
|
||||
{ "id": "hand_R_base", "group": "Body", "file": "20_Body/hand_R_base.png", "import": true, "required": true, "deformer": "D_Hand_R" },
|
||||
{ "id": "leg_upper_L", "group": "Body", "file": "20_Body/leg_upper_L.png", "import": true, "required": false, "deformer": "D_Leg_L" },
|
||||
{ "id": "leg_lower_L", "group": "Body", "file": "20_Body/leg_lower_L.png", "import": true, "required": false, "deformer": "D_Leg_L" },
|
||||
{ "id": "leg_upper_R", "group": "Body", "file": "20_Body/leg_upper_R.png", "import": true, "required": false, "deformer": "D_Leg_R" },
|
||||
{ "id": "leg_lower_R", "group": "Body", "file": "20_Body/leg_lower_R.png", "import": true, "required": false, "deformer": "D_Leg_R" },
|
||||
|
||||
{ "id": "hood_back", "group": "Clothes", "file": "30_Clothes/hood_back.png", "import": true, "required": true },
|
||||
{ "id": "hood_front_L", "group": "Clothes", "file": "30_Clothes/hood_front_L.png", "import": true, "required": true },
|
||||
{ "id": "hood_front_R", "group": "Clothes", "file": "30_Clothes/hood_front_R.png", "import": true, "required": true },
|
||||
{ "id": "jacket_body", "group": "Clothes", "file": "30_Clothes/jacket_body.png", "import": true, "required": true, "deformer": "D_Body" },
|
||||
{ "id": "jacket_sleeve_L", "group": "Clothes", "file": "30_Clothes/jacket_sleeve_L.png", "import": true, "required": true, "deformer": "D_Arm_L" },
|
||||
{ "id": "jacket_sleeve_R", "group": "Clothes", "file": "30_Clothes/jacket_sleeve_R.png", "import": true, "required": true, "deformer": "D_Arm_R" },
|
||||
{ "id": "hoodie_front", "group": "Clothes", "file": "30_Clothes/hoodie_front.png", "import": true, "required": true, "deformer": "D_Body" },
|
||||
{ "id": "hoodie_string_L", "group": "Clothes", "file": "30_Clothes/hoodie_string_L.png", "import": true, "required": true, "physics": "ParamBreath" },
|
||||
{ "id": "hoodie_string_R", "group": "Clothes", "file": "30_Clothes/hoodie_string_R.png", "import": true, "required": true, "physics": "ParamBreath" },
|
||||
{ "id": "pants_base", "group": "Clothes", "file": "30_Clothes/pants_base.png", "import": true, "required": false, "deformer": "D_Body" },
|
||||
{ "id": "shoe_L", "group": "Clothes", "file": "30_Clothes/shoe_L.png", "import": true, "required": false },
|
||||
{ "id": "shoe_R", "group": "Clothes", "file": "30_Clothes/shoe_R.png", "import": true, "required": false },
|
||||
|
||||
{ "id": "face_base", "group": "Head", "file": "40_Head/face_base.png", "import": true, "required": true, "deformer": "D_Face" },
|
||||
{ "id": "face_shadow", "group": "Head", "file": "40_Head/face_shadow.png", "import": true, "required": true, "deformer": "D_Face" },
|
||||
{ "id": "ear_L", "group": "Head", "file": "40_Head/ear_L.png", "import": true, "required": true, "deformer": "D_Head" },
|
||||
{ "id": "ear_R", "group": "Head", "file": "40_Head/ear_R.png", "import": true, "required": true, "deformer": "D_Head" },
|
||||
{ "id": "nose", "group": "Head", "file": "40_Head/nose.png", "import": true, "required": true, "deformer": "D_Face" },
|
||||
{ "id": "cheek_L", "group": "Head", "file": "40_Head/cheek_L.png", "import": true, "required": true, "parameter": "ParamCheek" },
|
||||
{ "id": "cheek_R", "group": "Head", "file": "40_Head/cheek_R.png", "import": true, "required": true, "parameter": "ParamCheek" },
|
||||
|
||||
{ "id": "eye_L_white", "group": "Eyes", "file": "50_Eyes/eye_L_white.png", "import": true, "required": true, "parameter": "ParamEyeLOpen" },
|
||||
{ "id": "eye_L_iris", "group": "Eyes", "file": "50_Eyes/eye_L_iris.png", "import": true, "required": true, "parameter": "ParamEyeBallX/Y" },
|
||||
{ "id": "eye_L_pupil", "group": "Eyes", "file": "50_Eyes/eye_L_pupil.png", "import": true, "required": true, "parameter": "ParamEyeBallX/Y" },
|
||||
{ "id": "eye_L_highlight", "group": "Eyes", "file": "50_Eyes/eye_L_highlight.png", "import": true, "required": true, "parameter": "ParamEyeBallX/Y" },
|
||||
{ "id": "eye_L_upper_lash", "group": "Eyes", "file": "50_Eyes/eye_L_upper_lash.png", "import": true, "required": true, "parameter": "ParamEyeLOpen" },
|
||||
{ "id": "eye_L_lower_lash", "group": "Eyes", "file": "50_Eyes/eye_L_lower_lash.png", "import": true, "required": true, "parameter": "ParamEyeLOpen" },
|
||||
{ "id": "eye_L_lid", "group": "Eyes", "file": "50_Eyes/eye_L_lid.png", "import": true, "required": true, "parameter": "ParamEyeLOpen" },
|
||||
{ "id": "eye_R_white", "group": "Eyes", "file": "50_Eyes/eye_R_white.png", "import": true, "required": true, "parameter": "ParamEyeROpen" },
|
||||
{ "id": "eye_R_iris", "group": "Eyes", "file": "50_Eyes/eye_R_iris.png", "import": true, "required": true, "parameter": "ParamEyeBallX/Y" },
|
||||
{ "id": "eye_R_pupil", "group": "Eyes", "file": "50_Eyes/eye_R_pupil.png", "import": true, "required": true, "parameter": "ParamEyeBallX/Y" },
|
||||
{ "id": "eye_R_highlight", "group": "Eyes", "file": "50_Eyes/eye_R_highlight.png", "import": true, "required": true, "parameter": "ParamEyeBallX/Y" },
|
||||
{ "id": "eye_R_upper_lash", "group": "Eyes", "file": "50_Eyes/eye_R_upper_lash.png", "import": true, "required": true, "parameter": "ParamEyeROpen" },
|
||||
{ "id": "eye_R_lower_lash", "group": "Eyes", "file": "50_Eyes/eye_R_lower_lash.png", "import": true, "required": true, "parameter": "ParamEyeROpen" },
|
||||
{ "id": "eye_R_lid", "group": "Eyes", "file": "50_Eyes/eye_R_lid.png", "import": true, "required": true, "parameter": "ParamEyeROpen" },
|
||||
|
||||
{ "id": "brow_L", "group": "Brows", "file": "55_Brows/brow_L.png", "import": true, "required": true, "parameter": "ParamBrowL*" },
|
||||
{ "id": "brow_R", "group": "Brows", "file": "55_Brows/brow_R.png", "import": true, "required": true, "parameter": "ParamBrowR*" },
|
||||
|
||||
{ "id": "mouth_inside", "group": "Mouth", "file": "60_Mouth/mouth_inside.png", "import": true, "required": true, "parameter": "ParamMouthOpenY" },
|
||||
{ "id": "teeth_upper", "group": "Mouth", "file": "60_Mouth/teeth_upper.png", "import": true, "required": true, "parameter": "ParamMouthOpenY" },
|
||||
{ "id": "teeth_lower", "group": "Mouth", "file": "60_Mouth/teeth_lower.png", "import": true, "required": true, "parameter": "ParamMouthOpenY" },
|
||||
{ "id": "tongue", "group": "Mouth", "file": "60_Mouth/tongue.png", "import": true, "required": true, "parameter": "ParamMouthOpenY" },
|
||||
{ "id": "mouth_line_upper", "group": "Mouth", "file": "60_Mouth/mouth_line_upper.png", "import": true, "required": true, "parameter": "ParamMouthForm" },
|
||||
{ "id": "mouth_line_lower", "group": "Mouth", "file": "60_Mouth/mouth_line_lower.png", "import": true, "required": true, "parameter": "ParamMouthForm" },
|
||||
{ "id": "lip_highlight", "group": "Mouth", "file": "60_Mouth/lip_highlight.png", "import": true, "required": true, "parameter": "ParamMouthForm" },
|
||||
|
||||
{ "id": "front_hair_center", "group": "FrontHair", "file": "70_FrontHair/front_hair_center.png", "import": true, "required": true, "physics": "ParamHairFront" },
|
||||
{ "id": "front_hair_L", "group": "FrontHair", "file": "70_FrontHair/front_hair_L.png", "import": true, "required": true, "physics": "ParamHairFront" },
|
||||
{ "id": "front_hair_R", "group": "FrontHair", "file": "70_FrontHair/front_hair_R.png", "import": true, "required": true, "physics": "ParamHairFront" },
|
||||
{ "id": "side_hair_L", "group": "FrontHair", "file": "70_FrontHair/side_hair_L.png", "import": true, "required": true, "physics": "ParamHairSide" },
|
||||
{ "id": "side_hair_R", "group": "FrontHair", "file": "70_FrontHair/side_hair_R.png", "import": true, "required": true, "physics": "ParamHairSide" },
|
||||
{ "id": "hair_highlight_front", "group": "FrontHair", "file": "70_FrontHair/hair_highlight_front.png", "import": true, "required": true, "physics": "ParamHairFront" },
|
||||
|
||||
{ "id": "headphone_band", "group": "Accessories", "file": "80_Accessories/headphone_band.png", "import": true, "required": true, "deformer": "D_Head" },
|
||||
{ "id": "headphone_L", "group": "Accessories", "file": "80_Accessories/headphone_L.png", "import": true, "required": true, "deformer": "D_Head" },
|
||||
{ "id": "headphone_R", "group": "Accessories", "file": "80_Accessories/headphone_R.png", "import": true, "required": true, "deformer": "D_Head" },
|
||||
{ "id": "choker_band", "group": "Accessories", "file": "80_Accessories/choker_band.png", "import": true, "required": true, "deformer": "D_Neck" },
|
||||
{ "id": "pendant", "group": "Accessories", "file": "80_Accessories/pendant.png", "import": true, "required": true, "physics": "ParamBreath" },
|
||||
|
||||
{ "id": "swap_hand_heart_L", "group": "SwapParts", "file": "90_SwapParts/swap_hand_heart_L.png", "import": true, "required": false, "parameter": "ParamHandL" },
|
||||
{ "id": "swap_hand_heart_R", "group": "SwapParts", "file": "90_SwapParts/swap_hand_heart_R.png", "import": true, "required": false, "parameter": "ParamHandR" },
|
||||
{ "id": "swap_arm_cross_L", "group": "SwapParts", "file": "90_SwapParts/swap_arm_cross_L.png", "import": true, "required": false, "parameter": "ParamArmLA/LB" },
|
||||
{ "id": "swap_arm_cross_R", "group": "SwapParts", "file": "90_SwapParts/swap_arm_cross_R.png", "import": true, "required": false, "parameter": "ParamArmRA/RB" }
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
|
||||