Статья — пишем последней
Эмоциональная статья-история о проекте синтезирует весь разбор, когда остальные табы будут проработаны. Статья не предваряет анализ, а рождается из него.
Внутренний рабочий дашборд. Введи пароль.
Эмоциональная статья-история о проекте синтезирует весь разбор, когда остальные табы будут проработаны. Статья не предваряет анализ, а рождается из него.
Механике тамагочи 29 лет, и она пережила всё — брелок 1996-го, бум Neopets, эру говорящих котов и крипто-истерику 2024-го. За это время жанр похоронил сотни клонов и вырастил нескольких тихих чемпионов, которые зарабатывают десятки миллионов без единого рубля рекламы. Значит, вопрос не в том, работает ли идея «ухаживать за существом» — она доказанно работает четверть века. Вопрос острее и полезнее для нас: почему одни питомцы живут десятилетиями, а другие умирают за три месяца — и что из этого следует для того, которого делаем мы.
Чтобы понять, что делает питомца живым, надо вернуться к первому и самому честному решению жанра: существо может умереть.
В 1996-м Bandai выпустили брелок с пиксельным существом, и внутри него пряталась идея, которая держит жанр до сих пор: ставка. Не покормил — питомец голодает. Не убрал за ним — болеет. Забыл на сутки — умирает навсегда. Это звучит жестоко, но именно риск потери рождал подлинную заботу: ребёнок носил брелок в школу, просил учителя разрешить «покормить», плакал над умершим питомцем. 82 миллиона проданных устройств — это не про графику (её там не было), это про эмоциональную ставку, которую не повторил почти никто после.
Дальше жанр двадцать лет сглаживал эту жестокость — и одновременно терял её силу. Neopets и Nintendogs перенесли питомца в веб и на консоль, добавили мир, коллекцию и кастомизацию, но смягчили смертность. Мобильная эра (Pou, Talking Tom, My Tamagotchi Forever) сделала питомца массовым и добавила мини-игры и магазины — но вместе с ними пришла и первая расплата: агрессивная реклама и микротранзакции, нацеленные на детей, за которые эти продукты клянут до сих пор. А в 2020-х жанр повзрослел окончательно: Neko Atsume, Finch и Egg Inc доказали, что можно держать людей годами вообще без наказания — на любопытстве, коллекции и тёплом ритуале.
Брелок с пиксельным существом. Двигатель — смертность: ставка рождает заботу. 82+ млн устройств, мировой феномен. Урок, который потом забыли: привязанность держится на риске что-то потерять.
Питомцы уходят в веб и на консоли. Забота + коллекция + мир вокруг. Смертность смягчается — на первый план выходит привязанность и обустройство, но острота ставки падает.
Эра мобильных: питомец + мини-игры + магазин. Массовость — ценой репутации: реклама и микротранзакции на детях, штрафы, критика Common Sense Media.
Жанр взрослеет: ноль наказания, награда за возвращение, «прощающий» дизайн. Finch — $30 млн в год без инвесторов. Доказано: питомец как ритуал кормит бизнес.
Оригинал держался на том, что можно потерять. Наследники научились удерживать без жестокости — но те, кто выкинул ставку целиком, выкинули вместе с ней и привязанность.
Сегодня «виртуальный питомец» живёт в двух параллельных вселенных. В одной — тихие долгожители, которые зарабатывают годами. В другой — братская могила крипто-тапалок. И обе вселенные учат нас одному и тому же.
В мире мобильных долгожителей побеждают те, кто дал игроку смысл возвращаться не ради награды, а ради самого питомца. Finch растёт, пока ты живёшь свою жизнь, и мягко зовёт обратно через виджет, а не пушами-напоминаниями. Neko Atsume вообще не требует ничего — коты приходят сами, ты лишь ставишь плошки и ловишь азарт «кто заглянул во двор». Egg Inc держит месяцами за счёт компаундного сброса, когда всё «как новое». Объединяет их не жанр, а устройство удержания: мягкость, коллекция и награда за возврат.
В мире Telegram всё наоборот. Tap-to-earn-волна 2024-го собрала сотни миллионов игроков за недели — и схлопнулась почти целиком. Потому что ценность там была не в питомце, а в обещании будущего токена. Когда обещание наступало (или разочаровывало) — возвращаться становилось незачем. Выжили единицы, и ровно те, кто успел отрастить жизнь после токена.
Питомец растёт, когда ты живёшь свою жизнь. Виджет + мягкий возврат, без насилия пушами. Забота о себе через заботу о нём.
Коты приходят сами — ты ставишь еду и любуешься. Ноль наказания, азарт открытия «кто пришёл». Коллекция как двигатель.
Компаундный сброс (prestige): всё «как новое», плато ломается. Долгий смысл на месяцы.
Кастомизация + мини-игры + эволюция/возраст. Самовыражение держит, но тянет репутационный шлейф рекламы на детях.
300+ млн → 41 млн → ~12 млн к июлю 2025. Вся ценность — в одном будущем токене. Символ обвала всей ниши.
Оригинал тапалки. Выжил, но перестал быть игрой — стал инфраструктурой экосистемы TON.
Спасся не «котом», а контент-хабом из 50+ мини-игр + реальной монетизацией (покупки + реклама), а не ставкой на токен. $34M выручки.
Робо-питомец с PvP и прямой тамагочи на TON. Спрос на питомца есть — но завёрнут в токен и бои, а не в привязанность.
Это не «мобильные хорошие, а Telegram плохой». Это один закон в двух декорациях: живёт тот продукт, у которого есть смысл возвращаться ПОСЛЕ любой выплаты — а умирает тот, у кого вся ценность сложена в один будущий момент. Telegram просто довёл этот закон до карикатурной наглядности, потому что токен — самая чистая форма «отложенной ценности вместо привязанности».
Hamster Kombat стоит разобрать поштучно — это не просто «не повезло», а четыре системные ошибки, каждую из которых мы обязаны обойти по имени.
Игрок тапал месяцами ради будущего аирдропа. Пока его нет — ты работаешь «в долг». Как только он случился — причин открывать приложение не осталось. Ноль привязанности к самому существу.
После главного события не оставалось свежего геймплея — нечем было зацепить. Сравни с Catizen, который заранее отрастил хаб из 50+ мини-игр и потому пережил обвал токена.
Задержки, техсбои, мизерные выплаты «на доллар-два», плюс анти-чит забанил ~2,3 млн аккаунтов с конфискацией. Доверие — ресурс невозобновляемый: сгорело разом.
Ставка на инфлюенсеров и реферальные деревья, а не на то, ради чего возвращаться. Вирусность без удержания = ведро без дна: налили сотни миллионов — вытекли за квартал.
Если перевернуть кладбище и посмотреть на долгожителей, у всех до единого повторяются три одни и те же вещи. Это не советы — это условия, без которых питомец не живёт.
Возвращаешься ради самого существа и того, что с ним происходит, а не ради награды «снаружи». Finch, Neko — ценность внутри отношений, а не в токене или призе.
Поверх «покорми» — коллекция, открытие, обустройство, долгий прогресс. То, ради чего открываешь на третьей неделе, а не только в первый день.
Питомец не умирает от одного пропуска и не пилит тебя виной. Вернулся — тебя ждёт приятное, а не выговор. Забота, а не долг.
Оригинальный тамагочи нарушил бы закон 3 (смерть за пропуск), Hamster нарушил закон 1 и 2 (токен вместо питомца, пустота после). Наш питомец должен выполнить все три одновременно — и в этом ещё никто в Telegram не преуспел.
Сложив историю и реальность, мы упираемся в дыру, и она не случайна.
Почти все питомцы в Telegram завязаны на крипто-ожидание — потому что экосистема так устроена: токен давал мгновенный взрывной рост, и все бежали за ним. Ниша «питомец ради самого питомца», на эмоции и привязанности, как Finch и Neko, в Telegram практически пуста — туда просто никто не шёл, там «медленные» деньги.
Вторая, ещё более узкая пустота — зрелищность. Живые хиты Telegram (Notcoin, Hamster, TapSwap) осознанно остались на 2D-спрайтах ради охвата слабых устройств под крипто-аудиторию. Эмоциональный 3D-персонаж с настоящей мимикой не делает никто. А именно мимика — это то, за что привязываются. Получается редкое сочетание: проверенная механика (тамагочи 29 лет), бесфрикционная дистрибуция (Telegram), и при этом незанятое пересечение «эмоция + 3D + привязанность».
Окно открыто — но не навсегда. Tap-to-earn схлопнулся, аудитория устала от «play-to-earn», и рынок начинает искать продукты, которые держат не обещанием денег, а чувством. Мы заходим ровно в этот разворот.
Тамагочи, которого не бросают, потому что за него переживают — а не фармят.
Вывод первого таба — в одной связке:
История показывает двигатель: привязанность рождается из ставки и из отношений с существом, а не из внешней награды. Реальность показывает пустую нишу: в Telegram побеждает эмоция, но туда все ходили за токеном. Три закона задают проверку, которую наш питомец обязан пройти целиком. Всё, что мы проектируем дальше — сам питомец, его комната, взаимодействие, экономика — должно служить одной-единственной цели: сделать существо, за которое переживаешь. Если это получится — остальное приложится; если нет — не спасёт ни один красивый домик.
Telegram Mini Apps — это не просто вебвью, в котором крутится наша игра. Это платформа с конкретным набором возможностей, и она не нейтральна: одни её способности прямо включают нашу концепцию, другие — жёстко её ограничивают. Весь фокус этого таба — отделить то, что для нас стратегически важно, от общего списка API. Потому что именно три возможности SDK превращают «игру в вебвью» в питомца, который живёт в твоём Telegram — а пара ограничений диктует, как вообще устроена его «жизнь».
Главный технический вопрос концепции закрыт положительно — с одной важной оговоркой про то, КАК достигать «вау».
Mini App — это полноценный вебвью (WKWebView на iOS, WebView/Chrome на Android), внутри которого доступен WebGL 1.0/2.0. Three.js, Babylon, PlayCanvas, даже Unity WebGL — всё запускается. Доказательство промышленного масштаба: Catizen (30+ млн игроков) крутит 2D/3D-сцены на движке Cocos. То есть живой 3D-питомец в Telegram — не фантазия, а проверенная практика.
Оговорка — в производительности. Вебвью медленнее нативного рендера, а сам Telegram ест ресурсы поверх нашей сцены: двойной оверхед. Показательно, что топовые хиты (Notcoin, Hamster, TapSwap) намеренно остались на лёгких 2D-спрайтах ради охвата слабых устройств. Отсюда наш рецепт, совпадающий с уже принятым решением по движку: зрелищность — через арт-дирекшн, свет и анимацию, а не через полигоны и фотореализм. Стилизованный low-poly/toon, сжатые текстуры (KTX2/Basis), ленивая догрузка, critical-бандл в пределах пары мегабайт — чтобы холодный старт укладывался в 1–3 секунды. Человек открывает нас в лифте; если он 15 секунд смотрит на прогресс-бар — он уже не вернётся.
Это ровно то, почему мы выбрали web-native (R3F/Three.js), а не Unity: в вебвью потолок «вау» задаёт платформа, а не движок, — поэтому лёгкий старт и полный контроль над каждым килобайтом важнее мощного, но тяжёлого рантайма.
Телесность и «физическое» ощущение питомца достижимы родными средствами Telegram, а не хрупкими браузерными хаками.
В Bot API 8.0 Telegram добавил нативные объекты Accelerometer, Gyroscope и DeviceOrientation — с управляемой частотой опроса и единым поведением на iOS и Android (в отличие от сырого браузерного DeviceOrientationEvent, который в вебвью капризен и требует отдельных разрешений). Для питомца это значит: наклонил телефон — он скатывается, тянется взглядом, просыпается от встряхивания; параллакс даёт глубину сцене. Хаптика (Bot API 6.1) добавляет тактильный слой — мягкая серия вибраций под мурлыканье, «успех» на радости, «предупреждение» на недовольстве. Плюс полноэкранный режим, блокировка ориентации и нативные кнопки под сцену. Всё, что нужно, чтобы питомец ощущался живым и материальным, — в наличии.
Здесь спрятана ключевая архитектурная правда, на которой стоит вся наша бардак-механика.
Прямой ответ неожиданный: Mini App не выполняется в фоне. Закрыл или свернул — JavaScript останавливается. Нет фоновых таймеров, нет симуляции «внутри клиента», пока приложение закрыто. Это звучит как проблема для идеи «он живёт сам по себе» — но на деле решается стандартным паттерном idle-игр и решает её полностью.
Состояние питомца живёт на нашем сервере: голод, настроение и, главное, timestamp последнего визита. При открытии приложение считает Δt = сейчас − последний визит и server-side генерит «что произошло за отсутствие»: проголодался, заскучал, набедокурил. Именно так технически реализуется «открываешь — а там бардак»: не фоновая жизнь, а пересчёт при входе. Для хранения есть CloudStorage (до 1024 ключей × 4 КБ), DeviceStorage/SecureStorage (Bot API 9.0) — но полноценное состояние держим на своём бэкенде. А зовёт обратно — бот (см. ниже), а не фоновый процесс.
Вот здесь SDK перестаёт быть сантехникой и становится отстройкой. Эти три возможности — разница между «игрой, которую открываешь» и «сожителем, который присутствует в твоём мессенджере постоянно».
С Bot API 8.0 мини-апп может (с разрешения пользователя) ставить кастомный эмодзи-статус — тот, что видят все твои контакты рядом с именем. Идея твиста: настроение питомца становится твоим статусом в Telegram. Поспал — 😴, соскучился — 🥺, обиделся за двухдневное отсутствие — и это видят все, накормил и поиграл — 😻. Питомец выходит за пределы игры в твою цифровую личность. Ни одна другая поверхность не даёт такого присутствия — и никто в нише этого не делает.
Бот может сгенерить пользователю стикерпак с эмоциями его питомца (createNewStickerSet). Ты пишешь друзьям стикерами со своим Барсиком — он живёт во всех твоих чатах. Польза + присутствие + виральность. Ограничение: обычные стикеры, не кастом-эмодзи.
Бот шлёт «я кое-что натворил, посмотри» с кнопкой прямо в нужный экран. А shareToStory даёт виральный виток: «смотри, что он устроил» → в Stories со ссылкой на игру. Возврат на любопытстве, шеринг на эмоции.
addToHomeScreen (8.0): «посели питомца на главный экран» — иконка-мордочка как у обычного приложения. Ощущение постоянного присутствия рядом, ещё один крючок привязанности.
Сводка того, что есть, с какой версии — и как это применяет питомец.
| Возможность | Статус | Что делает питомец |
|---|---|---|
| WebGL / 3D | есть | Живая стилизованная 3D-сцена с питомцем (Three.js/R3F) |
| Гироскоп / акселерометр | 8.0 | Наклон → реакция, параллакс, «встряхни, чтобы разбудить» |
| Хаптика | 6.1 | Мурлыканье, радость, недовольство на ощупь |
| Эмодзи-статус | 8.0 | ⭐ Настроение питомца в профиле, видят контакты |
| Стикерпак | Bot API | Личные стикеры с эмоциями питомца во всех чатах |
| Пуши бота | есть | Деликатный возврат: «я кое-что натворил» |
| Stories / шеринг | 8.0 | shareToStory — виральный виток «смотри, что он устроил» |
| Home screen | 8.0 | Иконка-мордочка на главном экране телефона |
| Хранение (Cloud/Device) | 6.9 / 9.0 | Кэш сейвов; полное состояние — на своём бэкенде |
| Полноэкранный режим | 8.0 | Погружение в сцену без интерфейса чата |
| Фоновое исполнение | нельзя | «Жизнь пока не было» = пересчёт на сервере + пуш |
| Камера / микрофон | ненадёжно | Только сырой getUserMedia, на ядро не закладываем |
| Кастом-эмодзи паки | нельзя | Через Bot API не создать — только обычные стикеры |
Честные ограничения платформы. Не баги, а рамки, которые надо уважать в дизайне с первого дня.
Обходим серверным пересчётом по timestamp + пушами. Это даже лучше: бэкенд — надёжный «мозг» питомца, не зависящий от того, открыт ли клиент.
Лимит деликатности: 1–2 мягких напоминания в день, с реальной пользой, легко отключаемые. Возврат на любопытстве, а не на «claim your reward».
Экономику строим на десктоп/Fragment-покупках (комиссия 3–4%) + рекламе, а не на мобильных Stars в лоб. Деталь для таба монетизации.
Твист-поверхности включаются по желанию пользователя — это и юридически правильно, и снимает «тёмную сторону» (не всем нужен грустный питомец в статусе при коллегах).
Вывод второго таба:
Платформа зелёная по всем трём китам концепции. Зрелищный стилизованный 3D-питомец с мимикой, гироскопом и хаптикой — технически реалистичен. Твист «сожитель» — не мечта, а конкретные API: эмодзи-статус, стикерпак, пуши-возврат, появившиеся как раз в Bot API 8.0. «Жизнь, пока тебя не было» — стандартный серверный пересчёт, а не магия. Единственное, что платформа диктует жёстко: лёгкий старт, уважительные пуши и серверный мозг питомца. Это не препятствия, а рамки, внутри которых наша идея не просто помещается — она будто специально под Telegram 2024–2026 и задумана.
Питомец — длинный шест всего проекта. Если существо заставляет улыбнуться с первой секунды — концепт доказан, а мир, экономика и друзья лишь надстраиваются сверху. Если нет — не спасёт ни один красивый домик. Поэтому этот таб — самый глубокий, и он устроен в две части: сначала из чего вообще состоит питомец (всё поле возможностей), затем как выбрать первого героя не вслепую — по критериям от человечески-эмоциональных до технически-реализуемых.
Герой первого релиза — пушистый длинношёрстный КОТ. Лук: настоящий параметрический shell-мех (тюним ползунками density / length / quality под 60 fps на реальном телефоне), утрированные пропорции по детской схеме, мех короче вокруг глаз и морды ради читаемой мимики. Faux-fur (Fresnel-ободок) — страховка, если бенчмарк на целевых телефонах не сядет. Ниже — полная анатомия и матрица, на которых это решение стоит.
Восемь осей, по которым проектируется питомец. Каждая — отдельный слой «жизни»; вместе они и создают то, за что привязываются.
База «милоты» — детская схема (Лоренц): крупная голова, большие глаза ниже средней линии, округлость, короткие лапки. Язык форм: круг = тепло и безопасность, квадрат = надёжность, острые углы = угроза. Тест: узнаётся ли существо чёрным силуэтом.
Наш главный UI — вместо полосок морда. Носители без слов: глаза (размер зрачка, взгляд, блик), брови (угол = радость/грусть/гнев), наклон головы. Ключ: упрощение усиливает эмоцию — мультяшное лицо считывается точнее реалистичного.
У питомца должен быть нрав ещё до ИИ: ленивый, хулиган, застенчивый, гурман. Характер проявляется в реакциях и выходках. На платном уровне — генеративная личность на LLM: реплики и поведение рождаются, а не выбираются из списка.
Idle-жизнь (сам что-то делает) + реакции на тебя + репертуар выходок — ядро бардак-механики. Разбросал, спрятал, заболел, набедокурил. Это генератор свежих микро-сцен, который и держит «что он учудил на этот раз».
Где живёт «вау»: squash & stretch, вес, пружинистость, сочность. Живой слоистый idle (дыхание, моргание, фиджеты) важнее числа клипов — именно вариативность покоя проходит «порог живого».
Не слова, а звуки — мурлыканье, писк, бурчание + хаптика (тактильное мурлыканье через вибро). Звук и вибрация добавляют телесности без единой реплики и без языкового барьера.
Изменение во времени: стадии, возраст, эволюция. Настоящий ров — накопленная история: питомец помнит, растёт вместе с тобой, копит ваше общее прошлое. Чем дольше вы вместе, тем дороже бросить.
Как взаимодействует с комнатой, предметами и питомцами друзей. Каждый предмет меняет поведение (живой террариум), а дружба двух существ рождает сцены, которых нет у одного. Детали — в табах 4 и дружбы.
Детская схема (Kindchenschema) — большие глаза и округлость врождённо активируют систему вознаграждения мозга и инстинкт заботы (подтверждено PNAS на томографии). И работает межвидово — значит можно лепить хоть «инопланетянина», лишь бы черты были на месте. Усиление через упрощение (McCloud) — чем проще лицо, тем точнее читается эмоция (до ~60%) и тем легче спроецировать себя. Оба факта говорят одно: простое округлое существо с выразительной стилизацией бьёт фотореализм по привязанности.
Без выбора героя крафт не стартует, а ошибка здесь дороже всех. Поэтому выбираем по матрице критериев от эмоций к технике, а не по вкусу.
Критерии разложены по трём ярусам — именно так, как ты просил, от человечески-эмоциональных до технически-реализуемых:
Мгновенная любовь (детская схема), узнаваемость без объяснений, мемность/виральность, ширина эмоц. диапазона морды, сигнал «я нуждаюсь в тебе».
Проецируемость (вкладываешь себя), уникальность и защищаемость образа (не «ещё один кот»), широта аудитории, потенциал коллекции и шеринга.
Простота рига, выразительность на полигон в low-poly, вес модели и старт в вебе, объём набора анимаций, безопасность от «зловещей долины».
Независимость, грация, король интернет-мемов. Встроенный язык тела (уши/хвост/мурлык).
Верность, безусловная любовь, «нужен тебе». Сильнейший сигнал привязанности.
Круг + лицо + 1–2 уникальных якоря. Не «ещё один кот», но и не «непонятное».
Тайна и крючок «что вылупится». Холодное, пока не оживёт.
Шкала 1–5 (5 — максимально выгодно для нашей задачи). Источник — принципы дизайна персонажей и кейсы, не вкус.
| Критерий | 🐱 Кот | 🐶 Собака | 🫧 Блоб | 🥚 Яйцо |
|---|---|---|---|---|
| Мгновенная любовь (детская схема) | 4 | 5 | 4 | 2 |
| Узнаваемость без объяснений | 5 | 5 | 3 | 2 |
| Мемность / виральность | 5 | 3 | 4 | 3 |
| Проецируемость («вкладываю себя») | 3 | 3 | 5 | 5 |
| Широта аудитории | 4 | 4 | 4 | 3 |
| Эмоц. диапазон без слов (уши/хвост) | 5 | 5 | 3 | 2 |
| Сигнал «я нуждаюсь в тебе» (ядро) | 3 | 5 | 4 | 5 |
| Уникальность / защита бренда | 2 | 2 | 5 | 4 |
| Безопасность от «зловещей долины» | 4 | 3 | 5 | 5 |
| Простота рига | 3 | 3 | 5 | 5 |
| Выразительность на полигон (low-poly) | 4 | 4 | 5 | 4 |
| Вес модели / старт в вебе | 4 | 4 | 5 | 5 |
| Простота набора анимаций | 3 | 3 | 4 | 4 |
Собака — чемпион мгновенной любви и сигнала «нужности» (это и есть ядро тамагочи), но слабее по мемности, уникальности и технике, плюс тянет ожидание реализма → затраты и риск долины.
Кот — чемпион мемности/виральности и богатства языка тела, широкая аудитория. Минусы: перенасыщенный рынок («ещё один кот») и слабый сигнал нужности (коты самодостаточны).
Своё существо-блоб на базе круга — единственный кандидат, который максимизирует сразу все три яруса: эмоции добирает через детскую схему и masking-эффект, технику выигрывает вчистую (простой риг, максимум эмоции на полигон, минимальный вес, безопасность от долины), и даёт защищаемый бренд. Его слабое место — узнаваемость «из коробки» — снимается проверенной стратегией: круг + лицо + 1–2 сильных якоря (уникальный цвет, деталь-хук), как сделаны Kirby, Pikachu, Slime, Fall Guys. Это «своё на базе знакомого» — не кот, но и не непонятное.
Яйцо/непонятное — проваливает мгновенную любовь, но это идеальная стадия 0: из яйца вылупляется твой блоб. Крючок «что вырастет» добавляется почти бесплатно и работает на прогрессию.
Первый герой — своё округлое существо по детской схеме: плоские 2D-глаза-текстурой + пара блендшейпов на рот, один мемный якорь. Эволюция из яйца — как стадия 0 сверху.
Если приоритетом станет мгновенная виральность — сильный альтернативный путь стилизованный кот; если максимальная привязанность и «нужность» — собака. Матрица не отменяет твой выбор, она делает его зрячим: теперь видно, чем именно ты платишь за каждый вариант.
Выбор сделан в пользу знакомого: фавориты — кот и пёс, в духе Pixar. Риск «ещё один кот/пёс» принимаем и отбиваем обаянием, характером и живостью. Но знакомое животное сразу поднимает вопрос производства — и на нём стоит остановиться отдельно.
«Pixar-дух» в вебвью раскладывается на три производственные оси — и они радикально разные по цене. Две почти бесплатны, одна — реальный потолок.
Выразительная морда — вопрос рига и арта, не производительности. Плоские 2D-глаза-текстурой + пара блендшейпов на пасть/брови дают огромный эмоциональный диапазон почти даром. Сюда идёт главная любовь — и вебвью тянет это легко.
«Милота Pixar» = утрированная детская схема: крупная голова, большие глаза, короткие лапки, мягкий силуэт. Стилизованное low-poly тело с такими пропорциями весит столько же, сколько реалистичное, — а обаяния даёт в разы больше. Стены нет, есть работа арт-директора.
Прядевый груминг, shell-слои, hair-cards — прозрачные слои, жрущие fillrate (overdraw) и draw-calls. Цена не в загрузке, а в рендере кадра. На десктопе летает; риск — на слабом мобильном GPU в вебвью. Для одного героя на современных телефонах — стретч-вариант под бенчмарк, не закрытая дверь.
Мех — не геометрией, а текстурой: painted-fur карта + пушистый контровой ободок (Fresnel rim-light) + пара геометрических «клочков» на ушах и хвосте для намёка. Читается пушистым, стоит копейки. Ближе к «настоящему» животному.
Намеренно без меха: винил-тойс, плюшевая игрушка, гладкая стилизация в духе Animal Crossing. Не компромисс, а сильный тренд и отдельное обаяние — плюшевого котика хочется тискать не меньше. Проблема шерсти снимается целиком.
Обаяние Pixar — это не разрешение шерсти, а пропорции, глаза, мимика, свет и анимация. Мех — последние 5% картинки, которые в вебвью не окупаются. Берём твоего кота или пса с утрированными пропорциями и очень живой мордой, а шерсть решаем путём А или Б — и получаем Pixar-заряд, который платформа переживёт.
Модели ниже крутятся прямо здесь — нажми ▶ и тащи мышью/пальцем. Внешние арты и живые демо — ссылками.
Тот же shell-мех, но уже на коте — крути вживую. Слева реалистичный (тяжёлый, 174k полигонов только на мех — это «планка цены»), справа стилизованный мультяшный (ближе к нашему луку). Наш кот будет между: стилизованный силуэт + параметрический мех, притюненный ползунками под телефон.
Максимальная детская схема: огромные низко посаженные глянцевые глаза с ярким бликом-искоркой (главный носитель эмоции и «живости»), крошечные нос и рот, розовые щёчки, мягкий круглый контур, ноль резких линий. Глаза — звёзды, мех — оправа: вокруг глаз и мордочки шерсть короткая и чистая, чтобы взгляд читался. Техника: большие глаза как 2D-текстура/шейдер с бликом + блендшейпы на моргание и эмоции — дёшево и максимально выразительно.
То, что вебвью тянет идеально. Смотри на формы, пропорции и мягкий матовый материал.
Мех не геометрией, а контровым ободком (Fresnel) + painted-normal + редкими клочками. Открой живое демо ободка — вот она «пушистость» без прядей.
Важно: на десктопе демо летает — мощный GPU ест мех не замечая, и загрузка тут ни при чём. Цена прячется в рендере каждого кадра: shell-слои перерисовывают меш 16–32 раза, и каждый пиксель под мехом закрашивается столько же раз (overdraw/fillrate). Это бьёт только по слабому мобильному GPU в вебвью Telegram — там, где мы живём, а не на компьютере. Плюс демо — один простой объект, а у нас персонаж + сцена. Вердикт не «никогда»: мех на одном герое, умеренные слои, современные телефоны — стретч-вариант под бенчмарк на реальном телефоне (этап прототипа), а не закрытая дверь.
База — гладкий плюш: MeshToonMaterial с gradientMap в 2–3 ступени (тёплая мягкая ступень = намёк на подповерхностное свечение), высокий roughness, ноль металла, никакой прозрачности. Опционально +пушистость: тёплый Fresnel-ободок по силуэту + painted-fur normal-map + 10–30 alpha-клочков на ушах и хвосте (через MeshSurfaceSampler + InstancedMesh, один draw-call). Почти бесплатно — холодный старт 1–3 сек жив.
Что копировать у эталонов (My Talking Tom — 500 млн+ загрузок; коты Animal Crossing): детская схема (крупная голова, большие низкие глаза, маленький нос), округлые силуэты без острых углов, мягкий 2–3-ступенчатый toon-свет, тёплый ободок. Pixar-заряд = пропорции + глаза + свет, а не шерсть.
Комната — это не фон, а движок поведения. Разница между мёртвой диорамой-одевалкой и живым террариумом в одном: каждый предмет должен менять то, что кот ДЕЛАЕТ. Купил мячик — гоняет и раскидывает; поставил коробку — прячется и выглядывает; лежанку — спит. Мир не украшается, а оживает с каждым вложением. И, что важно для нас, есть проверенный геймдизайн-паттерн, который делает это дёшево и бесконечно расширяемо.
Ключевая находка ресёрча. Именно этот паттерн из The Sims, а не ручное программирование реакций кота, даёт экспоненциальную живость на минимум кода.
Гениальность в инверсии: логика живёт не в коте, а в предметах. В The Sims каждый объект «рекламирует» (advertisements), какие потребности он закрывает и на сколько очков: кровать вещает «поспи на мне → +энергия», холодильник — «поешь → +голод». Персонаж просто собирает все «рекламы» вокруг и выбирает — но не тупо максимум, а случайно из топ-2–3, отчего и рождается непредсказуемость и «характер».
Перенос на кота почти дословный. Каждый предмет комнаты публикует, что он предлагает:
Каждые несколько секунд кот прогоняет простой цикл:
Смотрит все предметы в комнате и их предложения.
×множитель текущей потребности (сонный → лежанка взлетает; скучающий → мячик) + новизна + близость.
Случайно из топ-2–3 вариантов — отсюда «характер» и непредсказуемость.
Привязанная анимация. Действие меняет состояние предмета → новая реклама → новая сцена.
Новая выходка = новый ассет + одна строчка «рекламы», ядро кота не трогается. Непредсказуемость даётся бесплатно, а поведение само подстраивается под то, что игрок купил и поставил — это и есть ощущение живого террариума. И это же напрямую кормит бардак-механику: поиграл → мячик раскидан → новое состояние → новое поведение → «что он тут устроил».
Принцип Neko Atsume — «предмет = свой персонаж поведения». Не число предметов создаёт живость, а то, что каждый запускает КАЧЕСТВЕННО разную выходку. Шесть штук покрывают все потребности и легко влезают в мобильный бюджет.
| Предмет | Поведение / выходка | Тип |
|---|---|---|
| 🍲 Миска (еда+вода) | Приходит, ест; отказывается когда сыт или однообразно. База заботы. | баллы |
| 🧶 Мячик | Играет, гоняет и раскидывает → порождает уборку и следующую выходку. Главный генератор живости. | баллы |
| 📦 Картонная коробка | Залезает, прячется, выглядывает. Максимально «котно», дёшево, мемно-шерабельно. | баллы |
| 🛏️ Лежанка / подушка | Спит, сворачивается, «намял место». Спокойные тёплые кадры, восстановление энергии. | баллы |
| 🪵 Когтеточка | Точит когти характерным циклом; без неё — дерёт мебель (поведение-стейк). | поведение |
| 🪟 Окно с видом | Смотрит наружу, реагирует на реальные утро/ночь/дождь. Cozy-якорь + кусочек «сожителя». | Telegram-контекст |
Каждый запускает своё: ест / играет-раскидывает / прячется / спит / точит / наблюдает — все базовые потребности закрыты, и каждый предмет узнаваемо кошачий. Окно — отдельно вкусное: кот реагирует на реальное время суток и погоду (через геолокацию), и это уже первый шаг к «питомцу, который живёт в твоём Telegram».
Шесть предметов выше — это игрушки и нужды кота. Но кот живёт не на голом полу: нужна настоящая комната — диван, полки, картины, ковёр, растение, тёплая лампа. И ключевое: эта обстановка не просто декорация — бОльшая часть её сама работает умными объектами и сценой для бардака.
Запрыгивает, спит на спинке, точит подлокотник, прячется под ним.
Залезает наверх и скидывает предметы вниз — классика кошачьего хаоса, мемно и шерабельно.
Запрыгивает, роняет чашку, разваливается сверху.
Заденет — висит набок, пока не поправишь. Мелкая, но живая выходка.
Живая деталь + тёплый свет уюта. Растение кот может погрызть/повалить.
Тепло, обжитость, мягкость. Шторами кот играет/запутывается.
Характер комнаты. Их смена — кастомизация и бренд «мой уют».
Сменил стиль всей комнаты → своё пространство → повод показать друзьям.
1. Бардак получает сцену. Не «раскидал мячик», а живёт по всей комнате: скинул книги с полки, сбил картину набок, уронил чашку, запутался в шторах, повалил растение. Каждая единица мебели через умные объекты добавляет свой набор выходок. 2. Комната = самовыражение = виральность. Смена дивана, картин, темы — это кастомизация за Stars И та самая сцена, куда придут коты друзей: «смотри, какой у меня уют».
Бюджет держим так: декор (картины, ковёр, растение, шторы) — дешёвая статика, создаёт уют почти даром; интерактивной мебели для первого релиза берём 2–3 ключевые (диван, стеллаж, столик) — они и умные объекты, и сцена бардака. Так комната ощущается настоящей и обжитой, но ассеты не взрываются.
Вот направление обстановки — стилизованные уютные комнаты в low-poly, тёплый свет, диван/полки/декор. Нажми ▶ и покрути. Наша будет камернее (одна комната под кота), но язык — вот такой.
Наш формат — уютная диорама: объёмный обжитой мирок, в который заглядываешь сверху-сбоку, как в кукольный домик или витрину-террариум. Идеальная форма для нас: «живой террариум», сделанный буквально + камерный кадр (легко для вебвью) + «tiny cozy world» врождённо милый и шеро-достойный.
Важно про размер: диорама — это про подачу (открытый передок, тёплый свет, весь мирок в кадре), а НЕ про буквальную миниатюрность. Берём не спичечный коробок, а просторную обжитую комнату — где коту есть где разгуляться и бедокурить (диван, полки, окно на расстоянии). Обаяние «маленького мирка» рождается стилем и светом, а не тем, что всё мелкое.
Камера подвижная, а не застывший кадр: по умолчанию видишь всю комнату; можешь орбитить/панить/зумить (+ гироскоп — наклон поворачивает и параллаксит, заглянуть за угол); зум к коту — крупный план морды с глянцевыми глазами, и он же лечит читаемость мимики, когда кот далеко. Рекомендация подачи — открытый передок (пара стен срезана), как у кукольного домика.
Уют — не случайность, а три столпа (рамка Lost Garden / Project Horseshoe). Все три ложатся на нашу сцену.
Ни угроз, ни принуждения, ни потерь. Всё добровольно и предсказуемо. Для кота: никакого фейла — только забота. Стейки есть, но обратимые (см. таб питомца).
Базовые нужды видимо закрыты — полная миска, тёплый свет, обжитость. Тогда игрок переходит к высшему: самовыражение и привязанность.
Медленный темп, камерный масштаб, мягкий свет. Низкое возбуждение при сохранении вовлечённости — за котом просто приятно смотреть.
Конкретные приёмы уюта для нашей одной сцены: тёплая палитра (жёлтые/оранжевые) и мягкий рассеянный свет вместо резких источников; натуральные материалы — дерево, живое растение; камерный, чуть приподнятый ракурс на одну комнату. И классический приём — окно как контраст-убежище: дождь или вечер за окном при тёплой комнате внутри. Комната = укрытие от внешнего мира, и это ощущение само по себе греет.
Мы решили ещё в табе питомца: зрелищность живёт в свете, а не в полигонах. В диораме это буквально так — свет отличает «коробку с мебелью» от «уютного дома». Он делает четыре работы.
Тёплый, мягкий, мотивированный свет (от лампы, из окна), тёплая палитра, рассеянные тени. Именно это превращает набор мебели в обжитой дом.
Свет задаёт эмоцию всей сцены: золотой вечер — тепло и покой, синяя ночь с пятном лампы — уют перед сном. Одна и та же комната звучит по-разному.
Свет комнаты меняется с реальным временем и погодой: мягкое утро, золотой вечер, сумерки, пасмурный дождь с тёплой лампой. Комната дышит вместе с твоим настоящим днём — сильнейший штрих «жизни в твоём Telegram».
Контровой свет отделяет пушистого кота от фона и подсвечивает мех по краю (тот самый Fresnel-пушок), а блик в глазах (catch-light) — та самая искра «живости».
Технически — дёшево и роскошно: запечённые лайтмапы для статичной комнаты (мягкие тени и рассеянный свет «впечены» в текстуры, ноль стоимости в рантайме — стандарт красивых веб-диорам) + пара живых источников (лампа, свет из окна) + мягкий ключ на коте. Смена времени суток — блендим лайтмапы и тонируем общий свет, двигаем и красим главный источник. Блик в глазах — крошечная деталь ценой в пиксель, а работает как «оживление».
Одна из сильнейших фишек всего продукта. Не игровое время, а твоё реальное локальное — комната и кот проживают тот же день, что и ты. Четыре нити синхронизируются с часами и погодой за окном.
| Фаза дня | 🌅 Свет | 🪟 Окно | 🐱 Кот |
|---|---|---|---|
| Утро | мягкий тёплый, низкое солнце | рассвет, розовое небо | потягивается, зевает, ждёт завтрак |
| День | яркий, ясный | солнце / реальная погода | активен, играет, бедокурит |
| Вечер | золотой, тёплый | закат | спокоен, ластится |
| Ночь | синий сумрак + пятно лампы | звёзды, тьма | спит калачиком у лампы |
Плюс погода через геолокацию: пошёл дождь по-настоящему — идёт и за окном, кот сидит и смотрит на струи. И ритуалы возврата: утренний пуш «доброе утро, кот проснулся», вечерний — «сворачивается спать». Часы кормёжки — ждёт у миски.
Магия в том, что это твой день. Заглянул в обед — там день и кот играет; поздно ночью — кот спит калачиком при свете лампы, тихо. Весь мирок дышит в такт твоей жизни — не игрушка, которую открываешь, а сожитель, живущий в твоём времени.
Технически дёшево: сервер знает реальное время и погоду (геолокация из таба SDK), делит сутки на 4 фазы → под каждую своё состояние света (блендим лайтмапы + тонируем) + веса поведения кота + слой окна. Никакой магии, чистая логика на бэкенде — том самом «мозге питомца», что считает жизнь между визитами.
Модель, проверенная в Neko Atsume и Pocket Love: двухвалютность — заработанные баллы (кот «дарит» их за заботу) на базовые предметы, Stars на премиум. Много бесплатных путей получить предмет (ежедневные подарки, опциональная реклама «для нетерпеливых») — без давления.
Главное правило, и оно же защита от провала (урок Dreamlight Valley, которую обвинили в «cash grab»): ядро живости — всегда за бесплатные предметы. Кот играет, спит, ест — за баллы. За деньги только украшение и ускорение: косметика, редкая мебель, сезонный декор. Косметика не влияет на баланс — она продаёт идентичность и самовыражение, а сезонные предметы продаются заметно лучше обычных.
И тут замыкается наш прежний узел: обустроенная комната — это та самая сцена, куда придут коты друзей. Декор = самовыражение = «смотри, какой у меня уют» = повод показать = виральность. Экономика, долгая цель и социальность сходятся в одной точке — в комнате.
Клик по предметам в R3F — это raycasting (готовые onClick/onPointerOver на любом меше, свой слушатель писать не надо); дорого на каждый кадр — значит кастим по клику/таймеру, для десятка пропов это вообще не узкое место. Состояния предметов (полный/пустой, целый/раскиданный) держим как данные в стейте — меняем материал/позицию/видимость под-меша, не пересоздавая геометрию. Это же состояние питает «рекламу» умных объектов.
Бюджет вебвью: главный враг — не полигоны, а draw-calls (каждый уникальный материал — отдельный вызов). Значит атлас текстур и общие материалы, минимум прозрачности. Ориентир — кот-«герой» ~5 000 треугольников, вся комната с ~6–12 пропами держится в несколько десятков тысяч при аккуратных материалах. Для первого релиза — фиксированные слоты под предметы (как 5 слотов двора в Neko Atsume), а не свободная расстановка: проще, надёжнее, быстрее в продакшене.
Одна уютная обжитая комната · 6 предметов-нужд + 2–3 интерактивные мебели (диван/стеллаж/столик) + дешёвый декор (картины/ковёр/растение) · движок «умных объектов» вместо ручных реакций · бардак живёт по всей комнате · тёплый свет + окно-убежище · живость за баллы, красота за Stars · фиксированные слоты.
Здесь всё сходится в конкретику. Цель — первый полноценный самодостаточный релиз: не демо и не задел, а завершённый опыт, который можно показать людям и который доказывает главную ставку — питомец живой, и в него влюбляешься. Ниже: что входит, что осознанно НЕ входит, в каком порядке лепим и когда считаем готовым.
Открываешь — и у тебя есть кот, которого хочется любить, в уютной живой комнате, проживающей твой день. Его можно покормить, поиграть, погладить, прибрать за ним бардак; он реагирует, бедокурит, меняется от утра к ночи. Этого достаточно, чтобы поймать «то самое» чувство и захотеть вернуться. Всё остальное (друзья, ИИ, коллекция) — надстройки фазы 2, без которых первый релиз уже живёт.
Главная защита от утопания — честная граница. Слева то, что делает первый релиз живым; справа то, что мы намеренно откладываем, чтобы не размазаться.
Пушистый, параметрический мех, морда по детской схеме с глянцевыми глазами. ~10–15 анимаций (слоистый idle + эмоции + реакции + выходки).
Одна просторная уютная комната, открытый передок, подвижная камера (орбита/зум/гироскоп). Запечённый свет.
6 предметов-нужд + 2–3 интерактивные мебели. Движок «рекламы» — кот сам выбирает поведение.
Свет + окно + поведение по 4 фазам суток, погода через геолокацию.
Покормить, поиграть, погладить (хаптика), прибрать бардак.
Пуш-возврат от бота обязательно; эмодзи-статус ИЛИ стикерпак — один twist-канал.
Состояние на сервере, пересчёт по timestamp, баллы за заботу на базовые предметы.
Большая соц-фича — отдельная фаза, когда ядро доказано.
Платный слой фазы 2. В v1 — рукотворная база поведения.
Одна комната заморожена. Расширение — потом.
Один кот. Зоопарк и эволюция — фаза 2.
Можно в v1.1. Сначала баллы и базовая петля.
Отдельный продукт на том же движке, сильно позже.
Строго по твоей логике: сперва персонаж, потом комната. Но с одним обязательным шагом в самом начале — бенчмарком меха, пока на него не завязано всё остальное.
Кот-болванка с параметрическим shell-мехом → гоняем на целевом среднем телефоне в Telegram. Ловим 60 fps и старт, фиксируем бюджет density/length/quality. Если не сядет — включаем faux-fur (Fresnel). Делаем ПЕРВЫМ, чтобы не переделывать.
Blender: модель (mesh) → риг (скелет + блендшейпы лица) → мех → материалы (toon + мех, короче у морды) → набор анимаций (слоистый idle, эмоции, реакции, выходки). Главная инвестиция проекта.
Blender: мебель + декор (2–3 интерактивные, остальное дешёвая статика) → запекание света на 4 фазы суток (лайтмапы) → камера (орбита/зум/гироскоп).
«Реклама» действий + состояния предметов + привязка анимаций кота к предметам. Тут оживает бардак-механика.
Фазы света/окна/поведения по реальному времени + погода + ритуалы-пуши.
Состояние на сервере, пересчёт по timestamp, бот-пуши, баллы. Деплой на инфраструктуру.
Хаптика, звук, блик в глазах, мягкие переходы. Первые 60 секунд онбординга — чтобы «то самое» ловилось сразу.
Вся ставка на «питомец живой». Снимаем: львиная доля сил — в морду, мимику и анимацию; проверка на живых людях РАНО (не в конце), до вылизывания остального.
Снимаем фазой 0: ранний бенчмарк + параметрические ползунки + faux-fur как страховка. Не закладываем мех в остальное, пока не подтверждён.
Снимаем: бюджет ассетов (кот ~5k тр, атлас текстур, минимум материалов), запечённый свет, ленивая догрузка, стилизация вместо тяжести.
Снимаем жёсткой границей слева/справа. Любая новая идея по умолчанию — фаза 2, пока первый релиз не живёт.
Релиз готов не когда «сделаны все фичи», а когда проходит эти проверки.
Кот живой, морда цепляет, хочется просто смотреть. Живые люди в тесте улыбаются и хотят вернуться.
Свет и поведение меняются от утра к ночи, кот реагирует на тебя и бедокурит, зашёл после паузы — что-то натворил.
Старт ≤3 сек, приемлемый fps на целевом телефоне, пуш от бота реально возвращает в апп.
Пушистый кот, которого хочется любить, живёт свой день в уютной диораме — реагирует, бедокурит, зовёт обратно. Этого достаточно, чтобы поймать чувство. Всё остальное — фаза 2.
Основано на решениях табов 1–4: ниша «питомец ради эмоции» (01), возможности и рамки Telegram (02), герой-кот с параметрическим мехом (03), живая диорама с умными объектами и живым днём (04). Детальный план работ — в соседнем подтабе «В чём и где».
Разбивка всего продакшна по дисциплинам: каждая задача — чем и где делаем и что на выходе. Несущий пайплайн: 3D-часть лепим в Blender → экспорт в glTF/GLB → оживляем в вебе на React Three Fiber → «мозг» на бэкенде. Стек намеренно совпадает с твоими проектами (React/Vite, Hono, grammY, PostgreSQL, VPS) — меньше нового, быстрее старт.
Ускоряемся ИИ-генерацией (Higgsfield прямо в Blender / Meshy) — с разделением. Предметы, мебель, декор и комната (жёсткая статика) — генерим и слегка чистим: огромная экономия и точное попадание в лук. Кот-герой — генерим БАЗУ/концепт для скорости и образа, но риг + блендшейпы + анимации остаются крафтом (он должен деформироваться и эмоционировать — на этом вся ставка). Мех — рантайм-шейдер поверх, не из генерации. Важно: сперва концепт-картинка (мудборд) фиксирует стиль, затем всё 3D под неё — иначе ассеты не склеятся. Higgsfield гонится прямо в Blender-сцену (интегрировано), Meshy — запасной источник.
| Задача | В чём (инструмент) | Выход |
|---|---|---|
| Модель, low-poly ~5k тр | Blender (моделинг) | .blend → GLB |
| UV-развёртка | Blender | UV-раскладка |
| Текстуры: toon base + painted-fur (normal/roughness) | Substance Painter или ручная роспись в Blender/Procreate | PNG-карты |
| Мех — параметрический shell | Blender (референс) + рантайм-шейдер в R3F (GLSL, по мотивам fur-threejs) | шейдер + ползунки |
| Риг: скелет + кости ушей/хвоста | Blender (Rigify / кастом) | арматура в GLB |
| Мимика — блендшейпы | Blender (shape keys) | морф-таргеты |
| Глаза: 2D + блик-искра | спрайты в Procreate/Figma + шейдер (UV-swap) в R3F | атлас глаз + шейдер |
| Анимации ~10–15 (idle-слои, эмоции, реакции, выходки) | Blender (кейфрейм) | клипы в GLB |
| Дыхание / моргание | процедурно в R3F (кости/шейдер) | код |
| Задача | В чём | Выход |
|---|---|---|
| Комната (открытый передок) + мебель (2–3 интерактивные) | Blender | GLB |
| Декор-статика (картины/ковёр/растение/шторы) | Blender + готовый cozy-кит как база (Sketchfab/Fab) | GLB |
| Свет: запекание лайтмапов на 4 фазы суток | Blender (Cycles bake) | 4 набора lightmap-текстур |
| Атлас текстур (минимум draw-calls) | Blender / texture atlas | атлас |
| Задача | В чём |
|---|---|
| Каркас приложения | React + Vite + TypeScript |
| 3D-сцена, загрузка GLB, лайтмапы | React Three Fiber + Three.js + drei |
| Камера: орбита/зум/пан | drei (Controls) + жесты |
| Гироскоп (наклон → параллакс диорамы) | Telegram Gyroscope API (Bot API 8.0) |
| Мех-шейдер (shell, параметрический) | кастомный материал Three.js (GLSL) |
| Движок умных объектов («реклама» действий) | TypeScript-логика |
| Живой день (4 фазы: свет+окно+поведение) | клиент + сервер, блендинг лайтмапов |
| Стейт приложения | Zustand |
| Звук (мяу, мурлык, шорохи) | Howler.js / Web Audio |
| Хаптика (тактильное мурлыканье) | Telegram HapticFeedback API |
| TMA-интеграция: статус, шеринг, сенсоры | Telegram WebApp SDK (@telegram-apps/sdk) |
| Задача | В чём |
|---|---|
| API + состояние питомца | Hono (Node.js) — как в твоих проектах |
| БД: состояние, баллы, инвентарь предметов | PostgreSQL |
| Пересчёт «жизни между визитами» по timestamp | серверная логика |
| Бот + пуши-возврат | grammY (long-polling; +прокси, т.к. api.telegram.org с VPS в РФ заблокирован) |
| Погода для живого дня | внешний Weather API по геолокации |
| Платежи (Stars) — позже | Telegram Stars API (через Fragment на десктопе) |
| Задача | В чём / где |
|---|---|
| Хостинг | VPS (твой, vdsina) |
| Веб-сервер (статика SPA) | nginx + Mini-App CSP |
| Процессы (API, бот) | PM2 |
| Деплой | rsync / scp |
| Домен + регистрация Mini App | поддомен rkvartalnov.ru + Menu Button в @BotFather |
Figma — UI и 2D-ассеты (глаза, иконки). Midjourney / концепт-арт — мудборд и референсы кота перед моделингом (не в продакшн, а для попадания в образ). Meshy (опц.) — быстрая болванка меша как старт для скульпта. GitHub — версионирование (в отличие от текущих проектов — стоит завести с нуля).
Blender (модель · риг · блендшейпы · анимации · запекание света) → экспорт GLB + лайтмапы → React Three Fiber (рантайм-сцена, мех-шейдер, умные объекты, живой день) → Hono + PostgreSQL (состояние, пересчёт, баллы) → grammY (бот, пуши-возврат) → VPS · nginx · PM2 (деплой). Всё, кроме GitHub, — уже знакомый тебе стек.
Фаза 0 в Blender + R3F: кот-болванка с параметрическим мехом → экспорт GLB → сцена R3F → сборка в Telegram Mini App → бенчмарк на реальном телефоне. Пока мех не подтверждён на устройстве — остальное не лепим.
План производства отвечает на одно требование: первый результат, который ты видишь, — уже тот самый. Каждый показ — финальное качество своего слоя: ключевой арт — финальный ключевой арт, блокаут — финальная геометрия с точными размерами, кот в стенде — финальный кот в финальном свете на твоём телефоне.
Всё про внешний вид решается на картинках до 3D. Дальше 3D не ищет, а воспроизводит утверждённую картинку и проверяется по ней численно.
Кот — ядро продукта, поэтому весь его арт делается на самой сильной модели с первого кадра. Дешёвые модели для решений о внешности не используются: они хуже держат точность по описанию и хуже сохраняют одного персонажа между кадрами. Экономии тут нет — при бюджете 3000 кредитов в месяц это 340 кадров высшего качества.
Каждую генерацию я сначала проверяю по паспорту: пропорции наложением схемы, палитра по цвету, читаемость на маленьком размере, запреты. Ты видишь 2–3 финалиста с разбором — никогда сырой поток.
Настройка инструментов — формулировки для Meshy, рецепт запекания, замер меха — идёт на служебных объектах и не выдаётся за результат.
До массового производства одна чашка проходит всю цепочку: концепт → 3D → текстура → «стоит / упала» → свет → телефон. Рецепт фиксируется и повторяется для остальных вещей, а не изобретается заново.
3D показывается не серым в Blender, а в стенде на телефоне — в свете фазы суток, с правильным цветом.
Каждая генерация записывается с вердиктом. Удачный рецепт в момент первого прохода становится навыком — второй раз уже не ищем.
| Стадия | Что делаем | Гейт | Решает |
|---|---|---|---|
| К1 Ключевой арт | широкий поиск направлений сразу на сильной модели → отбор по паспорту → доводка выбранного на ней же. Стиль — мягкий стилизованный 3D-рендер «как игрушка», мех массами: картинка должна выглядеть как будущий кадр, иначе 3D её не повторит | голова 40–50% роста · глаза по схеме · кисточки, грива, хвост · окрас · силуэт узнаётся на 64 px · характер без подписи | ты, из 2–3 |
| К2 Лист эмоций | 10 выражений из утверждённого арта | каждое узнаётся на 128 px · язык тела без ловушек | ты |
| К3 Разворот | виды спереди, сбоку, сзади, ¾ | одинаковые пропорции и рисунок ±5% | я |
| К4 3D-база | дешёвая проба → два финальных прогона → лучший | силуэт с 4 ракурсов совпадает с разворотом на 90%+ | я; тебе — вращение в стенде |
| К5 Чистка и сетка | зеркалирование, масштаб, глаза-сферы, петли вокруг глаз и рта | асимметрия < 1% · автопроверка Д4 | я |
| К6 Окрас | буква «М» на лбу, полосы, белая манишка, «снегоступы», маски меха | цвет совпадает с паспортом и артом | я |
| К7 Лицо | ~20 форм лица, глаза с глубиной и бликами | 10 эмоций К2 повторяются в 3D | ты |
| К8 Скелет | ≈ 50–60 костей, имена по контракту | позы сидит / буханка / калачик / прыжок без заломов | я |
| К9 Мех | слои по зонам: грива, «штаны», хвост, кисточки | цвет · 60 кадров на Galaxy среднего класса | ты, на своём телефоне |
| К10 Анимация | 24 клипа первого релиза, числа из конфига Д3 | петли без шва · лапы не скользят | я |
| К11 Приёмка | выгрузка, сжатие, автопроверка | кот ходит, прыгает по лесенке, моргает — на телефоне | ты: «кот живой» |
| Стадия | Что делаем | Гейт | Решает |
|---|---|---|---|
| П1 Блокаут | финальная геометрия по канону: пол, стены, окно, мебель по лесенке, места кота; в стенде вместе с болванкой кота | голова кота в кадре ≥ 40 pt · видны все зоны · высоты = прыжки | ты: планировка |
| П2 Стилевой кадр | 2D-кадр хюгге-комнаты точно поверх ракурса блокаута — картинка ложится на нашу геометрию — с утверждённым котом | палитра · контраст кота с фоном · запреты | ты |
| П3 Лист предметов | все ~16 вещей одной картинкой — так они гарантированно из одного мира | единый язык форм · читаются в кадре «зона кота» | ты |
| П4 Сквозной эталон | чашка проходит всю цепочку до телефона; рецепт фиксируется | все проверки · роняется и возвращается тапом | я; тебе — чашка в стенде |
| П5 Все предметы | мебель с точными размерами — моделирую в Blender по лесенке; органика и мелочь — Meshy по вырезкам с листа | бюджеты · общая палитра · силуэт совпадает с листом | я; тебе — комната целиком |
| П6 Свет | 4 фазы суток запекаются в Blender по рецепту Д5, окно тремя слоями с параллаксом | цвет совпадает с Blender · кот контрастен в каждой фазе | ты: 4 фазы на телефоне |
Почему мебель не через генерацию: лесенка требует точности ±5 см, а генерация даёт приблизительную форму — подгонка съела бы больше, чем моделирование по размерам. Meshy берёт то, где важна форма, а не размер. Финал — С1 «первый живой кадр»: кот в комнате ходит, прыгает по лесенке, роняет чашку, ты возвращаешь её тапом, фазы суток сменяются — на твоём телефоне.
Эталон-кадры Д9 собираются из уже утверждённых кота и стилевого кадра комнаты и сразу становятся «северной звездой» для 3D. Первый показ — финальный.
Эталоны генерируются по описанию. В них будет «какой-то кот», не наш, — это и есть пробный результат, которого хотим избежать.
Кредиты Meshy на всё производство — около 600–860 из 3000 в месяц; перед каждой пачкой проверяю баланс и спрашиваю тебя. Планка приёмки героя: не «сойдёт», а «да, это он» — число заходов бюджетом не ограничено.
В проекте 21 готовый навык — проверенные инструкции для Blender, React Three Fiber и сборки 3D для браузера. Правило: перед каждой стадией загружаются её навыки, работа идёт по ним; если навык расходится с нашим каноном — побеждает канон. Удачный рецепт, найденный впервые, сразу становится нашим собственным навыком.
| Стадия | Навыки |
|---|---|
| Генерация кота в Meshy (К1–К4) | рецепт проекта → свой навык «кот в Meshy» после К4 |
| Чистка сетки, блокаут комнаты | blender-mcp, blender-assembly |
| Окрас, развёртка, запекание света | blender-uv-texturing |
| Формы лица, анимация | blender-animation, animation-quality-gate |
| Скелет | blender-mcp → свой навык «скелет кота» после К8 |
| Мех | r3f-shaders, r3f-geometry, r3f-materials |
| Выгрузка и сжатие | blender-export, web-3d-asset-pipeline, r3f-loaders, r3f-textures |
| Тест-стенд, сборка сцены | react-three-fiber-game, r3f-fundamentals, r3f-interaction, r3f-lighting, r3f-animation, game-playtest |
Паспорт героя — единственный источник правды для всех этапов создания кота. Каждая генерация проверяется на соответствие ему, поэтому она становится проверкой, а не поиском. Там, где нужен вкус, — варианты с разбором и рекомендацией; решение за тобой.
Пушистый котёнок мейн-куна — добродушный неуклюжий великан с кисточками на ушах. Проживает твой день у тебя в Telegram: ходит за тобой как собака, чирикает на птиц за окном и лезет лапой в миску с водой. Бедокурит не со зла — и сам первым прибегает мириться.
Кот — носитель пяти механик продукта. Каждое решение ниже проверяется против них.
| Роль | Что требует от героя |
|---|---|
| Эмоциональный центр | «нужность» и ласка: тянется к игроку, радуется ему |
| Генератор бардака | проказливость: трогает, роняет, лезет куда не надо |
| Двигатель виральности | комедийная выразительность, «мемный» момент |
| Сожитель, живой день | ритм суток: утром потягушки, днём шалости, вечером ласка, ночью сон |
| Прощающий дизайн | бардак не выглядит злым, последствия — милые |
Внешность решена, нрав — нет. От нрава зависят поза и выражение по умолчанию, репертуар выходок и силуэт. Оценка по пяти ролям (максимум 25).
Бардак случается сам: полез посмотреть, задел, уронил, сам испугался. Снимает вину — главный риск тамагочи.
Роняет нарочно с хитрым прищуром, потом ластится. Самый мемный, но может раздражать.
Важный, ленивый, сдержанный. Смешной контраст, но мало бардака и «нужности».
Очень милый и робкий, вызывает заботу, но мало действия и комедии.
«Любопытный неуклюжка с хитринкой». Мейн-кун по натуре добродушный великан: любопытный, игривый, ходит за хозяином. Большой неуклюжий котёнок задевает всё хвостом и лапами-снегоступами — естественный носитель случайного бардака. Изредка — мемный бит: смотрит в камеру и медленно сталкивает чашку с полки. Подписи: наклон головы · ходит за пальцем игрока · медленное моргание (доверие) · трели и чириканье вместо мяуканья · лапа в миске с водой · «кто, я?» после бардака.
Цифры измеримы — по ним проверяются ключевой арт, разворот и 3D-база. H — высота головы, W — ширина головы по щёчному жабо.
| Параметр | Значение | Зачем |
|---|---|---|
| Полная высота в стойке (лапы → кончики ушей) | ≈ 2,2 H → голова ≈ 45% роста | детская схема |
| Ширина головы W | ≈ 1,15 H | «круглость» |
| Ширина груди | 0,9–1,0 W | голова не уже тела |
| Длина тела (сбоку) | ≈ 1,4 H | компактность |
| Видимая длина лап / лапы-«снегоступы» | ≈ 0,45 H / диаметр ≈ 0,32 H, пучки между пальцами | неуклюжесть, породный якорь |
| Диаметр глаза / промежуток | ≈ 0,24 W, слегка овальные / ≈ 0,9 глаза | главный носитель эмоции |
| Центр глаз по высоте | ≈ 55% от макушки | детская схема |
| Морда, нос, рот | чуть квадратнее, светлая «муфта»; нос ≈ 0,07 W; «ω» ≈ 0,14 W | порода, но мягко |
| Уши + кисточки | высота ≈ 0,5 H, основание ≈ 0,38 W; кисточки ≈ 0,15 H, толстые | силуэт «рысь», мемный якорь |
| Грива-жабо / хвост | грива расширяет силуэт ~20%; хвост 1,4 H, плюмаж ≈ 0,55 H, кольца | львиный силуэт, енотовидный хвост |
| Размер в мире | ≈ 0,5 м — мейн-кун крупная порода | читаемость на телефоне |
Язык форм: главная форма — круг (голова-шар в гриве, тело-боб, лапы-капли, хвост-плюмаж), кисточки — толстые «языки пламени», острых углов нет, ритм «большое — малое — большое». Тест силуэта: узнаётся чёрным силуэтом на 64 px в трёх позах — кисточки, грива и хвост работают как подпись.
Критерии: выделяется на фоне тёплой комнаты, помогает читать мимику, узнаётся как мейн-кун, ложится на мех-шейдер. Рисунок для всех вариантов — крупный упрощённый табби: «M» на лбу, полосы на щеках, подводка глаз, 3–4 полосы на боках, кольца на хвосте. Без мелкого тиккинга и мраморности.
Серебро, чёрные полосы, белая грудка и лапы, зелёно-золотые глаза. Холодный на тёплом — максимальный контраст; тёмная подводка и «M» делают мимику читаемой.
Самый узнаваемый мейн-кун: тёплые коричневые полосы, белая грудка, золотые глаза. Тёплый на тёплом — сливается, понадобится холоднее палитра комнаты.
Мем «рыжий кот», очень узнаваем, но тонет в тёплой комнате.
Драматично и красиво, но тёмная морда съедает мимику — главный риск для нашего героя.
Отдельные сферы, слегка овальные; крупная радужка (~70% глаза), зелёная с золотым кольцом; природная тёмная «подводка» табби; без ресниц.
Круглый по умолчанию, щель — только в «хитром» бите. Расширение 0,4 (спокоен) → 0,9 (восторг, испуг, просьба).
Крупный сверху-слева + маленький снизу-справа, всегда в сторону камеры.
Shape keys: моргание, полусонный, прищур радости, широко открытые.
Львиная грива-жабо (щёки, шея, грудь), хвост-плюмаж, лохматые «штанишки», «юбка» на животе, мех внутри ушей, пучки между пальцами. Кисточки ушей — отдельные толстые формы.
Спина, бока, макушка.
Вокруг глаз, спинка носа, светлая «муфта», подушечки — чтобы мимика читалась.
От носа назад и вниз; на гриве — веером от центра морды; на хвосте — к кончику.
Проверка: каждая эмоция узнаётся по картинке 128 px без подписи.
| Эмоция | Глаза | Зрачок | Рот | Уши | Хвост и тело |
|---|---|---|---|---|---|
| Любопытство (по умолчанию) | открыты | 0,5 | закрыт | вперёд | наклон головы |
| Радость | прищур «^ ^» | 0,6 | улыбка | вперёд | хвост вверх крючком |
| Доверие | медленное моргание | 0,5 | лёгкая улыбка | расслаблены | лежит, лапы подобраны |
| «Кто, я?» | широко | 0,85 | виноватая улыбка | чуть назад | застыл |
| Испуг | распахнуты | 0,95 | приоткрыт | «самолётом» | хвост ёршиком, прыжок |
| Сонливость | полуприкрыты | 0,5 | зевок | расслаблены | буханка |
| Хитрость (редко) | прищур одного | щель | ухмылка | вперёд | лапа на предмете, взгляд в камеру |
| Обида v1.1 | в сторону, взгляд через плечо | 0,5 | надутые щёки | чуть назад (не в стороны — это читается как боль) | сидит спиной, кончик хвоста подёргивается |
| Просьба | огромные | 0,95 | закрыт | вперёд | сидит столбиком |
| Азарт у окна | прикованы к птице | 0,9 | чирикает, дрожит челюсть | вперёд | кончик хвоста подёргивается |
Позы-подписи: буханка · калачик сна · потягушка · столбик · лапа на краю полки · лапа в миске с водой · наклон головы · игровая стойка · на спине · у окна, чирикает на птиц. Голос: трели и чириканье — фирменный голос мейн-куна вместо мяуканья («мрр-р?» — вопрос и приветствие, трель — радость); громкое мурлыканье с мягкой вибрацией; шипения нет.
8–12 тыс. треугольников + глаза отдельно; кольца вокруг глаз, «ω»-рот, петли суставов, кольца живота и хвоста.
Нейтральная стойка, просветы между лапами, хвост не касается тела, рот закрыт, морда по +Z.
Rigify Cat → чистый деформ-риг, ≤ 4 влияния, 50–70 костей. Через API Meshy не ригается.
~20 shape keys (включая трель); оболочки меха с картами длины и зачёса из Blender; рисунок табби — цветовая карта меха; кисточки — 2–4 карточки на ухо + кость для подёргивания.
Пряди в геометрии (кисточки — только толстыми формами) · усы в сетке · прочие детали тоньше 2% роста · открытый рот в базе · острые углы и реализм · мелкий рисунок (тиккинг, мрамор) · ресницы, одежда, аксессуары · агрессия.
Голова 40–50% роста · глаза ниже середины, 22–26% ширины головы · мех массами · окрас по паспорту · мейн-кун узнаётся без подписи (кисточки, грива, хвост) · характер назван одним словом тремя людьми · силуэт на 64 px.
Глаза и пропорции одинаковы на всех видах (±5%) · просветы между лапами · хвост свободен · без теней и перспективы · ≥ 1024 px · рот закрыт.
Силуэт с 4 ракурсов совпадает с разворотом (IoU ≥ 0,9) · пропорции ±5% · асимметрия < 1% · сетка замкнута · бюджет граней.
Паспорт сцены — канон комнаты-диорамы. Он связан с паспортом героя: окрас кота задаёт палитру комнаты, характер — набор предметов, размер кота — масштаб и камеру.
Тёплая просторная комната-диорама — дом кота и маленький мир в твоём Telegram. Живёт в такт твоему дню, полна вещей, с которыми можно набедокурить, и её хочется показать друзьям.
| Роль сцены | Что требует |
|---|---|
| Сцена для бардака | предметы, которые можно уронить, раскидать, в которые можно залезть |
| Живой день | окно и свет по реальному времени и погоде |
| Фон для героя | кот всегда читается: контраст и свободные зоны вокруг него |
| Виральный кадр | любой момент — готовый скриншот, «мир в коробочке» |
| Самовыражение (фаза 2) | мебель, декор и темы комнаты меняются |
Атмосфера: три столпа уюта (безопасность, изобилие, мягкость) · убежище — тепло внутри против погоды снаружи · обжитость — плед сполз, книга открыта · тихий юмор — поцарапанный угол дивана, мячик под креслом.
Кот-мейн-кун ≈ 0,5 м, комната ≈ 2,6 × 2,6 м, экран телефона ≈ 390 pt по ширине. Сколько кот занимает на экране?
| Кадр | Ширина сцены в кадре | Кот | Голова | Глаз |
|---|---|---|---|---|
| Вся комната | ≈ 4,0 м | 49 pt | 22 pt | 6 pt — эмоцию не прочитать |
| Зона кота | ≈ 1,8 м | 108 pt | 49 pt | 14 pt — читается |
| Крупный план | ≈ 0,8 м | 244 pt | 111 pt | 31 pt — эмоция крупно |
Если по умолчанию показывать всю комнату, кот крошечный, и главная ставка — эмоциональная морда — пропадает. Поэтому по умолчанию камера показывает зону кота (~1,8 м) и мягко следует за ним; вся диорама — состояние «отъехать» для обзора, скриншота и обустройства; крупный план включается сам в эмоциональные моменты.
Критерии: понятность глобальной аудитории, уют, кот выделяется, круглые формы, реалистичный продакшн, виральность. Максимум 30.
Светлое дерево, текстиль, пледы, растения, гирлянда. Универсален и спокоен — кот главный.
Терракота, горчица, круглые формы, торшер-гриб. Очень мемно, но тёплое — кот может сливаться.
Котацу — кот прячется под столом-одеялом! Низкая мебель. Мемно для котов, но нишевее.
Скошенный потолок, круглое окно, балки — узнаваемый силуэт «гнезда». Сложнее по геометрии.
Ковёр на стене, сервант. Сильная ностальгия, но узко для глобальной аудитории.
Ретро, мансарда, котацу и бабушкина — готовые темы комнаты для фазы 2, которые продаются за Stars как самовыражение.
Вид сверху в масштабе (2,6 × 2,6 м). Видны задняя и левая стены, передок открыт, камера смотрит спереди-справа.
Предметы для «роняния» выбраны под характер любопытного неуклюжки: ему нужно, что задеть, уронить, запутать и где спрятаться. Мейн-кун добавляет водяной бардак и «охоту» у окна.
| Предмет | Класс | Выходка | Бюджет, тр | Источник |
|---|---|---|---|---|
| Стены, пол, окно | статика | подоконник — место кота | ~1100 | процедурно |
| Диван, стеллаж | статика + места | сидит, спит на спинке, точит, лазает | 1200–1500 | CC0 / процедурно |
| Ковёр, плед, шторы, картины, торшер | статика | атмосфера, свет ночью | 200–400 | процедурно |
| Растение большое | статика | атмосфера | 800 | Meshy / CC0 |
| Лежанка, миски, мячик, коробка, когтеточка | умные | спит, ест, лезет лапой в воду и расплёскивает, гоняет, прячется, точит | 200–800 | процедурно / Meshy |
| Чашка на полке | умный | роняет (стоит / упала) | 300 | процедурно |
| Горшок-малыш | умный | роняет (стоит / лежит, земля) | 400 | Meshy |
| Книги | умный | сталкивает | 300 | процедурно |
| Клубок | умный | распутывает (клубок / нитка по полу) | 300 | процедурно |
Правило контраста: кот — холодное серебро с тёмными полосами → тёплая комната в средних тонах даёт максимальный контраст; избегать больших серых и холодных плоскостей за котом. Стартовая палитра под хюгге и серебристого табби:
Серебристый кот с чёрными полосами читается и на медовом полу, и на бирюзовом диване; тёплые акценты (терракота, горчица) подсвечивают холодное серебро; зелёно-золотые глаза перекликаются с зеленью растений.
Поверх — погода: дождь делает кадр темнее и холоднее, на стекле капли, кот смотрит на струи. Излучающие: торшер и гирлянда на стеллаже. Техника: 4 запечённые карты света + маска ламп, смешивание соседних фаз.
Птицы садятся на ветку — кот реагирует чириканьем; ночью огоньки в окнах крыш. Три плоских слоя с параллаксом от гироскопа.
Сад (много природы, меньше уюта ночью) · только небо (мало жизни) · двор.
Угол ~25°, база 45° спереди-справа, наклон ~60°; поворот ±25°, наклон 50–70°, зум 1–2,5×.
Верх ~12% — полоса состояния, низ ~18% — кнопки, кот в средних 70%; безопасные зоны Telegram; гироскоп ±5°.
≤ 30 вызовов отрисовки · сцена 30–60 тыс. тр · два файла: статика и умные предметы · карты света 1024 / 2048 по классу устройства · ≤ 2 МБ до первого кадра · имена SO_ / SLOT_ / HIT_.
Фотореализм · пёстрые узоры · мелкий хлам · текст и логотипы · большие чисто-белые и чёрные плоскости · хлам в зонах кота · предметы, закрывающие кота от камеры.
Схема зон утверждена.
Серые формы + болванка кота: в кадре по умолчанию голова кота ≥ 40 pt; при отъезде видны все зоны; ≤ 30 вызовов отрисовки.
4 фазы различимы, но в одном стиле; в каждой кот контрастирует с фоном (разница яркости ≥ 0,25).
Паспорт движения и поведения — это «мозг кота»: чего он хочет, что делает, как двигается и что из этого следует для скелета, мебели и кода. Самый связующий документ предпродакшна: из него выводятся кости, список анимаций, высоты полок и темп всей игры. Все числа продублированы в одном файле-конфиге, который читают и код игры, и тестовая сцена в Blender — расхождения между ними исключены.
В Stray «каждый прыжок успешен» — промахи ломают ощущение, что ты кот. Неуклюжесть нашего котёнка — вариант анимации, а не неудача: скребётся задними лапами, посмотрел наверх и передумал. Ветеринары пишут, что мейн-куны «ошибаются с высотой».
Мейн-кун не прыгает сразу высоко, а идёт ступенями. Поэтому мебель выстраивается лесенкой под прыжки.
Нормальный ритм казуальной игры по данным GameAnalytics. Neko Atsume рассчитана на «пару раз в день». Отсюда темп потребностей.
В Untitled Goose Game люди прибирают почти всё, и гусь может набедокурить снова. Бардак — игра, а не вина.
Уши в стороны по ветеринарной шкале — боль, сгорбленная буханка — недомогание, хлещущий хвост — страх. Для «милых» эмоций эти позы запрещены.
Пять шкал от 0 до 100: сытость, энергия, игра, любопытство, ласка. У каждой есть пол — ниже 15–20 она не падает, поэтому кот никогда не «умирает» и не заболевает, как бы долго тебя ни было. Лотка нет намеренно: это рутина-обязанность, а не забота. Темп подобран под реальный ритм казуальных игр: при 2–4 заходах в день потребности встречают тебя на уровне 40–55 — ровно на 2–3 действия заботы за 3–4 минуты. Пока тебя нет больше двух часов, всё убывает вдвое медленнее, а ночью по твоему местному времени — вчетверо.
| Потребность | Убывает в час | Что восполняет | Когда низкая |
|---|---|---|---|
| Сытость | −8 · от полной до «хочу» ≈ 7,5 ч | миска | смотрит на миску, сидит столбиком |
| Энергия | суточный ритм: −12 бодрствуя, +25 во сне | лежанка, подоконник на солнце, калачик у лампы | зевает, ложится буханкой |
| Игра | −10, пока не спит | мячик, клубок, коробка, ты, выходки | ищет развлечение → бардак |
| Любопытство | −10, пока не спит | окно и птицы, полки, миска с водой | исследует, трогает лапой, роняет |
| Ласка | −6 | гладишь, зовёшь, играешь | подходит к камере, реже трелит |
Кот выбирает, чем заняться, по модели The Sims: предметы «рекламируют», какие потребности закрывают, кот оценивает выгоду и выбирает случайно из трёх лучших вариантов. Поэтому он предсказуем по характеру, но не по конкретному шагу — это и создаёт ощущение живого.
Ориентиры рынка — от Desktop Goose (намеренно раздражающий гусь пакостит раз в 20–40 секунд) до первого Тамагочи (около 4 шалостей за всю жизнь). Наша середина: не больше одной выходки за заход и не раньше чем через 2–3 минуты игры; пока тебя нет — не больше трёх; за сутки — не больше пяти с паузой от 30 минут; ночью кот спит. Вероятность растёт, когда кот скучает, — выходка сигнализирует скуку. Ресёрч советует даже 1–3 в сутки: стартуем с пяти и режем на тест-стенде, если бардак превратится в уборку.
Кот живёт сам до 12 часов, дальше — «проспал». Возвращаешься — в комнате 1–3 последствия (одно главное, два мелких: мокрые следы у миски, мячик под диваном) и один живой момент до 6 секунд, где кота «застали». Перед этим бот зовёт от лица кота: «я кое-что натворил, посмотри». Никогда — «ты забыл».
Меньше суток — сразу радость, хвост вверх крючком. От суток — обида 3–5 секунд: сидит спиной, смотрит через плечо, щёки надуты, кончик хвоста подёргивается — и бежит к тебе с трелью. От трёх дней — обида такая же короткая, а встреча больше: трётся, трелит, сидит рядом. Извиняться не нужно никогда.
Не больше одного в день и четырёх в неделю, тишина с 22 до 9 по твоему времени. Два пропущенных подряд — пауза три дня, четыре — раз в неделю. По опросам, уже при 2–5 уведомлениях в неделю 43% людей их отключают. Писать можно только после разрешения из мини-аппа.
Скорости пересчитаны с взрослой кошки на наш рост по законам подобия — так же биомеханики сравнивают животных разного размера. Шаг — 0,35 м/с (уютный темп для комнаты 2,6 м), крадучись — 0,18, рысь — около 1, бег — не быстрее 1,7 м/с, иначе в комнате не остаётся места на разгон. Цикл шага — 32 кадра по классическому разбору аниматора Rusty; порядок лап — как у настоящих кошек на беговой дорожке. Голова и хвост отстают на кадр на каждое звено — отсюда плавная «волна» кошачьего движения.
Всё мелкое, что делает кота живым, собирает код поверх анимаций. Моргание — редкое, в среднем раз в 15 секунд: кошки моргают 4 раза в минуту против 29 у человека. Медленное моргание — отдельный жест доверия: по исследованию, после него кошки чаще подходят к человеку, и ты сможешь моргнуть коту в ответ. Дыхание — 27 вдохов в минуту бодрствуя, 18 во сне, в пределах ветеринарной нормы. Уши подёргиваются раз в 5–20 секунд, хвост качается пружиной, глаза опережают поворот головы на три кадра.
Одна анимация прыжка покрывает разброс высот не больше ±7 см. Поэтому не прыжки подстраиваются под мебель, а мебель — под три прыжка.
| Прыжок | Длина | Как устроен |
|---|---|---|
| Вверх на 0,42 | 40 кадров · 1,3 с | присел, толчок 4 кадра (у настоящей кошки ≈ 150 мс), полёт, приземление на передние лапы, доводка |
| Вверх на 0,70 | 51–71 кадр | сначала «прицеливается» взглядом; в 10–15% случаев — неуклюжий вариант: зацепился передними, скребётся задними, подтянулся |
| Вниз с 0,42 / 0,70 | 29 / 38 кадров | тянется вниз, мягкая амортизация; с высоты дольше — нагрузка на лапы растёт |
| «Передумал» | 45 кадров | посмотрел наверх, взвесил, сел — черта характера неуклюжки |
Полёт посчитан по физике и растянут в 1,2 раза, чтобы прыжок читался на маленьком экране; код ведёт кота по той же дуге с пониженной «гравитацией», поэтому лапы не проскальзывают. Прямого прыжка на метр нет вовсе: всё выше подоконника — цепочкой по 0,42, как делает настоящий мейн-кун. Это минус один сложный клип.
Все анимации записываются на месте — по комнате кота ведёт код — и начинаются и заканчиваются в одной из трёх нейтральных поз, чтобы переходить друг в друга без рывков. Полный каталог — около 45 клипов с длиной в кадрах; первый релиз — 24: покой сидя и буханкой, ходьба, рысь, сон, еда, «чаттер» у окна, повороты, четыре прыжка и «передумал», удар лапой, столкнуть с полки, лапа в воде, испуг, «кто, я?», трель и обида. Было 15 — выросло, потому что твои решения по обиде и прыжкам вниз требуют своих клипов.
Из движений выводится скелет — около 50–60 костей: челюсть для трели и «чаттера» (беззвучная дрожь челюсти на птиц), по три кости в каждом ухе, пружинные кисточки, 8–10 костей хвоста, пальцы на лапах, чтобы трясти мокрой лапой и мять лежанку. Little Kitty Big City обходится похожим минимумом.
| Сигнал | У настоящих кошек | Правило для нашего кота |
|---|---|---|
| Хвост вверх вопросительным знаком | дружелюбие, «подход с улыбкой» | радость, встреча |
| Уши, развёрнутые в стороны | боль по ветеринарной шкале | запрещено для обиды, сна, удовольствия |
| Хлещущий хвост | страх, дискомфорт, перевозбуждение | только испуг и азарт — не обида |
| Сгорбленная буханка, голова опущена | недомогание | запрещено — никогда как «грусть» |
| Медленное моргание | доверие; после него кошки подходят | доверие, ответ игроку |
| Трель, чириканье, редкое мяуканье | голос мейн-куна | основной звуковой словарь |
«Обида» в листе выражений была с ушами вбок и хлещущим хвостом — у настоящих кошек это читается как боль и страх. Теперь: сидит спиной, смотрит через плечо, уши чуть назад, кончик хвоста подёргивается. Характер и внешность не менялись.
Технический контракт — это договор между Blender и браузером. Он делает так, чтобы любой файл, собранный в Blender, открывался в Telegram без ручных правок: кот стоит на полу, смотрит вперёд, анимации находят свои кости, предметы помнят свои состояния. Всё в нём проверяется скриптом, а не глазами.
Самые дорогие ошибки 3D-производства — не кривая модель, а несовпадения на стыках: кот в Blender смотрит в одну сторону, а в браузере в другую; кость называется «ear.L», а браузер молча превращает её в «earL», и анимация уха перестаёт работать; предмет «склеился» при сжатии и потерял имя, по которому код его находит. Каждая такая ошибка всплывает поздно и чинится переделкой. Контракт снимает их все одним списком правил и одним скриптом проверки.
Одна единица в Blender — один метр, и в браузере тоже метр: цифры из паспортов переносятся как есть.
| Правило | Значение | Зачем |
|---|---|---|
| Куда смотрит кот | в Blender — на зрителя в виде «спереди»; после экспорта — вперёд по оси, которую three.js считает «вперёд» | код разворачивает кота по ходу движения без поправочных углов |
| Рост кота | 0,50 м от пола до кончиков ушей без кисточек, допуск ±2% | скрипт мерит габарит и не пропускает «подросшего» кота |
| Точка опоры кота | на полу между четырьмя лапами | кот ставится на место одной командой, без подпрыгивания |
| Точка опоры предмета | центр дна | упавшая чашка лежит на полу, а не висит в воздухе |
| Место кота (SLOT) | невидимая метка на поверхности; её направление — куда кот смотрит, сидя там | код сажает кота на диван, полку, подоконник по метке |
| Анимация | 30 кадров в секунду | как в списке клипов Д3 |
Браузерный движок молча вырезает из имён точки, двоеточия, пробелы и слэши. Blender по привычке называет кости «spine.001» и «ear.L» — в браузере они превращаются в другие имена, и анимации, записанные на старые, перестают двигать кота. Поэтому правило одно: латиница, нижний регистр, слова через подчёркивание, сторона — «_L» и «_R». Blender понимает такие суффиксы для зеркалирования так же, как привычные «.L».
| Что | Как называем | Пример |
|---|---|---|
| Исходник | ассет + номер версии | cat_v003.blend |
| Кости | часть + номер + сторона | spine_03, ear_02_L, tail_07 |
| Формы лица | группа + название + сторона; имя в Blender = имя в коде | lid_blink_L, mouth_trill, cheek_puff |
| Клипы | строго по списку Д3: петли, разовые действия, добавочные слои | LOOP_idle_sit, ACTN_jump_up_low |
| Умные предметы | SO_ + тип + номер; состояния — дочерние объекты | SO_cup_01 → __st_shelf, __st_floor |
| Места кота, зоны нажатия | SLOT_ и HIT_ | SLOT_sleep_bed_01, HIT_cup_01 |
| Материалы и текстуры | M_ и T_ + ассет + карта (+ фаза суток) | T_room_light_evening |
У умных предметов и мест есть «паспорт внутри файла» — свойства, которые браузер получает вместе с моделью: что с предметом можно сделать, в каких он бывает состояниях, в каком стоит по умолчанию; у места — на какой оно высоте и с какими местами соединено для прокладки пути. Высота места сверяется с таблицей прыжков Д3: полка, до которой кот не допрыгивает ни одним из двух прыжков, не пройдёт проверку.
Разбивка подчинена одному: первый кадр — быстро, остальное догружается в фоне.
| Файл | Что внутри | Когда грузится |
|---|---|---|
| cat | кот, скелет, формы лица, клипы покоя и ходьбы | до первого кадра |
| cat_anims | остальные клипы — подключаются к коту по именам костей | в фоне |
| static | комната: стены, пол, окно, неподвижная мебель — склеено в минимум кусков | до первого кадра |
| objects | умные предметы с состояниями, места кота, зоны нажатия — ничего не склеивается | до первого кадра |
| карты света ×4 | утро, день, вечер, ночь — отдельными картинками | текущая фаза сразу, остальные в фоне |
| заставка ×4 | готовая картинка той же комнаты из той же камеры, ≈ 100 КБ — видна мгновенно, пока грузится 3D, и плавно сменяется живой сценой | самой первой |
Сборка — только скриптом: Blender запускается без окна, берёт нужную коллекцию и выгружает файл с зафиксированными настройками. Все 103 настройки экспортёра сняты с установленного Blender 5.2.1, а не по памяти; в контракте записано, какие включены для кота, комнаты и предметов и почему. Затем постобработка: проверка, чистка лишнего, сжатие картинок в формат, который телефон держит в видеопамяти сжатым, сжатие геометрии и повторная проверка. Для файла предметов запрещены «оптимизации», которые склеивают объекты, — они стирают имена, по которым код находит чашку.
| Класс | Треугольники | Кости | Вызовы отрисовки | Вес готового файла |
|---|---|---|---|---|
| Кот | 8–12 тыс. | ≤ 70 (план 50–60), ≤ 4 на вершину | 3: тело, глаза, мех | ≤ 1,2 МБ с клипами покоя |
| Набор клипов | — | — | — | ≤ 300 КБ |
| Умный предмет | 300–1 500 | 0–1 | все предметы ≤ 8 | ≤ 60 КБ |
| Комната | 15–30 тыс. | — | 1–3 | ≤ 600 КБ без карт света |
| Мех | 8 / 16 / 24 слоя по уровню качества | — | 1 | — |
| Вся сцена | 30–60 тыс. без меха, с мехом ≤ 120–300 тыс. | ≤ 30 | ≤ 1,5 МБ до первого живого кадра + картинка-заставка ≈ 100 КБ |
Масштаб и повороты применены · точки опоры на месте · у каждой вершины кота не больше 4 костей · асимметрия после зеркалирования меньше 1% роста · на коте нет лишних модификаторов · все имена по правилам · все клипы из списка Д3 есть и начинаются и заканчиваются в нейтральной позе.
Официальный валидатор формата — 0 ошибок · все счётчики в бюджете · формы лица и клипы только из канонических списков · у каждого предмета есть все состояния и своя зона нажатия · высоты мест совпадают с таблицей прыжков · рост кота 0,50 м ±2% · кот смотрит вперёд.
Отчёт проверки лежит рядом с файлом и показывается на тест-стенде. Файл с хотя бы одним «не прошёл» дальше не идёт — так контракт превращает «кажется, всё нормально» в измеримое правило.
Паспорт устройств отвечает на три вопроса: на каких телефонах кот обязан быть красивым, как быстро игра открывается и как она сама подстраивает качество под телефон. Всё, что в нём сказано про скорость, превращается в замер — никаких «вроде летает».
Кот обязан быть красивым и плавным — 60 кадров с полным мехом — начиная с iPhone 13 и Android среднего класса. Телефоны слабее мы не отрезаем — игру пересылают друзьям с любыми телефонами, — они получают упрощённый мех и работают без гарантий.
В России 69% телефонов — Android и 31% — iPhone; среди производителей после Apple идут Xiaomi (20%) и Samsung (18%). Массовый российский Android — это телефоны вроде Redmi Note 11 и Galaxy A15: 4–6 ГБ памяти и видеочипы начального уровня. iPhone почти все на iOS 26, а она работает начиная с iPhone 11. 3D-движок браузера (WebGL2) есть у 99% телефонов, сжатые текстуры — у всех. Два важных ограничения: пост-эффекты на части Android не гарантированы, а время работы видеочипа на телефоне измерить нельзя вообще — поэтому мерим только время кадра.
| Класс | iPhone | Android | Что обещаем |
|---|---|---|---|
| Сильный | 15 и новее | флагманы | 60 кадров, самый густой мех (24 слоя), мягкая тень под котом |
| Минимум с гарантией | 13, 14 | средний класс (Snapdragon 7-й серии и ровесники) | 60 кадров, полный мех (16 слоёв) — под этот класс проектируется и утверждается весь визуал |
| Ниже минимума | 11, 12, SE | Redmi Note 11, Galaxy A15 и ровесники | упрощённый мех, цель 60; если не тянет — ровные 30 вместо дёрганых; без гарантий |
| Совсем старые | без 3D-движка браузера или с постоянными сбоями | красивая картинка-заставка и обычный интерфейс | |
Следствие решения стоит проговорить честно: массовый бюджетный Android попадает в «ниже минимума». Кот там будет жить, но мех проще, а плавность не обещана. Взамен мы не упрощаем визуал ради самых слабых телефонов.
Готовая картинка той же комнаты, около 100 КБ. Человек сразу видит кота, а не белый экран.
Код, кот, комната, карта света — всё, что нужно, чтобы кот ожил. Остальное догружается в фоне.
На средней скорости мобильного интернета в России (19 Мбит/с). Заставка и 3D одного цвета — смена незаметна.
Отдельная российская деталь: с лета 2025 провайдеры режут трафик к Cloudflare и ряду зарубежных хостингов до первых 16 КБ на файл — мы уже наступали на это в «Голосовании Лагеря». Поэтому все файлы игры раздаются с нашего сервера на российском хостинге, без посредников.
Первые настоящие цифры проекта: замер в Telegram на телефоне, результаты пришли на сервер сами.
| Прогон | Слоёв меха | Чёткость | Кадры | Время кадра, 95% | Процессор |
|---|---|---|---|---|---|
| Обычный замер: покой · крупный план · смена суток | 16 | 1,5× | 59,0 / 59,9 / 59,9 | 17 мс | 0,6 мс |
| Стресс ×1 | 16 | 3× | 56,9 | 25 мс | 0,6 мс |
| Стресс ×2 | 32 | 3× | 26,2 | 42 мс | 0,5 мс |
| Стресс ×3 | 48 | 3× | 19,3 | 53 мс | 0,5 мс |
Из последних двух шагов считается цена: один слой меха стоит примерно 0,25 мс на каждый миллион пикселей экрана. Это линейка, которой телефоны сравниваются напрямую — когда придут замеры с Galaxy, отношение к этой цифре сразу скажет, сколько слоёв можно дать минимуму.
При ней даже сильнейший телефон с обычным мехом теряет 60 кадров. Раньше это было предположением, теперь измерено.
16 слоёв при чёткости 1,5× — около 1 мс из 16,7 на кадр, шесть процентов бюджета.
24 слоя при чёткости 2× по той же формуле съедают около 10 мс. Нужен отдельный прогон на HIGH; если просядет — 20 слоёв или чёткость 1,75×.
0,5 мс на кадр при любой нагрузке. Экономить надо слои и пиксели, а не количество предметов в комнате.
| Параметр | Ниже минимума | Минимум с гарантией | Сильный |
|---|---|---|---|
| Слои меха | 8 (при нехватке 4) | 16 | 24 |
| Чёткость картинки | 1× | до 1,5× | до 2× |
| Карта света комнаты | 1024, одна фаза в памяти | 2048, две фазы для плавной смены | 2048, две фазы |
| Тень кота | пятно | пятно | мягкая контактная |
| Пост-эффекты | нет нигде — они ломают совпадение цвета с Blender (Д5) | ||
Стартовый уровень игра угадывает сама: на Android Telegram прямо сообщает класс телефона, на iPhone работает библиотека определения видеочипа. Дальше следит монитор производительности: если кадры проседают, он по очереди снижает чёткость, число слоёв меха, тень и карту света и запоминает удачный уровень. Когда Telegram свёрнут, отрисовка на паузе — батарея не тратится.
Кот на четверти экрана с 16 слоями меха — это около 216 миллионов закрашенных точек в секунду при 60 кадрах. Поэтому самый первый технический замер проекта — бенчмарк меха на iPhone 13 и Android среднего класса. Если 60 кадров с полным мехом там не держатся, решаем до ключевого арта, а не после.
Эталоны гарантии — iPhone 13 и Android на Snapdragon 7-й серии; плюс сильный iPhone, флагман и два телефона ниже минимума, чтобы убедиться, что упрощённый уровень не ломается. Условия одинаковые: заряд больше половины, яркость 50%, телефон остыл, всё закрыто. Игра открывается по специальной ссылке и сама прогоняет три сценария по минуте — кот в покое, худший случай (крупный план, мех на 60% экрана) и смена времени суток, — плюс 10 минут на нагрев: плавность не должна падать больше чем на 20%. Три прогона на телефон, в отчёт — медиана; результаты сами уходят на наш сервер.
Главный экран проекта: на нём утверждаем картинку, проверяем жесты, вырез Dynamic Island и экран 120 Гц. На тест-стенде будет переключатель уровней — ты увидишь, как кот выглядит на минимуме и ниже. Но скорость минимума он не подтверждает: он заметно мощнее iPhone 13. Раннее предупреждение: если худший сценарий на твоём телефоне съедает больше половины времени кадра — на iPhone 13 60 кадров не будет, чиним сразу.
Все замеры скорости — бесплатно в удалённой лаборатории Samsung на настоящих Galaxy. Главный ориентир — слабый Android (серия A1x–A2x): на упрощённом уровне держит 60 и никогда не падает ниже ровных 30. Гейт гарантии — Galaxy среднего класса: 60 кадров с полным мехом. iPhone 13 не нужен: его видеочип сильнее любого из этих Android, а особенности iPhone — движок, жесты, память — проверяем на твоём телефоне.
Контракт внешнего вида делает так, чтобы кот и комната в Telegram выглядели так же, как в Blender — и одинаково на всех телефонах. Главное правило: картинку утверждаем в браузере на телефоне, Blender — место производства, а не утверждения.
Blender и браузерный движок по-разному «проявляют» свет — как два фотолаборанта с разной химией. Даже одноимённые режимы у них разные: сверка исходного кода показала, что «AgX» в Blender и в three.js — разные формулы, а готовые настройки R3F включают третий режим. Совпадает только один — Khronos PBR Neutral. Его и берём на обе стороны.
В Blender во всех сценах проекта стоит одна и та же настройка цвета: вид Khronos PBR Neutral, без «луков», кривых и баланса белого — браузер не умеет их повторить. Экспозиция фиксирована и одним числом передаётся в код. Рабочее цветовое пространство Blender совпадает с браузерным. Всё это проверено по файлу настроек цвета, установленному вместе с нашим Blender 5.2.
Весь свет, отражения и мягкие тени считаются в Blender заранее, на четыре фазы суток, и «впекаются» в картинку. Телефон ничего не считает — просто показывает картинку на стенах: это самый дешёвый и самый красивый способ. Точный рецепт записан по шагам: запечь → сохранить без потерь → применить «проявку» → сжать в формат, который телефон держит сжатым в памяти. Главная ловушка — не «проявить» комнату второй раз в браузере: для этого материал комнаты помечается «без освещения».
Кот двигается, поэтому его свет считается прямо в телефоне: основной источник по фазе суток, мягкое окружающее освещение, снятое в Blender из точки, где сидит кот, и контровой свет, чтобы серебристый мех отделялся от стены. Когда кот заходит в тень дивана, код берёт яркость пола под лапами из карты света и приглушает его — кот «входит» в тень, как настоящий.
Тени — без дорогих живых теней: под котом и предметами мягкое пятно-тень, на сильных телефонах — контактная тень. Мех — полупрозрачные слои вокруг тела, рисуются строго после всего непрозрачного и без приёмов, которые на мобильных видеочипах ломают экономию (так советуют и Arm, и Apple); число слоёв — по уровню качества. Если мех не пройдёт замер на слабых телефонах, есть запасной путь: мягкость формой и текстурой, крупные массы шерсти и так живут в силуэте. Глаза — отдельный материал: радужка с глубиной, зрачок сужается и расширяется по эмоции, два блика всегда смотрят в камеру, поэтому глаза сияют с любого ракурса.
Пост-эффектов нет вообще: любой эффект на весь экран заставляет браузер «проявить» комнату второй раз и сломать цвет. Сглаживание — встроенное, виньетка — слоем интерфейса, свечение ламп — лёгкие спрайты.
Один и тот же кадр — кот, серая карта, цветовая шкала — рендерится в Blender и в браузере и сравнивается численно: комната — среднее отличие ΔE меньше 1,5 (глаз не различает), кот — меньше 3.
Картинка-заставка проходит тот же гейт — поэтому смена заставки на живую сцену незаметна.
Оставить настройку цвета R3F по умолчанию · добавить пост-эффекты · сохранить запечённый свет без «проявки» · перепутать тип цвета у текстуры · кривые и баланс белого в Blender.
Здесь копятся все наработки по коту в порядке производства — от первых картинок до готовой модели. Каждая стадия с разбором: что получилось, что мимо и что из этого следует. Полноразмерные версии — на отдельной странице, она открывается и с телефона.
Нейтральная посадка в три четверти: крупная голова, огромные зелёно-золотые глаза, кисточки, львиная грива, хвост кольчатым плюмажем, белая манишка и лапы-снегоступы. Всё дальнейшее сверяется с этим кадром — лист эмоций, разворот, 3D-база, окрас и мех.

