Initial Dansori character workspace
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
# 반응 시퀀서 & 트리거 (Reactions)
|
||||
|
||||
상황 → 반응을 정의하는 레이어. **트리거 매퍼**(`reactions.json`) + **반응 클립**(`clips/*.json`)으로 구성.
|
||||
> ✅ **Phase 2 런타임 구현됨**: `../07_Viewer/reactions.html`(더블클릭 재생) — idle=배경춤(풀캔버스 리그) + 트리거(idle/error/success/focus). baked 바디 + 표정 머리(목 정합·회전) 합성은 `../../_tools/reactions_layout_render.py`가 만든 `_layout.json`을 사용(브라우저는 file:// alpha 판독 불가라 사전계산 필수). 오프라인 검증: `_reaction_preview.png`.
|
||||
|
||||
## 트리거 매퍼 (`reactions.json`)
|
||||
상황키 → 반응 클립 이름. 앱은 상황키만 던지면 된다.
|
||||
```json
|
||||
{ "error": "gesture_no", "success": "gesture_heart", "idle": "dance_idle" }
|
||||
```
|
||||
|
||||
## 반응 클립 스키마 (`clips/<name>.json`)
|
||||
하나의 반응 = 레이어드 타임라인.
|
||||
```jsonc
|
||||
{
|
||||
"name": "gesture_no",
|
||||
"duration": 2.4, // 초
|
||||
"return": "idle", // 종료 후 복귀 클립(보통 배경 idle)
|
||||
"layers": {
|
||||
"body": [ // Body 트랙: 시간에 따라 rig 클립 or baked 포즈
|
||||
{ "t":0.0, "mode":"rig", "clip":"idle" },
|
||||
{ "t":0.15,"mode":"baked", "image":"noeul_body_cozy_armscross", "fade":0.2 }
|
||||
],
|
||||
"face": [ // 표정 프레임 트랙
|
||||
{ "t":0.0, "expr":"neutral" },
|
||||
{ "t":0.3, "expr":"negative" }
|
||||
],
|
||||
"mouth": [ // 말하기(유사 립싱크): expr↔talk 순환
|
||||
{ "t":0.5, "say":"안돼요", "dur":1.2, "pattern":"talk" }
|
||||
],
|
||||
"transform": { // 리그 위 잔모션(본별 delta) — Animation.md 스키마와 동일
|
||||
"head": { "rot":[ {"t":0.5,"v":0},{"t":0.8,"v":9},{"t":1.1,"v":-9},{"t":1.4,"v":9},{"t":1.7,"v":0} ] },
|
||||
"chest":{ "ty":[ {"t":0.0,"v":0},{"t":0.2,"v":-4},{"t":0.5,"v":0} ] }
|
||||
},
|
||||
"caption": [ { "t":0.5, "text":"안돼요", "dur":1.6 } ], // 옵션 말풍선
|
||||
"sfx": [ { "t":0.5, "id":"nope" } ] // 옵션 효과음
|
||||
}
|
||||
}
|
||||
```
|
||||
### 필드 규칙
|
||||
- `body[]`: 시간순. `mode:"rig"`+`clip` 또는 `mode:"baked"`+`image`(파일명, 확장자 생략 가능). `fade`=크로스페이드 초.
|
||||
- `face[]`: `expr` = 표정 프레임 키(20종 중). 시간에 스냅.
|
||||
- `mouth[]`: `say` 대사, `dur` 길이, `pattern:"talk"`(talk/talk_wide/현재 감정 프레임 순환). 립싱크는 근사.
|
||||
- `transform`: 본별 키프레임(리그 delta). Body가 baked여도 head/chest 등 트랜스폼은 적용(단 baked는 통짜라 파츠 분리 트랜스폼은 제한적 → 주로 전체/머리에 적용).
|
||||
- `caption`/`sfx`: 옵션. 앱 설정(말풍선/TTS)에 따라 사용.
|
||||
|
||||
## 노을 톤 (로파이) — 튜닝 방침
|
||||
> 노을은 **차분·나른·집중** 캐릭터. 다른 캐릭터보다 **모션 진폭을 작게(고개 ±6 이하), 속도를 느리게, 대사를 부드럽게**("음, 안 돼요~" / "잘됐어요~"). 시그니처는 **비트에 고개 까딱**(로파이 감상).
|
||||
|
||||
## 상황 → 반응 카탈로그
|
||||
| 상황키 | 클립 | Body | Face | Mouth | 잔모션 |
|
||||
|---|---|---|---|---|---|
|
||||
| `idle` | `dance_idle` | rig | smile/neutral | — | 잔잔한 그루브 루프 |
|
||||
| `error` | `gesture_no` | baked `cozy_armscross` | neutral→negative | "음, 안 돼요~" | 작은 고개 젓기(±6, 느리게) |
|
||||
| `success` | `gesture_heart` | baked `cozy_heart` | smile→love | "잘됐어요~" | 부드러운 바운스(±5) |
|
||||
| **`focus`** ★시그니처 | `gesture_focus` | baked `cozy_listen` | neutral→sleepy | 허밍 "음~" | **비트에 고개 까딱**(루프, 4s) + "♪" |
|
||||
| *(확장)* `greet` | `gesture_wave` | rig wave | smile | "안녕하세요~" | 부드러운 손 흔들기 |
|
||||
| *(확장)* `sleepy` | `gesture_sleepy` | baked `cozy_idle_upper` | sleepy | (하품) | 느린 끄덕 |
|
||||
|
||||
> 사용 자산(모두 `Noeul/` 소스 md에 스펙됨): baked 포즈 `noeul_body_cozy_{armscross,heart,listen,idle_upper}` · 표정 `noeul_head_wave_{neutral,negative,smile,love,sleepy,thinking}` · hairmask. 생성 후 `../03_Assets/Library/`로 분류 복사 → 시퀀서 연결.
|
||||
|
||||
## 트리거 API(개념)
|
||||
```
|
||||
Mascot.React("success") // reactions.json으로 클립 결정 → 시퀀서 재생 → 종료 후 return 클립
|
||||
Mascot.SetIdle("dance_idle")// 배경 기본 루프
|
||||
Mascot.Say("...", expr) // 임시 대사(mouth+face)만
|
||||
```
|
||||
상세 앱 연동: `../08_Roadmap/App_Integration.md`.
|
||||
@@ -0,0 +1,433 @@
|
||||
{
|
||||
"stage": {
|
||||
"w": 520,
|
||||
"h": 900
|
||||
},
|
||||
"neck": [
|
||||
260,
|
||||
250
|
||||
],
|
||||
"overlap": 6,
|
||||
"headTargetW": 150,
|
||||
"bodies": {
|
||||
"noeul_body_cozy_armscross": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_cozy_cheer": {
|
||||
"scale": 0.4423,
|
||||
"ox": 260.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_cozy_clap": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_cozy_control": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_cozy_dj": {
|
||||
"scale": 0.5157,
|
||||
"ox": 125.9,
|
||||
"oy": 237.6
|
||||
},
|
||||
"noeul_body_cozy_handwave": {
|
||||
"scale": 0.5721,
|
||||
"ox": 111.2,
|
||||
"oy": 236.3
|
||||
},
|
||||
"noeul_body_cozy_heart": {
|
||||
"scale": 0.5169,
|
||||
"ox": 125.6,
|
||||
"oy": 237.6
|
||||
},
|
||||
"noeul_body_cozy_idle_full": {
|
||||
"scale": 0.518,
|
||||
"ox": 125.3,
|
||||
"oy": 174.9
|
||||
},
|
||||
"noeul_body_cozy_idle_upper": {
|
||||
"scale": 0.7823,
|
||||
"ox": 56.6,
|
||||
"oy": 231.2
|
||||
},
|
||||
"noeul_body_cozy_joy": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.2,
|
||||
"oy": 218.6
|
||||
},
|
||||
"noeul_body_cozy_listen": {
|
||||
"scale": 0.5736,
|
||||
"ox": 110.9,
|
||||
"oy": 236.2
|
||||
},
|
||||
"noeul_body_cozy_peace": {
|
||||
"scale": 0.5793,
|
||||
"ox": 109.4,
|
||||
"oy": 236.1
|
||||
},
|
||||
"noeul_body_cozy_piano": {
|
||||
"scale": 0.5764,
|
||||
"ox": 110.1,
|
||||
"oy": 236.2
|
||||
},
|
||||
"noeul_body_cozy_point": {
|
||||
"scale": 0.5721,
|
||||
"ox": 111.2,
|
||||
"oy": 236.3
|
||||
},
|
||||
"noeul_body_cozy_present": {
|
||||
"scale": 0.6199,
|
||||
"ox": 98.8,
|
||||
"oy": 235.1
|
||||
},
|
||||
"noeul_body_cozy_shrug": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_cozy_thumbsup": {
|
||||
"scale": 0.7591,
|
||||
"ox": 62.6,
|
||||
"oy": 231.8
|
||||
},
|
||||
"noeul_body_cozy_wave": {
|
||||
"scale": 0.6199,
|
||||
"ox": 98.8,
|
||||
"oy": 235.1
|
||||
},
|
||||
"noeul_body_day_armscross": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_day_cheer": {
|
||||
"scale": 0.4423,
|
||||
"ox": 260.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_day_clap": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_day_control": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_day_dj": {
|
||||
"scale": 0.5157,
|
||||
"ox": 125.9,
|
||||
"oy": 237.6
|
||||
},
|
||||
"noeul_body_day_handwave": {
|
||||
"scale": 0.5721,
|
||||
"ox": 111.2,
|
||||
"oy": 236.3
|
||||
},
|
||||
"noeul_body_day_heart": {
|
||||
"scale": 0.5169,
|
||||
"ox": 125.6,
|
||||
"oy": 237.6
|
||||
},
|
||||
"noeul_body_day_idle_full": {
|
||||
"scale": 0.518,
|
||||
"ox": 125.3,
|
||||
"oy": 174.9
|
||||
},
|
||||
"noeul_body_day_idle_upper": {
|
||||
"scale": 0.7823,
|
||||
"ox": 56.6,
|
||||
"oy": 231.2
|
||||
},
|
||||
"noeul_body_day_joy": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.2,
|
||||
"oy": 218.6
|
||||
},
|
||||
"noeul_body_day_listen": {
|
||||
"scale": 0.5736,
|
||||
"ox": 110.9,
|
||||
"oy": 236.2
|
||||
},
|
||||
"noeul_body_day_peace": {
|
||||
"scale": 0.5793,
|
||||
"ox": 109.4,
|
||||
"oy": 236.1
|
||||
},
|
||||
"noeul_body_day_piano": {
|
||||
"scale": 0.5764,
|
||||
"ox": 110.1,
|
||||
"oy": 236.2
|
||||
},
|
||||
"noeul_body_day_point": {
|
||||
"scale": 0.5721,
|
||||
"ox": 111.2,
|
||||
"oy": 236.3
|
||||
},
|
||||
"noeul_body_day_present": {
|
||||
"scale": 0.6199,
|
||||
"ox": 98.8,
|
||||
"oy": 235.1
|
||||
},
|
||||
"noeul_body_day_shrug": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_day_thumbsup": {
|
||||
"scale": 0.7591,
|
||||
"ox": 62.6,
|
||||
"oy": 231.8
|
||||
},
|
||||
"noeul_body_day_wave": {
|
||||
"scale": 0.6199,
|
||||
"ox": 98.8,
|
||||
"oy": 235.1
|
||||
},
|
||||
"noeul_body_night_armscross": {
|
||||
"scale": 0.4423,
|
||||
"ox": 129.1,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_night_cheer": {
|
||||
"scale": 0.4423,
|
||||
"ox": 260.0,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_night_clap": {
|
||||
"scale": 0.4423,
|
||||
"ox": 129.1,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_night_control": {
|
||||
"scale": 0.4423,
|
||||
"ox": 129.1,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_night_dj": {
|
||||
"scale": 0.5157,
|
||||
"ox": 107.4,
|
||||
"oy": 237.6
|
||||
},
|
||||
"noeul_body_night_handwave": {
|
||||
"scale": 0.5721,
|
||||
"ox": 90.6,
|
||||
"oy": 236.3
|
||||
},
|
||||
"noeul_body_night_heart": {
|
||||
"scale": 0.5169,
|
||||
"ox": 107.0,
|
||||
"oy": 237.6
|
||||
},
|
||||
"noeul_body_night_idle_full": {
|
||||
"scale": 0.518,
|
||||
"ox": 106.7,
|
||||
"oy": 174.9
|
||||
},
|
||||
"noeul_body_night_idle_upper": {
|
||||
"scale": 0.7823,
|
||||
"ox": 28.4,
|
||||
"oy": 231.2
|
||||
},
|
||||
"noeul_body_night_joy": {
|
||||
"scale": 0.4423,
|
||||
"ox": 145.2,
|
||||
"oy": 218.6
|
||||
},
|
||||
"noeul_body_night_listen": {
|
||||
"scale": 0.5736,
|
||||
"ox": 90.2,
|
||||
"oy": 236.2
|
||||
},
|
||||
"noeul_body_night_peace": {
|
||||
"scale": 0.5793,
|
||||
"ox": 88.5,
|
||||
"oy": 236.1
|
||||
},
|
||||
"noeul_body_night_piano": {
|
||||
"scale": 0.5764,
|
||||
"ox": 89.4,
|
||||
"oy": 236.2
|
||||
},
|
||||
"noeul_body_night_point": {
|
||||
"scale": 0.5721,
|
||||
"ox": 90.6,
|
||||
"oy": 236.3
|
||||
},
|
||||
"noeul_body_night_present": {
|
||||
"scale": 0.6199,
|
||||
"ox": 76.5,
|
||||
"oy": 235.1
|
||||
},
|
||||
"noeul_body_night_shrug": {
|
||||
"scale": 0.4423,
|
||||
"ox": 129.1,
|
||||
"oy": 239.4
|
||||
},
|
||||
"noeul_body_night_thumbsup": {
|
||||
"scale": 0.7591,
|
||||
"ox": 35.3,
|
||||
"oy": 231.8
|
||||
},
|
||||
"noeul_body_night_wave": {
|
||||
"scale": 0.6199,
|
||||
"ox": 76.5,
|
||||
"oy": 235.1
|
||||
}
|
||||
},
|
||||
"heads": {
|
||||
"noeul_head_wave": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_blink": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_confused": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_cool": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_laugh": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_love": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_negative": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_neutral": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_playful": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_positive": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_pout": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_proud": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_sad": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_shy": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_sleepy": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_smile": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_surprised": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_talk": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_talk_wide": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_thinking": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
},
|
||||
"noeul_head_wave_wink": {
|
||||
"w": 293,
|
||||
"neckNorm": [
|
||||
0.5651,
|
||||
0.8359
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 59 KiB |
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "gesture_focus",
|
||||
"desc": "노을 시그니처 — 헤드폰에 한 손 얹고 나른하게 비트에 고개 까딱까딱 (로파이 집중/감상). 대사 없이 잔잔한 허밍.",
|
||||
"duration": 4.0,
|
||||
"loopHint": true,
|
||||
"return": "idle",
|
||||
"layers": {
|
||||
"body": [
|
||||
{ "t": 0.0, "mode": "rig", "clip": "idle" },
|
||||
{ "t": 0.3, "mode": "baked", "image": "noeul_body_cozy_listen", "fade": 0.4 }
|
||||
],
|
||||
"face": [
|
||||
{ "t": 0.0, "expr": "neutral" },
|
||||
{ "t": 0.5, "expr": "sleepy" }
|
||||
],
|
||||
"mouth": [
|
||||
{ "t": 1.0, "say": "음~", "dur": 0.8, "pattern": "talk" }
|
||||
],
|
||||
"transform": {
|
||||
"head": { "rot": [ {"t":0.0,"v":0}, {"t":0.5,"v":4}, {"t":1.0,"v":0}, {"t":1.5,"v":4}, {"t":2.0,"v":0}, {"t":2.5,"v":4}, {"t":3.0,"v":0}, {"t":3.5,"v":4}, {"t":4.0,"v":0} ],
|
||||
"ty": [ {"t":0.0,"v":0}, {"t":0.5,"v":3}, {"t":1.0,"v":0}, {"t":1.5,"v":3}, {"t":2.0,"v":0}, {"t":2.5,"v":3}, {"t":3.0,"v":0}, {"t":3.5,"v":3}, {"t":4.0,"v":0} ] },
|
||||
"pelvis": { "ty": [ {"t":0.0,"v":0}, {"t":1.0,"v":3}, {"t":2.0,"v":0}, {"t":3.0,"v":3}, {"t":4.0,"v":0} ] }
|
||||
},
|
||||
"caption": [ { "t": 1.0, "text": "♪", "dur": 3.0 } ],
|
||||
"sfx": [ { "t": 0.5, "id": "lofi_loop", "loop": true } ]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "gesture_heart",
|
||||
"desc": "손 하트를 그리며 따뜻하고 차분하게 '잘됐어요~' (로파이 톤: 부드러운 바운스)",
|
||||
"duration": 2.4,
|
||||
"return": "idle",
|
||||
"layers": {
|
||||
"body": [
|
||||
{ "t": 0.0, "mode": "rig", "clip": "idle" },
|
||||
{ "t": 0.2, "mode": "baked", "image": "noeul_body_cozy_heart", "fade": 0.3 }
|
||||
],
|
||||
"face": [
|
||||
{ "t": 0.0, "expr": "smile" },
|
||||
{ "t": 0.3, "expr": "love" }
|
||||
],
|
||||
"mouth": [
|
||||
{ "t": 0.6, "say": "잘됐어요", "dur": 1.1, "pattern": "talk" }
|
||||
],
|
||||
"transform": {
|
||||
"pelvis": { "ty": [ {"t":0.5,"v":0}, {"t":0.9,"v":5}, {"t":1.3,"v":0}, {"t":1.7,"v":5}, {"t":2.1,"v":0} ] },
|
||||
"head": { "rot": [ {"t":0.5,"v":0}, {"t":0.9,"v":3}, {"t":1.3,"v":-3}, {"t":1.7,"v":3}, {"t":2.1,"v":0} ] }
|
||||
},
|
||||
"caption": [ { "t": 0.6, "text": "잘됐어요~", "dur": 1.5 } ],
|
||||
"sfx": [ { "t": 0.55, "id": "soft_success" } ]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "gesture_no",
|
||||
"desc": "차분하게 팔짱 끼고 살짝 고개 저으며 '음, 안 돼요~' (로파이 톤: 진폭 작게, 느리게)",
|
||||
"duration": 2.8,
|
||||
"return": "idle",
|
||||
"layers": {
|
||||
"body": [
|
||||
{ "t": 0.0, "mode": "rig", "clip": "idle" },
|
||||
{ "t": 0.2, "mode": "baked", "image": "noeul_body_cozy_armscross", "fade": 0.3 }
|
||||
],
|
||||
"face": [
|
||||
{ "t": 0.0, "expr": "neutral" },
|
||||
{ "t": 0.4, "expr": "negative" }
|
||||
],
|
||||
"mouth": [
|
||||
{ "t": 0.7, "say": "음, 안 돼요", "dur": 1.3, "pattern": "talk" }
|
||||
],
|
||||
"transform": {
|
||||
"chest": { "ty": [ {"t":0.0,"v":0}, {"t":0.3,"v":-3}, {"t":0.6,"v":0} ] },
|
||||
"head": { "rot": [ {"t":0.7,"v":0}, {"t":1.1,"v":6}, {"t":1.6,"v":-6}, {"t":2.1,"v":4}, {"t":2.5,"v":0} ] }
|
||||
},
|
||||
"caption": [ { "t": 0.7, "text": "음, 안 돼요~", "dur": 1.7 } ],
|
||||
"sfx": [ { "t": 0.6, "id": "soft_no" } ]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "Noeul reactions map",
|
||||
"note": "상황키(app event) → 반응 클립(clips/<name>.json). 노을은 차분한 로파이 무드 — 모션 진폭·대사 톤을 낮춘다. idle은 배경 기본 루프.",
|
||||
"idleDefault": "dance_idle",
|
||||
"map": {
|
||||
"idle": "dance_idle",
|
||||
"error": "gesture_no",
|
||||
"success": "gesture_heart",
|
||||
"focus": "gesture_focus"
|
||||
},
|
||||
"plannedExpansion": {
|
||||
"greet": "gesture_wave",
|
||||
"sleepy": "gesture_sleepy"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user