Character brief for the BroV redesign (tehzadanie.md)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+416
@@ -0,0 +1,416 @@
|
|||||||
|
# ТЗ: персонаж для BroV
|
||||||
|
|
||||||
|
## 0. Контекст
|
||||||
|
|
||||||
|
**BroV** — маленькое приложение для macOS, которое живёт в «чёлке» (notch) MacBook. Внутри сидит персонаж-маскот. Он показывает, что делают ИИ-агенты (Claude Code и другие), просит подтвердить действия, болтает в чате и реагирует на пользователя.
|
||||||
|
|
||||||
|
Название — игра слов: **BroV = «бровь»** (чёлка MacBook похожа на бровь) + «bro». Персонаж должен это обыгрывать.
|
||||||
|
|
||||||
|
Сейчас в приложении стоит временная заглушка: болотно-зелёный бугристый комок с огромной сросшейся волосатой бровью, кровавыми глазами разного размера, зубастой ухмылкой, слюной, бородавками и шрамом со швами. Её нужно заменить на нормально придуманного персонажа.
|
||||||
|
|
||||||
|
**Важно про технику.** Персонаж **рисуется кодом**: SwiftUI `Canvas`, векторные примитивы (эллипсы, кривые Безье, скруглённые прямоугольники, градиенты), 60–120 кадров/с. Картинок, спрайтов, Lottie или Rive нет. Анимация **параметрическая**: у движка есть набор чисел (поворот головы, сжатие, открытость глаз и т. п.), которые плавно меняются, и каждый кадр персонаж перерисовывается по этим числам. Значит, от тебя нужны не «кадры мультика», а **конструкция персонажа + раскадровки, привязанные к этим параметрам**. Код по твоему дизайну напишет другой ИИ (Claude).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Что нужно сдать (deliverables)
|
||||||
|
|
||||||
|
1. **Концепт и характер.** 3 варианта концепта (картинками), потом один финальный. Короткое описание характера: кто он, как двигается, чем бесит, чем мил.
|
||||||
|
2. **Character sheet** финального варианта: анфас, повороты головы влево/вправо (≈30°), взгляд вверх/вниз, вид в мелком размере (20 и 44 pt).
|
||||||
|
3. **Слоистый SVG** нейтральной позы (viewBox, описанный в разделе 3), каждый элемент отдельной группой с понятным `id`: `body`, `shading`, `brow`, `eye-left`, `eye-right`, `mouth`, `hand-left`, `hand-right`, `details` (бородавки, шрамы и т. п.). Только простые фигуры: `ellipse`, `rect rx`, `path` с кривыми Безье, `linearGradient`/`radialGradient`. Без фильтров, масок с растром, шрифтов и картинок.
|
||||||
|
4. **Все формы глаз** (13 штук, раздел 6) — SVG или чёткие эскизы с размерами.
|
||||||
|
5. **Все формы брови** по состояниям и эмоциям (раздел 7).
|
||||||
|
6. **Все формы рта** по состояниям, плюс «рот-щель» для режима коробки (раздел 11).
|
||||||
|
7. **Палитра** с HEX: основное тело, тени, обводки, глаза, бровь, рот, акценты. Плюс правило, как тело перекрашивается в цвет состояния (раздел 5).
|
||||||
|
8. **Раскадровки** каждой анимации из разделов 8–13: ключевые позы + тайминги в миллисекундах + какие параметры меняются. Формат описан в разделе 15.
|
||||||
|
9. **Аксессуары/наряды** (раздел 14): как каждый сидит на новой форме тела.
|
||||||
|
10. **Иконка приложения** (1024×1024, скруглённый квадрат macOS) и **иконка меню-бара** (одноцветный силуэт 22×16 pt, читается в 16 px).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Жёсткие ограничения
|
||||||
|
|
||||||
|
- **Фон всегда чёрный**: чёлка — это чёрный остров у верхнего края экрана. Персонаж должен хорошо читаться на `#000`–`#16171B`.
|
||||||
|
- **Размеры, в которых он живёт** (диаметр области персонажа):
|
||||||
|
- 6 pt — спрятан в чёлке (почти точка);
|
||||||
|
- 20 pt — бегунок полосы загрузки;
|
||||||
|
- 24–30 pt — свёрнутый режим (compact) и мини-боты в «пилюлях» агентов;
|
||||||
|
- 44–66 pt — основной размер в развёрнутой чёлке;
|
||||||
|
- 120 pt — режим «на рабочем столе»;
|
||||||
|
- 1024 — иконка.
|
||||||
|
|
||||||
|
**Главный размер — 44–66 pt.** При 20–30 pt мелкие детали (волоски, вены, бородавки) должны пропадать, а силуэт, бровь и глаза — оставаться узнаваемыми. Опиши, какие детали скрывать ниже какого размера.
|
||||||
|
- **Простота отрисовки**: держи в голове бюджет ~40 фигур на кадр для основного персонажа и ~10 для мини-бота. Без сложных текстур.
|
||||||
|
- **Псевдо-3D**: голова «поворачивается» (yaw/pitch, раздел 4). Глаза, бровь и рот при повороте **съезжают по поверхности** и сплющиваются по краям, как на шаре. Значит, лицо должно лежать на условной сфере, а не быть плоской наклейкой.
|
||||||
|
- **Тело перекрашивается**: мини-боты агентов заливаются сплошным цветом агента (синий, зелёный и т. д.). Дизайн должен работать и в «своих» цветах, и в однотонной заливке любого цвета.
|
||||||
|
- **Лицензия**: нельзя делать похожим на Mochi из проекта Coucou (белый мягкий квадратик-моти с двумя чёрными глазами-пилюлями). Свой оригинальный персонаж.
|
||||||
|
- **Настроение**: кринжовый, слегка жуткий, но обаятельный. Уровень «милый монстр / гадкий бро», не хоррор, от которого неприятно работать.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Система координат
|
||||||
|
|
||||||
|
Холст квадратный, сторона `W`. Все размеры персонажа считаются от `R = 0.3 · W`.
|
||||||
|
|
||||||
|
| Элемент | Значение |
|
||||||
|
|---|---|
|
||||||
|
| Центр тела | центр холста, чуть ниже: `cy = H/2 + 0.06R` |
|
||||||
|
| Полуширина тела `rx` | `1.14 R` |
|
||||||
|
| Полувысота тела `ry` | `0.88 R` |
|
||||||
|
| Текущая форма тела | суперэллипс (скруглённый «squircle»), показатель ≈ 2.7 |
|
||||||
|
| Глаза | на «сфере» на ±0.37 рад (≈21°) от центра по горизонтали, по вертикали чуть ниже центра (`eyeP = −0.12` рад) |
|
||||||
|
| Размер глаза | ширина `0.25R`, высота `0.27R` |
|
||||||
|
| Руки | эллипсы `0.60·ry × 0.52·ry`, прячутся за телом снизу по бокам |
|
||||||
|
|
||||||
|
Форму тела **можно менять** (не обязательно squircle), но габариты держи примерно в `2.3R × 1.8R`: под них свёрстан весь интерфейс.
|
||||||
|
|
||||||
|
Для SVG используй `viewBox="-1.5 -1.5 3 3"` с единицей = `R` и центром тела в (0, 0). Так размеры переносятся в код один в один.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Анимационные параметры движка
|
||||||
|
|
||||||
|
Каждый кадр движок хранит эти числа и рисует персонажа по ним. Все раскадровки описывай через них. Можешь предложить **новые параметры** (например, `browAngle`, `mouthOpen`, `drool`), но явно их перечисли и опиши диапазон.
|
||||||
|
|
||||||
|
| Параметр | Диапазон | Что делает |
|
||||||
|
|---|---|---|
|
||||||
|
| `yaw` | −0.65…0.65 рад | поворот головы влево-вправо (лицо съезжает по сфере) |
|
||||||
|
| `pitch` | −0.5…0.5 рад | взгляд вверх-вниз |
|
||||||
|
| `tilt` | ±0.2 рад | наклон всего тела (поворот вокруг центра) |
|
||||||
|
| `roll` | 0…4π | «кувырок»: лицо прокручивается по сфере, полный оборот = 2π |
|
||||||
|
| `sx`, `sy` | 0.78…1.28 | сжатие/растяжение тела (squash & stretch) |
|
||||||
|
| `ox`, `oy` | ±0.3 (в долях R) | смещение тела (тряска, подпрыгивание) |
|
||||||
|
| `open` | 0.06…1 | открытость глаз (моргание) |
|
||||||
|
| `es` | 1…1.25 | масштаб глаз (удивление, наведение мыши) |
|
||||||
|
| `tint` | 0…0.78 | насколько тело окрашено в цвет состояния (снизу вверх) |
|
||||||
|
| `blush` | 0…1 | румянец |
|
||||||
|
| `hands` | 0…1 | руки выдвинуты из-за тела |
|
||||||
|
| `morph` | 0…1 | превращение тела в коробку-почтовый ящик (раздел 11) |
|
||||||
|
| `slotH` | 0…0.5 (в долях R) | высота «рта-щели» коробки, на пружине |
|
||||||
|
| `badgeS` | 0…1 | масштаб значка над головой (раздел 9) |
|
||||||
|
| `physDx`, `physDy` | −1…1 | инерция для шапок и болтающихся деталей: отстают при движении |
|
||||||
|
| `dancingLevel` | 0…1 | танец под музыку (раздел 12) |
|
||||||
|
| `outfitPresence` | 0…1 | появление наряда |
|
||||||
|
|
||||||
|
**Как меняются значения:**
|
||||||
|
- **Твины по ключам:** `[цель, длительность мс, кривая]`, ключи идут друг за другом. Кривые: `out` (кубическое замедление), `inOut`, `back` (с перелётом и откатом, c1 = 1.7), `lin`.
|
||||||
|
- **Плавное следование к цели** каждый кадр — для взгляда, наклона и дыхания.
|
||||||
|
- **Пружины:** для рта-щели (период 0.25 с, затухание 0.6, лёгкий «клац») и для инерции аксессуаров (жёсткость 60, затухание 9).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Состояния (BotState)
|
||||||
|
|
||||||
|
Состояние держится долго, пока агент в нём находится. У каждого есть цвет подкраски тела, форма глаз, значок, постоянное поведение и звук при входе.
|
||||||
|
|
||||||
|
| Состояние | Когда | Цвет | Подкраска | Глаза | Значок | Постоянное поведение | При входе |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| `idle` | ничего не происходит | `#E6E9EE` | 0 | pill | — | следит глазами за курсором | моргание |
|
||||||
|
| `working` | агент работает | `#3B9EFF` | 0.72 | pill | три точки (синие) | следит за курсором | моргание, звук `work` |
|
||||||
|
| `thinking` | модель думает | `#8B5CF6` | 0.72 | pill | три точки | смотрит вверх-вправо (задумчиво) | звук `think` |
|
||||||
|
| `searching` | поиск | `#6365F2` | 0.72 | pill | три точки | **сканирует**: голова ходит влево-вправо `yaw = sin(2.6t)·0.6` | звук `search` |
|
||||||
|
| `approval` | ждёт разрешения | `#F5A524` | 0.78 | wide | «!» | **подпрыгивает** `oy = −|sin(5.2t)|·0.07` | прыжок `oy`: −0.2 за 150 мс (out) → 0 за 300 мс (back), звук `approval` |
|
||||||
|
| `question` | агент задал вопрос | `#22D3EE` | 0.75 | pill | «?» | голова наклонена `tilt = 0.17` | моргание, звук `question` |
|
||||||
|
| `error` | ошибка | `#F4505E` | 0.78 | flat | точка | — | тряска `ox`: 0.08 (50 мс) → −0.08 (70) → 0.05 (70) → 0 (90), звук `error` |
|
||||||
|
| `finished` | готово | `#34D499` | 0.35 | happy | точка | — | **кувырок** на 1 оборот за 950 мс + 5 искр через 0.5 с, звук `finish` |
|
||||||
|
| `ratelimit` | упёрся в лимит | `#FB923C` | 0.72 | tired | точка | **потеет**: капли пота | капля пота, звук `rate` |
|
||||||
|
| `sleeping` | давно без дела | `#94A2B8` | 0.32 | closed | — | **дышит** (sy ±0.035, sx в противофазе, частота 1.8), смотрит чуть вниз, летят «Z» | звук `sleep` |
|
||||||
|
| `dizzy` | его 3 раза шлёпнули | `#F472B6` | 0.70 | spiral | — | голова мотается `yaw = sin(9t)·0.25` | **2 кувырка** за 1300 мс, звук `dizzy` |
|
||||||
|
|
||||||
|
Подкраска: поверх основного градиента тела снизу вверх идёт градиент цвета состояния (непрозрачность `0.72·tint` внизу → 0 вверху). Цвет переключается плавно, примерно за полсекунды.
|
||||||
|
|
||||||
|
**Задача:**
|
||||||
|
- для каждого состояния нарисуй позу: бровь, рот, глаза и особые детали (например, при `error` пар из ушей, при `ratelimit` высунутый язык);
|
||||||
|
- скажи, как подкраска ложится на твою палитру;
|
||||||
|
- если хочешь заменить подкраску другим приёмом (свечение, цвет брови и т. п.), предложи.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Формы глаз (EyeShape)
|
||||||
|
|
||||||
|
Глаз рисуется в своей локальной системе: центр (0, 0), ширина `w`, высота `h`, сплющивание по сфере применяет движок. Нужен дизайн всех 13 форм:
|
||||||
|
|
||||||
|
| Форма | Где используется | Сейчас выглядит как |
|
||||||
|
|---|---|---|
|
||||||
|
| `pill` | норма | вертикальная пилюля; при моргании сплющивается до `max(h·open, 0.3w)` |
|
||||||
|
| `wide` | approval | pill ×1.16 по ширине, ×1.12 по высоте |
|
||||||
|
| `dot` | эмоция «удивлён» | маленький круг 0.9w |
|
||||||
|
| `line` | «раздражён» (после шлепка) | короткая наклонная полоска, наклон ±0.2 рад к центру |
|
||||||
|
| `flat` | error | горизонтальная полоска |
|
||||||
|
| `happy` | finished, «счастлив», танец | дуга-«улыбка» ∩ |
|
||||||
|
| `closed` | sleeping | дуга ∪, закрытые глаза |
|
||||||
|
| `spiral` | dizzy | **вращающаяся** спираль (2.2 витка, крутится с частотой 9 рад/с, левый и правый в разные стороны) |
|
||||||
|
| `heart` | «любовь» | красное сердце `#FF4D6D` |
|
||||||
|
| `star` | «гордость» | **вращающаяся** жёлтая звезда `#F7B32B` |
|
||||||
|
| `tired` | ratelimit, «зевок» | полуприкрытый глаз с веком |
|
||||||
|
| `wink` | «подмигивание» | левый открыт (pill), правый — дуга happy |
|
||||||
|
| `cup` | коробка, когда файл над ней | «чашка»: плоский верх, скруглённый низ |
|
||||||
|
|
||||||
|
У нормального глаза обязательно должен быть **зрачок или явное направление взгляда**: он смотрит на курсор мыши.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Бровь (новый ключевой элемент)
|
||||||
|
|
||||||
|
Раз персонаж «бровь», бровь должна быть **главным выразительным органом**, сильнее глаз. Нужно:
|
||||||
|
- **дизайн брови**: моно-бровь или две, волосатая или гладкая, толщина, цвет;
|
||||||
|
- **позы брови** для каждого из 11 состояний и 7 эмоций:
|
||||||
|
- угол центра (вниз = злость, вверх = тревога);
|
||||||
|
- подъём краёв;
|
||||||
|
- асимметрия (одна бровь вверх — вопрос);
|
||||||
|
- **анимации брови:**
|
||||||
|
- «поиграть бровями» (быстрый двойной подъём, ~300 мс) — для приветствия и наведения мыши;
|
||||||
|
- подёргивание в ожидании (approval);
|
||||||
|
- бровь «уползает» в сторону при головокружении;
|
||||||
|
- бровь «падает» при засыпании;
|
||||||
|
- новый параметр `browRaise` (−1…1), `browAngle` (−1…1), `browWiggle` или свои — опиши.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Постоянные (фоновые) поведения
|
||||||
|
|
||||||
|
Работают всегда, поверх состояний:
|
||||||
|
|
||||||
|
1. **Взгляд за курсором:** `yaw → lookX·0.62`, `pitch → lookY·0.5`, где `lookX/Y` — нормализованное направление на курсор (−1…1). Плавно, с коэффициентом `1 − 0.0025^dt`.
|
||||||
|
2. **Моргание:** каждые 2.2–5.4 с случайно. Моргание = `open`: 0.06 за 70 мс (inOut) → 1 за 130 мс (out). В 22 % случаев двойное (второе через 230 мс). Не моргает во сне и при головокружении.
|
||||||
|
3. **Дыхание** (только `sleeping` у основного): sy = 1 + sin(1.8t)·0.035, sx = 1 − sin(1.8t)·0.02.
|
||||||
|
4. **Пульс мини-ботов:** sy = 1 + sin(2.2t)·0.04, sx = 1 − sin(2.2t)·0.02, у каждого своя фаза.
|
||||||
|
5. **Блуждающий взгляд мини-ботов:** мышь игнорируют, каждые 0.5–2 с смотрят в случайную точку.
|
||||||
|
6. **Фоновые частицы:** раз в 1.3 с — «Z» во сне; капля пота (50 %) при ratelimit.
|
||||||
|
7. **Инерция аксессуаров** (`physDx/Dy`): шапки и помпоны отстают при повороте головы, прыжке и кувырке.
|
||||||
|
|
||||||
|
**Задача:** предложи 2–4 своих фоновых «тика», которые делают персонажа живым и кринжовым. Например:
|
||||||
|
- в простое иногда ковыряет в носу или чешет бровь;
|
||||||
|
- слюна медленно капает;
|
||||||
|
- раз в минуту оглядывается.
|
||||||
|
|
||||||
|
Для каждого укажи частоту, длительность и параметры.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Значок над головой (badge)
|
||||||
|
|
||||||
|
Маленький кружок слева сверху от тела (≈ на `−0.72R` по X). Типы:
|
||||||
|
- `dots` — три точки, работа/мышление;
|
||||||
|
- `bang` — «!», ждёт тебя;
|
||||||
|
- `question` — «?»;
|
||||||
|
- `dot` — просто точка-индикатор.
|
||||||
|
|
||||||
|
Смена значка: старый уменьшается до 0 за 90 мс, новый вырастает до 1 за 280 мс (back).
|
||||||
|
|
||||||
|
**Задача:** дизайн значков в стиле персонажа. Можно предложить заменить значок на действие самого персонажа, например бровь изгибается в «?».
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Одноразовые анимации и эмоции
|
||||||
|
|
||||||
|
Тайминги ниже — **текущие**. Их можно менять, но в том же формате.
|
||||||
|
|
||||||
|
### 10.1 Squash (шлепок по телу, приземление)
|
||||||
|
- `sy`: 0.78 (70 мс, out) → 1.1 (130, out) → 1 (170, inOut);
|
||||||
|
- `sx`: 1.16 (70) → 0.95 (130) → 1 (170);
|
||||||
|
- плюс толчок пружины аксессуаров вниз.
|
||||||
|
|
||||||
|
### 10.2 Шлепок пользователем (slap)
|
||||||
|
- Клик по персонажу → squash + толчок вбок + глаза `line` на 800 мс + звук `slap`, затем `annoyed`.
|
||||||
|
- **3 шлепка за 1.7 с → состояние `dizzy`** (2 кувырка, спирали в глазах).
|
||||||
|
- **Задача:** реакция на 1-й, 2-й и 3-й шлепок по нарастающей (бровь, рот, слюна летит?).
|
||||||
|
|
||||||
|
### 10.3 Кувырок (roll)
|
||||||
|
- Лицо прокручивается по «сфере» на `2π · turns`: `finished` — 1 оборот за 950 мс, `dizzy` — 2 оборота за 1300 мс, кривая inOut. В конце — squash.
|
||||||
|
- **Задача:** как ведут себя бровь, рот и детали при кувырке. Сейчас лицо просто «уезжает за горизонт» шара и выезжает с другой стороны.
|
||||||
|
|
||||||
|
### 10.4 Эмоции (BotEmote)
|
||||||
|
Временные, по умолчанию 1.8 с. Глаза меняются на форму из таблицы, плюс движение:
|
||||||
|
|
||||||
|
| Эмоция | Глаза | Движение | Частицы | Звук |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| `love` | heart | румянец 1 (300 мс) → держит → 0 (300 мс); прыжок `oy` −0.1 (160) → 0 (300, back) | 4 сердца | `love` |
|
||||||
|
| `surprised` | dot | прыжок `oy` −0.3 (140) → 0 (380, back); глаза `es` 1.25 (120) → 1 (500) | — | — |
|
||||||
|
| `proud` | star | squash; наклон −0.14 (220) → держит → 0 (280); румянец 0.7 | 5 звёзд | `proud` |
|
||||||
|
| `wink` | wink | наклон 0.12 (160) → держит → 0 (240) | — | `wink` |
|
||||||
|
| `yawn` | tired → closed через 0.7 с | sy 1.12 / sx 0.94 за 500 мс и обратно | 2 «Z» | `yawn` |
|
||||||
|
| `happy` | happy | румянец 0.6 (200) → 0 (600) | — | — |
|
||||||
|
| `annoyed` | line (800 мс) | — | — | `annoyed` |
|
||||||
|
|
||||||
|
**Задача:** раскадровка каждой эмоции с бровью и ртом. Можно добавить 2–3 новые кринжовые эмоции, например:
|
||||||
|
- `disgust` — блевок;
|
||||||
|
- `smug` — самодовольная бровь;
|
||||||
|
- `cringe` — сжимается и отворачивается.
|
||||||
|
|
||||||
|
### 10.5 Частицы
|
||||||
|
Типы: `heart`, `star`, `spark`, `sweat`, `z`.
|
||||||
|
- Рождаются над головой (y ≈ −0.7…−0.9 R), летят вверх со скоростью 0.45–0.8 R/с.
|
||||||
|
- Небольшой случайный разлёт, живут 1.3–1.8 с, вращаются.
|
||||||
|
- В группе каждая следующая стартует на 140 мс позже.
|
||||||
|
- `z` смещены вправо.
|
||||||
|
|
||||||
|
**Задача:** стиль частиц под персонажа. Можно заменить: вместо сердец — сердца с каплей, вместо искр — брызги слюны и т. п.
|
||||||
|
|
||||||
|
### 10.6 Мини-боты: периодические выходки
|
||||||
|
У мини-ботов (24–30 pt, однотонные) с постоянной эмоцией раз в 2–5 с:
|
||||||
|
- `happy` — подскок `oy` −0.30 (120) → 0.03 (200) → 0 (160, back) со squash;
|
||||||
|
- `annoyed` — резкое мотание головой `yaw`: −0.65 → 0.65 → −0.5 → 0.4 → −0.2 → 0 (50/90/80/75/70/140 мс);
|
||||||
|
- `wink` — подмигнул и наклонил голову на 0.55 с;
|
||||||
|
- `love` — 2 сердца + покачивание.
|
||||||
|
|
||||||
|
**Задача:** как выглядит мини-версия (упрощённый силуэт, бровь обязательна).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. Загрузка файла: тело → почтовый ящик
|
||||||
|
|
||||||
|
Пользователь тащит файл на чёлку, и персонаж **превращается в коробку с прорезью-ртом**, «глотает» файл и жуёт.
|
||||||
|
|
||||||
|
- `morph` 0 → 1: контур тела плавно перетекает из своей формы в скруглённый прямоугольник `1.0R × 0.94R` (полуразмеры), радиус углов `0.42R`.
|
||||||
|
- Подкраска уходит, глаза опускаются на `0.14·ry·morph` и становятся «плоскими» (сплющивание по сфере исчезает).
|
||||||
|
- **Прорезь-рот** (`slotH`, на пружине): ширина `1.8R·morph`, верх у крышки коробки.
|
||||||
|
- Позиции: 0 = закрыт, 0.20 = приоткрыт (файл рядом), 0.42 = открыт (файл над прорезью), 0.50 = максимум.
|
||||||
|
- Белый ободок у крышки, внутри тёмный градиент, светлая нижняя губа.
|
||||||
|
- Глаза: `cup`, когда файл над коробкой; `happy`, пока жуёт.
|
||||||
|
- **Глоток (gulp):**
|
||||||
|
- рот 0.42 → через 460 мс закрывается и 800 мс жуёт;
|
||||||
|
- тело: `sy` 0.78 (80) → 1.18 (130) → 1 (220, back), `sx` 1.28 → 0.92 → 1, моргание;
|
||||||
|
- звук `gulp`.
|
||||||
|
- **Таймлайн загрузки** (секунды от входа файла в зону):
|
||||||
|
|
||||||
|
| Момент | Время, с | Что происходит |
|
||||||
|
|---|---|---|
|
||||||
|
| следит за файлом | до 1.95 | коробка ездит по горизонтали за курсором |
|
||||||
|
| DROP | 1.95 | пользователь отпустил файл |
|
||||||
|
| засасывание | 2.03–2.33 | файл втягивается в прорезь |
|
||||||
|
| рот закрыт | 2.42 | |
|
||||||
|
| жевание | 2.60–2.88 | |
|
||||||
|
| уменьшение | до 3.23 | коробка сжимается в точку 20 pt |
|
||||||
|
| полоса загрузки | с 3.00 | появляется полоса |
|
||||||
|
| прогресс | с 3.25 | точка-персонаж едет по полосе как бегунок |
|
||||||
|
|
||||||
|
**Задача:**
|
||||||
|
- как выглядит **коробка в стиле персонажа**: бровь остаётся над прорезью? прорезь с зубами?
|
||||||
|
- раскадровка глотка и жевания;
|
||||||
|
- как выглядит 20-pt бегунок.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. Танец (Apple Music)
|
||||||
|
|
||||||
|
Когда играет музыка, персонаж танцует на 112 BPM:
|
||||||
|
- подскок `0.20R·|sin(π·beat)|`;
|
||||||
|
- покачивание по X `0.08R·sin(π·beat)`;
|
||||||
|
- наклон `0.10·sin(π·beat)`;
|
||||||
|
- при приземлении приплющивание (sx +4.5 %, sy −6 %);
|
||||||
|
- глаза `happy`;
|
||||||
|
- вход за 0.3 с, выход за 0.5 с;
|
||||||
|
- точка вращения — низ тела.
|
||||||
|
|
||||||
|
**Задача:** движения брови и рта в танце (бровь качается в такт?).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. Приветствие и появление
|
||||||
|
|
||||||
|
### 13.1 Приветствие при запуске (отдельная сцена, остров 640×150 pt, персонаж 58 pt в центре)
|
||||||
|
|
||||||
|
| Время, с | Что происходит |
|
||||||
|
|---|---|
|
||||||
|
| 0–0.85 | выезжает из чёлки вниз |
|
||||||
|
| 0.85–1.30 | осматривается, моргает |
|
||||||
|
| 1.30–1.45 | **«поп»** — выпрыгивает, растягиваясь |
|
||||||
|
| 1.45–2.40 | **машет правой рукой** (вверх-вправо), левая покачивается; руки — эллипсы, которые выдвигаются из-за тела |
|
||||||
|
| 2.40 | довольные глаза (`happy`/`content`) |
|
||||||
|
| 2.45–2.70 | прячет руки (вниз-влево) |
|
||||||
|
| 2.72 | появляется значок |
|
||||||
|
| 2.85–3.45 | съезжает вниз-вправо на своё место |
|
||||||
|
| 3.70 | второе моргание |
|
||||||
|
| 3.85–4.15 | подкраска цветом |
|
||||||
|
| 4.60 | конец сцены |
|
||||||
|
| 4.90 | автоуход (остров сворачивается за 0.34 с) |
|
||||||
|
|
||||||
|
### 13.2 Короткое «привет» (greet), когда пользователь вернулся
|
||||||
|
- 0 с: глаза `happy` на 2 с, прыжок `oy` −0.06 (220) → 0 (220, back);
|
||||||
|
- 0.25 с: руки выдвигаются (280 мс), лёгкий squash, звук `greet`;
|
||||||
|
- 0.45–1.55 с: **машет правой рукой**:
|
||||||
|
- рука поднимается к уровню глаз за 180 мс;
|
||||||
|
- потом осциллирует с частотой 13 рад/с (x ±0.06, y ±0.14 высоты тела, поворот ±0.35);
|
||||||
|
- тело покачивается `tilt = −0.06 + sin(2π·1.2t)·0.07`;
|
||||||
|
- 0.55 с и 1.50 с: моргания;
|
||||||
|
- 1.55 с: руки прячутся (200 мс);
|
||||||
|
- 1.75 с: короткие `happy`-глаза.
|
||||||
|
- Если пользователь кликнул во время приветствия, руки прячутся за 150 мс.
|
||||||
|
|
||||||
|
**Задача:**
|
||||||
|
- дизайн рук (сейчас это просто эллипсы цвета тела, торчащие снизу по бокам);
|
||||||
|
- раскадровка приветствия с бровью («поиграть бровями» вместо или вместе с маханием?).
|
||||||
|
|
||||||
|
### 13.3 Прятки в чёлке
|
||||||
|
- **hidden:** персонаж 6 pt, почти невидим.
|
||||||
|
- **compact:** при наведении на чёлку выглядывает (24–30 pt).
|
||||||
|
- **expanded:** чёлка раскрывается, персонаж 44–66 pt слева.
|
||||||
|
|
||||||
|
**Задача:** как он «выглядывает» из чёлки. Может, сначала из-под края показывается только бровь?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Наряды (гардероб)
|
||||||
|
|
||||||
|
Правый клик → гардероб. Наряды:
|
||||||
|
- `partyHat`, `beanie`, `crown`, `sunglasses`, `roundGlasses`, `bow`, `scarf`, `witchHat`, `pumpkin` (перекрашивает тело в оранжевый), `santaHat`, `bunnyEars`;
|
||||||
|
- `auto` — по сезону: 31.12–2.01 праздничный колпак, 1–26.12 колпак Санты, октябрь ведьмина шляпа, Пасха уши кролика, 21.06–31.08 очки.
|
||||||
|
|
||||||
|
Анимация: старый наряд исчезает за 180 мс → новый появляется за 350 мс с перелётом → squash. Шапки и помпоны болтаются по `physDx/physDy`.
|
||||||
|
|
||||||
|
**Задача:**
|
||||||
|
- адаптируй каждый наряд под новую форму головы и бровь (очки поверх брови? шапка на брови?);
|
||||||
|
- предложи 3–5 своих кринжовых нарядов (бигуди, золотая цепь «бро», накладные усы, ободок с глазами и т. п.).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 15. Формат раскадровок
|
||||||
|
|
||||||
|
Для каждой анимации — таблица ключей:
|
||||||
|
|
||||||
|
```
|
||||||
|
Анимация: approval-вход
|
||||||
|
Длительность: 450 мс, однократно
|
||||||
|
Звук: approval (в 0 мс)
|
||||||
|
|
||||||
|
| t, мс | параметр | значение | кривая | комментарий |
|
||||||
|
|-------|---------------|----------|--------|------------------------------|
|
||||||
|
| 0 | oy | 0 | | старт |
|
||||||
|
| 150 | oy | -0.2 | out | подпрыгнул |
|
||||||
|
| 450 | oy | 0 | back | приземлился с перелётом |
|
||||||
|
| 0 | browAngle | 0 | | |
|
||||||
|
| 120 | browAngle | 0.8 | out | бровь резко вниз — «ну?!» |
|
||||||
|
| 0..∞ | mouthOpen | 0.3+0.1·sin(12t) | — | орёт, пока ждёт |
|
||||||
|
|
||||||
|
Ключевые позы: [картинка 1: t=0] [картинка 2: t=150] [картинка 3: t=450]
|
||||||
|
```
|
||||||
|
|
||||||
|
- Новые параметры (бровь, рот, слюна и т. д.) — с диапазоном и описанием «что значит 0, что значит 1».
|
||||||
|
- Для постоянных поведений — формула от времени `t` (как в разделе 8).
|
||||||
|
- Позы — картинками.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 16. Звуки (для синхронизации)
|
||||||
|
|
||||||
|
Звуки уже есть (28 штук), раскадровки к ним привязывай по моменту:
|
||||||
|
|
||||||
|
`annoyed, approval, approve, attach, blip, close, dizzy, error, finish, greet, greeting, gulp, hover, love, open, peek, pop, proud, question, rate, search, send, slap, sleep, think, tick, wink, work, yawn`
|
||||||
|
|
||||||
|
Если для новых эмоций нужны новые звуки — опиши их словами: длительность, характер. Например: «отрыжка 0.4 с, низкая».
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 17. Чек-лист приёмки
|
||||||
|
|
||||||
|
- [ ] Узнаваем силуэтом при 24 pt на чёрном.
|
||||||
|
- [ ] Бровь — главный выразительный элемент, читается при 30 pt.
|
||||||
|
- [ ] Все 11 состояний различимы с первого взгляда.
|
||||||
|
- [ ] Все 13 форм глаз нарисованы.
|
||||||
|
- [ ] Работает в однотонной заливке любого цвета (мини-боты).
|
||||||
|
- [ ] Лицо корректно «едет по шару» при yaw ±0.65 и pitch ±0.5.
|
||||||
|
- [ ] Есть вариант-коробка (morph = 1) с прорезью-ртом.
|
||||||
|
- [ ] Руки, частицы, значки, наряды — в одном стиле.
|
||||||
|
- [ ] Только векторные примитивы и градиенты, без растра.
|
||||||
|
- [ ] Не похож на Mochi из Coucou.
|
||||||
|
- [ ] Иконка 1024 и иконка меню-бара.
|
||||||
Reference in New Issue
Block a user