| Заход | Что делали | Итог |
|---|---|---|
| 1 · 27 кр. | Три направления: породный, детский, характерный | Пластиковые игрушки. Причина — формулировка «мех массами, без отдельных волосков»: перестраховка убила пушистость |
| 2 · 36 кр. | Та же троица плюс баланс, но с правильной формулой меха | Пушистость решена. Выбран «В-пушистый» — детская схема плюс живой характер |
| 3 · 27 кр. | Правка выбранного кота: вернуть кисточки и гриву, нейтральная поза, вид спереди | Образ утверждён. Сцена с чашкой отброшена — шерсть снова пригладилась до пластика |
Формулу меха — «густой мягкий мех с видимыми тонкими короткими волосками и мохнатым контуром» — нужно повторять в каждом запросе целиком, даже когда правишь одну деталь. Фразы «тот же пушистый мех» недостаточно: модель слышит «стилизованный» и приглаживает шерсть.
Десять выражений на том же коте — проверка до лепки: умеет ли мордочка играть. Кот остался одним и тем же во всех кадрах — значит, разворот и 3D-база из него получатся, характер не поплывёт между ракурсами.


В 128 пикселях — а это размер кота в обычном кадре — читаются только крупные сигналы: поза, уши, хвост, размер глаз. Тонкая мимика пропадает. Значит, эмоциональные моменты обязаны сами подъезжать камерой, иначе вся работа над мордой не видна игроку. Три непрочитанные эмоции пересняли через позу и предмет: упавшая чашка объясняет вину, лапа на чашке — хитрость, посадка столбиком — просьбу.
Серая глина без шерсти и цвета: по ней видно форму и можно мерить. Это вход в 3D.

Голова у глины — около трети роста, а по паспорту детская схема требует 40–50%. Глаза мельче канона и посажены выше. На пушистом арте это было незаметно: голову визуально увеличивают грива и большие уши.
Просил три версии пропорций — вышли три одинаковых кота, отличие 0,2–0,4%. Генератор держит персонажа, но не меняет пропорции. Значит, разворот задаёт силуэт и стиль, а голова и глаза выставляются в Blender по числам — точно и без кредитов.
Три вида глины ушли на вход, обратно пришла объёмная модель. Ниже — её четыре ракурса, отрендеренные в Blender ровным светом.

Та же болванка, облегчённая до 60 тысяч треугольников. Тащи мышью или пальцем, колесо и щипок — приближение.
| Проверка | Результат | Требование паспорта |
|---|---|---|
| Совпадение силуэта спереди | 0,964 | не ниже 0,90 |
| Совпадение силуэта сбоку | 0,921 | не ниже 0,90 |
| Совпадение силуэта сзади | 0,964 | не ниже 0,90 |
| Замкнутость формы | 0 дырок, 0 висящих вершин | сетка замкнута |
| Плотность | 1,94 млн треугольников | после ретопологии 8–12 тысяч |
Я ожидал, что кисточки слипнутся с ушами, грива с грудью, а хвост с телом, и предупреждал, что морду, возможно, придётся лепить руками. Ничего этого не случилось: все породные формы вылеплены отдельно, силуэт совпал с разворотом с запасом. Для тела и общей массы генератор отработал лучше моих ожиданий; сколько ручной работы потребует морда, станет понятно на ретопологии.
Тело сбоку вышло примерно на пять процентов длиннее, чем на развороте, — поправим вместе с пропорциями головы на следующей стадии.
Модель приведена к канону: рост ровно 0,5 метра, стоит на полу, симметрия выправлена зеркалированием половины. Это первый настоящий исходник проекта — source/cat_v001.blend. Дальше в нём же идёт ретопология, окрас, скелет и анимация.

Пустые глазницы — так и задумано: глаза у нас отдельные сферы со своим шейдером. Но сама глазница вылеплена слишком мелкой: даже глаз ровно по её размеру уже выпучивается, а глаз по канону превращает кота в лягушку. Значит, посадочное место строится заново — глубже, крупнее, с ровным кольцом века по краю, по которому потом работает моргание.
Сколько ручной работы потребует морда — было неизвестно. Теперь известно: тело генератор отдал отличное, а область глаз надо перестраивать руками. Это та же ретопология, что стояла в плане, просто теперь понятно, куда идут силы.
Та же модель после выправления симметрии, с временными глазами по размеру глазниц. Видно и посадку, и то, как не хватает глубины.
Первая болванка пришла с пустыми глазницами — так и просили, глаза у нас отдельные сферы. Но сама впадина оказалась слишком мелкой: любой глаз в ней выпучивался. Поэтому разворот переснят с прямым требованием вылепить веки, и болванка собрана заново.

| Проверка | Результат |
|---|---|
| Совпадение силуэта: спереди / сбоку / сзади | 0,958 / 0,943 / 0,948 при требовании 0,90 |
| Замкнутость формы | 0 дырок, 0 висящих вершин |
| Глаза | вылеплены веки с кромкой и глубина впадины — берём только это; само глазное яблоко с вырезанной радужкой срежем |
| Поза | стойка на четырёх лапах, хвост отведён — годится для скелета |
Первая попытка с глазами дала полусидящего кота: в развороте боковой вид был нарисован в другой позе, и это утекло в объём. Глазами я бы это проглядел — спереди и сзади всё выглядело правильно. Поймали числом: совпадение силуэта сбоку упало до 0,42. Разворот переснят с требованием одной стойки во всех видах.
Из генерации сетка выходит беспорядочной мозаикой на полмиллиона треугольников. На такой нельзя ни анимировать (поверхность сминается складками), ни делать мимику (векам нужны ровные кольца рёбер), ни класть текстуру, ни показывать на телефоне. Ретопология пересобирает форму в аккуратную сетку из четырёхугольников.

| Проверка | Результат | Требование |
|---|---|---|
| Треугольников | 9 640 вместо 507 662 | 8–12 тысяч |
| Граней | 4 820, все четырёхугольные | четырёхугольники под анимацию |
| Силуэт сбоку / спереди | 0,937 / 0,916 | не ниже 0,90 |
Сетка ровная, но её рисунок пока равномерный, а не анатомический: вокруг глаз и рта нужны отдельные кольца рёбер, иначе моргание и мимика будут работать грубо. Это та самая ручная часть, о которой шла речь: тело генератор отдал отличное, а лицо доводится вручную. Плюс на этом этапе срезается вылепленное глазное яблоко — остаётся веко, в которое встанет наша сфера.
Та же модель после ретопологии — 200 КБ вместо 35 мегабайт.
Пропорции фиксируются до мимики: формы лица привязаны к конкретным вершинам, и если менять размер головы после, всю мимику придётся лепить заново.
Детская схема — это не только крупная голова: у детёнышей ещё короче лапы и компактнее корпус. Поэтому ручки три сразу. Рост при этом остаётся прежним: короткие лапы компенсируют большую голову.

| Вариант | Голова | Лапы | Корпус | Рост |
|---|---|---|---|---|
| Как есть | 34% роста | — | — | 48,7 см |
| Детская схема ✓ выбрано | 40% | короче на 10% | короче на 6% | 48,7 см |
| Максимум | 45% | короче на 18% | короче на 12% | 48,7 см |
Приятный итог: канонические 40–45% достижимы без роста кота и без искажений тела — надо было менять не только голову. Мебель пересчитывать не придётся, рост прежний.
Ты выбрал 40%. Модель пересобрана и сохранена как рабочий файл: рост 48,7 см, голова 19,3 см (40%), лапы короче на 10%, корпус на 6%, просвет под грудью 10,4 см. Сетка — 9 640 треугольников, 4 820 граней, все четырёхугольные, форма замкнута. Числа записаны в паспорт героя, раздел «пропорции, измеренные на модели».
Высоту прыжка проверил: скорость отрыва считается из высоты мебели и силы тяжести — длина лап в неё не входит, а рост не изменился. Значит лесенка мебели и таблица прыжков остаются как есть. Короткие лапы скажутся только на рисунке движения: присед станет мельче, а захват края лапами при подтягивании — короче. Это задаётся при анимации.
Сначала я увеличивал одну голову и возвращал кота к росту 0,5 м — тело съёживалось, выходила карикатура. Потом пробовал дать коту подрасти — менялись бы все высоты мебели. Верный ход нашёлся третьим: детская схема целиком — голова крупнее, лапы короче, корпус компактнее. Рост держится сам собой, мебель не трогаем.
Когда я взялся за мимику, выяснилась неприятная вещь: на рабочей модели не было лица. Перестроение сетки идёт через воксельную «переливку» формы, и её шаг был 4 мм — крупнее, чем веко. Силуэт, по которому мы принимали модель, этого не показывает: снаружи кот тот же, а вблизи — гладкая болванка без глаз, носа и рта.

Лечение пошло не в лоб. Мельче воксель — перестроение сетки просто отказывается работать; я перебрал шаги 2 / 2,5 / 3 мм и разные плотности, оно срывается на всех. Поэтому сделал иначе: взял чистую четырёхугольную сетку, уплотнил её только вокруг двух глаз и мордочки и притянул эти вершины к исходной болванке из генератора. Плотность легла туда, где она нужна, а спина и лапы остались лёгкими.
| Что | Было | Стало |
|---|---|---|
| Треугольников | 9 640 | 17 276 |
| Четырёхугольных граней | 4 820 из 4 820 | 8 334 из 8 684 |
| Лицо | стёрто | веки, нос, рот, надбровья |
| Асимметрия | 0 | 0,11 мм |
Попутно всплыла вторая тонкость: правый и левый глаз получались разными, хотя болванку мы симметрировали. Причина — сетка была симметрична по форме, но не по разбиению: две стороны цепляли исходник в чуть разных точках. Теперь сетка зеркальная буквально, и притяжение тоже считается с одной стороны и отражается на вторую. Разница между половинами — 0,11 мм.
Модель потяжелела с 9,6 до 17,3 тысяч треугольников — это выше ориентира из технического контракта (8–12 тысяч). Ориентир я пока не двигаю: мех рисуется слоями-оболочками поверх модели, и оболочкам лицо не нужно — они будут строиться с упрощённой копии. Проверим на телефоне замером, как с остальным.
Рабочая модель целиком — можно крутить.
Дальше по лицу: срезать вылепленное глазное яблоко (оно не умеет вращаться и расширять зрачок), проложить кольца вокруг глаз и рта — по ним потом двигается мимика — и вставить настоящие глаза-сферы. После этого берёмся за сами выражения.
Когда я стал переносить координаты глаз на следующий этап, всплыла вторая ошибка — уже моя. Увеличение головы я делал «шаром» вокруг основания черепа, и радиус этого шара не доставал до морды. Получалось так: затылок раздувался, а морда, нос и глаза оставались прежними. Расстояние между глазами до и после правки — 10,4 и 10,5 см, то есть не изменилось вовсе. А число «40%» считалось по двум точкам у самого затылка, которые как раз росли, — поэтому в отчёте всё выглядело правильно.
Переделал: теперь голова растёт целиком, от шеи. Шея находится автоматически — это самое узкое место между головой и грудью, — и голова масштабируется относительно неё, плавно переходя в шею на четырёх сантиметрах. Заодно поменял мерку: доля головы считается по вершинам головы (от подбородка до темени по средней линии, без ушей), а не по точкам, которые сами же и двигаются.

| Вариант | Голова | Глубина головы | Ширина | Глаза врозь | Рост |
|---|---|---|---|---|---|
| Как есть | 38% роста | 19,5 см | 25,9 см | 10,4 см | 48,7 см |
| Детская схема ✓ | 40% | 19,9 см | 27,0 см | 10,8 см | 48,7 см |
| Максимум | 45% | 22,2 см | 30,5 см | 12,3 см | 48,7 см |
Твой выбор не поменялся — детская схема 40%, только теперь это настоящие 40%, а не ошибка измерения. Рост держим прежним: голова растёт, и следом весь кот уменьшается ровно настолько, чтобы вернуться к 48,7 см. Поэтому высоты мебели и таблица прыжков по-прежнему не пересчитываются. Отправная точка, кстати, тоже оказалась другой — не 34%, а 38%: старое число считалось той же кривой меркой.
Рабочая модель с честными пропорциями — можно крутить.
Обе ошибки — и стёртое лицо, и раздутый затылок — прошли мимо проверок, потому что проверки смотрели на силуэт и на числа, которые считал тот же код, что и двигал модель. Теперь в правилах проекта записано: после любой операции с сеткой смотреть крупный план лица с подсветкой впадин, а мерки брать по закреплённым вершинам, а не искать их заново после каждого изменения.
Посмотрели честные варианты — и выбрали максимум. Аргумент не вкусовой: в паспорте героя с самого начала записано «голова около 45% роста», так что это не отход от канона, а наконец попадание в него. Сорок процентов были компромиссом от кривой мерки.

Проверял на тех размерах, на которых кота реально увидят. На 128 пикселях — так он выглядит мелко в кадре и в списках — у версии 45% лицо читается заметно лучше: глаза крупнее, морда узнаётся, характер виден без подписи. Для вирусности это прямая польза: кот должен считываться с одного взгляда.
Чем платим: тело становится мельче — лапы тоньше, грива и хвост занимают меньше кадра, порода читается чуть слабее, кот уходит от «мейн-куна» в сторону игрушки. Не блокер: густоту гривы и толщину лап добираем мехом и лёгкой правкой лап на следующих этапах, но следить за этим буду.
| Параметр | Было (38%) | Стало (45%) |
|---|---|---|
| Голова | 18,2 см · 38% роста | 21,9 см · 45% |
| Ширина головы | 25,9 см | 30,5 см |
| Глаза врозь | 10,4 см | 12,3 см |
| Рост | 48,7 см | 48,7 см — не меняется |
| Мебель и прыжки | пересчёт не нужен | |
Рабочая модель — голова 45%.
Глаз, который вылепил генератор, — это рельеф на коже. Он не умеет смотреть по сторонам и у него не расширяется зрачок, а взгляд — половина характера. Значит, на его месте должен быть настоящий шар в веке.
С первого раза вышло плохо, и ты это сразу увидел. Я вырезал глаз своей окружностью — и вместе с рельефом выбросил веко, которое вылепил генератор: миндалевидную форму с уголками, ту самую, из-за которой морда читалась кошачьей. Получился шар в круглой дырке с кольцевым уступом вокруг.

Переделал по-другому. Теперь программа читает складку века прямо с модели: находит рёбра, где поверхность резко ломается, и строит по ним кривую — ту самую миндалину с уголками. Режу ровно по ней, веко остаётся авторским. А размер глаза не подбирается на глаз: шар вписывается в купол, который вылепил генератор — по всем его точкам сразу, как подгоняют окружность по замерам. Расхождение с лепкой 2,1 миллиметра, то есть шар встал ровно туда, где художник и рисовал глаз.
| Параметр | Значение | Откуда |
|---|---|---|
| Раскрытие века | 5,5 × 6,3 см | прочитано со складки, форма авторская |
| Диаметр глаза | 5,1 см | вписан в вылепленный купол, расхождение 2,1 мм |
| Купол над веком | 2,4 мм | как на болванке — не «мячик наружу» |
| Сетка | 16 892 треугольника | герметична, асимметрия 0,13 мм |
Отдельно про ошибки, которых было много: срез сначала шёл «цилиндром» насквозь и съедал грани на затылке; наклон разреза применялся к левому и правому глазу в разные стороны; стенку глазницы я поставил на миллиметр внутрь шара, и она проступала тёмными полосами прямо по радужке. Все три — из-за того, что я правил параметры вместо того, чтобы опереться на то, что уже есть в модели.
Модель с глазами — можно крутить.
Ты прислал разбор плагина для глаз — посмотрел, и главное в нём совпадает с тем, к чему мы пришли сами: глаз это шар плюс нарисованная радужка, а веко потом подтягивают руками, чтобы не торчал белок. Но в наш конвейер такой плагин как есть не встаёт: он рисует глаз процедурным материалом Blender — цвет, кольца и блики считаются узлами прямо при рендере, а в формат, который читает браузер на телефоне, такие материалы не экспортируются вовсе. Всё равно пришлось бы запекать в картинку. Плюс его глаза — многослойные шары с линзой и преломлением, для мобильного кадра это лишний вес.
Поэтому ценность плагина для нас — внешний вид, а не механика. Вид я сделал той же картинкой: нарисовал текстуру глаза — радужка с волокнами, золотое кольцо по канону, тёмная подводка, зрачок и два блика — и положил её на наш шар проекцией по направлению взгляда. Никакой покупки, никакой зависимости, и рисунок уезжает на телефон как обычная картинка.

Расширение зрачка — это масштаб рисунка от центра. Взгляд по сторонам — поворот шара. И то и другое делается на лету, без новой геометрии.

Отдельная ловушка, на которой я потерял время: у шара из библиотеки Blender уже есть своя развёртка «обёрткой вокруг», и рисунок сначала брался с неё — зрачок уезжал за край глаза. Свою развёртку нужно не просто создать, а сделать активной.
Модель с нарисованными глазами.
Дальше — кольца вокруг рта и мимика.
Вопрос был: не поможет ли генератор поставить скелет. Ответ: не поможет и не нужен — координаты даёт сама модель. Кость идёт по середине объёма, поэтому я режу модель тонкими слоями и беру центр каждого среза. Цепочка центров и есть линия кости.

Генератор вырезал глазное яблоко прямо в теле, вместе с кольцом радужки. Такой глаз не повернётся вслед за игроком, и зрачок в нём не расширится, а по паспорту зрачок ходит от 0,4 до 0,95 — это половина эмоции. Поэтому при ретопологии яблоко срезается, остаётся веко с кромкой и глубиной, и в него встаёт наша сфера со своим шейдером. То есть генератор дал посадочное место, а не глаз.
Красное — позвоночник, оранжевое — шея, розовое — голова, фиолетовое — челюсть, синее — хвост, зелёное — лапы с суставами, жёлтое — уши. Всё найдено автоматически, без ручной разметки. Дальше эти точки станут костями с именами из технического контракта, а генераторный риг нам не подошёл бы в любом случае: в нём нет ни челюсти для трели, ни костей ушей, ни кисточек, ни пальцев.
Хвост сначала уходил вниз по задней лапе — искал «самую дальнюю точку», ею оказалась лапа. Признак, который их различает: хвост идёт по осевой линии, лапы разнесены в стороны. Лапы сверху расходились за силуэт: вертикальный столб над лапой захватывал бок туловища. Теперь цепочка прослеживается снизу вверх по объёму самой лапы. Шеи не было вовсе — позвоночник начинался от лопаток, а голова висела отдельно.
Осталось доделать: шея пока уходит слишком вертикально, а цепочки лап обрываются на середине и не достают до плечевого и тазобедренного суставов. Доведу их на чистой сетке после ретопологии — на плотной болванке мешает грива, которая липнет к черепу и к плечам.
| Стадия | Где делается | Решает |
|---|---|---|
| К4 объёмная болванка из разворота | генерация · ≈ 25 кредитов | я; тебе — вращение в стенде |
| К5 чистка сетки и пропорции по паспорту | Blender | ты: выбор из трёх рендеров одной модели |
| К6 окрас · К7 лицо · К8 скелет | Blender | ты — на эмоциях в 3D |
| К9 мех · К10 анимация · К11 приёмка | Blender + стенд | ты — на своём телефоне |
Разделение труда честное: генерация даёт форму — это примерно десятая часть работы. Всё остальное — Blender: сетка, пропорции, развёртка, окрас, формы лица, скелет, веса, анимация, выгрузка и проверки. Скелет генератор нашему коту поставить не может в принципе: их автоматический риг работает только на человекоподобных.
Раздел заполнится, когда пойдёт комната. По плану она начинается с блокаута — финальной геометрии по «лесенке» высот, а не наброска, — и дальше стилевой кадр, лист предметов, сквозной эталон-чашка и запекание света.
Точные размеры из канона, места кота и зоны нажатия. Смотрится в стенде вместе с болванкой кота.
Кадр комнаты поверх ракурса блокаута и лист всех предметов одной картинкой — чтобы вещи были из одного мира.
Чашка проходит всю цепочку первой и фиксирует рецепт, затем остальные предметы и запекание четырёх фаз света.
Тест-стенд — инструмент, который живёт весь проект: kuki-stand.rkvartalnov.ru, открывается кнопкой «Стенд» в меню бота. Сейчас в нём серая комната по «лесенке» и болванка кота с настоящим мехом; дальше в него попадает каждый готовый кусок.
| Замер | Что показал |
|---|---|
| Обычный прогон на твоём iPhone | Ровные 60 кадров во всех трёх сценариях, процессор занят на 0,6 мс из 16,7 |
| Стресс-тест меха | Один слой меха стоит около 0,25 мс на миллион пикселей. Это линейка для сравнения телефонов |
| Сильный уровень | 24 слоя при чёткости 2× не держат 60 кадров в крупном плане — разбираем, что виновато: слои или мягкая тень |
Подробности замеров и матрица устройств — в табе 06, подтаб «Устройства».