Перейти к основному содержимому
megapromotingДавайте обсудим

Экспертиза · Игры и симуляции

Игры, симуляции и интерактивные впечатления, которые открываются по ссылке, построенные на Three.js поверх WebGL.

Мы строим интерактивные интерфейсы в браузере: правила, которые применяются, состояние, которое меняется, и причина, по которой человек делает ещё один шаг. Пять проектов, построенных на одном и том же стеке, четыре из них открыты публично прямо сейчас.

Уже построеноCinci implementări proprii pe aceeași stivă, dintre care patru se pot deschide de oricine fără să ne întrebe pe noi: humanoid-sim.megapromoting.com, vision.megapromoting.com, www.megapromoting.com/satelit/ și relieva.vercel.app — toate 200 la verificarea din 06.09.2026. Three.js apare în 17 fișiere sursă scrise de noi, în cinci depozite. Rezerva care schimbă jumătate din pagină: Unity și Unreal NU apar nicăieri în codul nostru — nici într-un fișier, nici într-un proiect, nici măcar ca aplicație instalată. Partea aceea rămâne ofertă cu condiții și e scrisă ca atare, nu ca realizare.

Мы создаем игры, симуляции и интерактивные впечатления, которые открываются по ссылке. Без установки, без магазина, без плагина: движок — Three.js поверх WebGL, а публика заходит, нажимая на адрес. Это стек, который мы можем показать — пять построенных проектов, четыре из них публичные, все открыты для любого, кто хочет их проверить.

Игра — это не красивая страница. Это правила, которые применяются, состояние, которое меняется, и причина, по которой человек делает следующий шаг. В нашей игре-расследовании причина — это часы на 72 часа: одна реплика стоит 10 минут, одна поездка по городу — 30, а к часу закрытия дело закрывается с вами или без вас. В симуляции роботов причина — любопытство: тот же робот, тот же прыжок, другая гравитация.

Часть, к которой мы относимся серьезнее, чем принято, — это происхождение. В симуляции самая простая ложь — позволить красивой анимации сойти за продемонстрированную физику. В симуляции роботов все 15 действий в интерфейсе помечены в коде как `cinematic`, панель доказательств приложения заявляет `actionValidation: "none"`, а шлюз запуска проекта сегодня отвечает «Release qualification: blocked». Мы предпочитаем публиковать шлюз, который отказывает, чем утверждение, которое мы не можем подтвердить.

О Unity и Unreal мы говорим прямо: мы берем их под заказ, но у нас нет ни одного сданного проекта на них. То, что следует после этой фразы — условия, риски и как мы начинаем — написано ниже, а не спрятано в сноске.

Что входит

Работа, по составляющим

Сначала правило, потом графика

Прототип без единой текстуры, но с правильным правилом, говорит больше, чем красивая сцена без ставки. В игре-расследовании правило означает пять персонажей, восемь улик, из которых три — жёсткие доказательства, четыре мотива, четыре финала и часы на 72 часа, в которых каждая реплика отнимает 10 минут, а перемещение — 30. Часы 00:00–07:00 пропускаются автоматически, чтобы время не тратилось во сне.

Сцена в браузере, на Three.js

Та же библиотека в пяти репозиториях: Three.js 0.184–0.185, иногда через `@react-three/fiber` и `@react-three/drei`, иногда написанная напрямую. Два проекта используют React-версию; ещё два пишут чистый Three.js, вплоть до уровня, где мы вручную управляем атрибутами буфера. Самый большой собственный движок имеет 1.824 строки и рисует все спутники как единый объект `THREE.Points`, с атрибутами позиции, цвета, размера и прозрачности, обновляемыми на месте, кадр за кадром.

Рендер, который сам понижается на слабых устройствах

Шейдер на этом сайте имеет три ступени: `low` с 24 итерациями raymarching и коэффициентом пикселей 0,5, `medium` с 40 и 0,65, `high` с 80, точностью `highp` и коэффициентом, ограниченным 2. Выбор автоматический: на мобильном он опускается до `low`, а любое устройство с 4 ядрами или меньше понижает его с `high` до `medium`. Если WebGL отсутствует, компонент корректно гаснет вместо того, чтобы выбрасывать ошибку. Та же дисциплина и в остальных проектах: предел 1,6 в городской сцене и 1,75 в сцене с местностью, 1,5 на мобильном в демонстрации мира, при этом цикл рендера останавливается, когда canvas выходит за пределы экрана.

Большие сцены, которые остаются одним рисунком

Город с 9.506 зданиями не означает 9.506 объектов. Каждый отпечаток из OpenStreetMap становится `ExtrudeGeometry` без фаски и с `curveSegments: 1`, получает цвет, записанный прямо в вершины, у него удаляется атрибут `uv` — и затем всё объединяется в единую геометрию через `mergeGeometries`. Дегенеративные геометрические кольца из открытых данных пропускаются через `try`/`catch`, а не оставляются, чтобы они обрушили страницу.

Персонажи, которые лгут, помнят и сдаются при условиях

Правда дела не находится на странице. Досье пяти персонажей — биография, секрет, условие, при котором он ломается — лежат в файле, который начинается с `import "server-only"`, и его нельзя импортировать на клиенте. Персонаж сигнализирует о разблокированной подсказке через тег, который игрок не видит, а сервер принимает её только если у этого персонажа есть право давать именно эту подсказку. Модель, которая выдумывает подсказку, не принадлежащую ей, игнорируется, а не считается правдой.

Язык как механика, а не как перевод

Персонаж отвечает коротко и оборонительно на румынском, но на русском становится разговорчивым и опасно откровенным — правило записано в его досье, а первая реплика на русском повышает его доверие. Микрофон следует тому же языку (`ru-RU` или `ro-RO`). Там, где локализация классическая, мы идём дальше: симуляция роботов имеет восемь языков, при этом арабский явно помечен как письмо справа налево.

Симуляция с формулами, а не с впечатлениями

Высота прыжка масштабируется отношением гравитаций, период ходьбы — по 2π√(L/g), число Фруда — по v²/(g·L), а сопротивление воздуха — по плотности атмосферы планеты. Ёмкость батареи проходит через функцию падения по температуре с четырьмя порогами: выше 20 °C без изменений, выше 0 °C `0,85 + 0,0075·T`, выше −20 °C `0,55 + 0,015·T`, выше −40 °C `0,12 + 0,02·T`, а ниже этого — 5 %. Ходьба — это обратная кинематика с двумя сегментами, решённая по закону косинусов, с коэффициентом опоры 0,6 на цикл.

Звук и голос, которые построены, а не скачаны

Атмосфера игры-расследования не имеет ни одного аудиофайла: дождь — это розовый шум, отфильтрованный низкочастотным фильтром на 1.400 Hz и высокочастотным на 300 Hz, зацикленный; потрескивание винила — это короткие импульсы, генерируемые каждые 180 ms; гром — это вспышка шума с экспоненциальным затуханием, запланированная на 18–48 секунд. Визуальный дождь — отдельный 2D canvas, до 180 наклонённых капель. Голос работает в обе стороны: диктовка через интерфейс распознавания браузера и синтезированные реплики для каждого персонажа через ElevenLabs `eleven_multilingual_v2`, MP3 44,1 kHz / 128 kbps.

Формат 3D-модели, для которого ещё нет готового загрузчика

Роботы Unitree G1 и Go2 поставляются в MJCF, формате MuJoCo, для которого нет стандартного загрузчика для Three.js. Я его написал: 170 строк, которые читают XML, восстанавливают иерархию тел, извлекают каждый сустав с его осью и диапазоном, и загружают геометрию через `STLLoader` и `OBJLoader`. В сцену входят 67 файлов mesh, 62 MB — 29 приводимых суставов у гуманоидного робота, 12 у четвероногого, подсчитанные в блоке `<actuator>` каждой модели.

Как это выглядит

Путь, шаг за шагом.

01

Правило на бумаге, до любого пикселя

Мы пишем, что игрок получает, что теряет, что стоит действие и когда всё заканчивается. Мы передаём документ с правилами и список состояний — не moodboard. Если правило не выдерживает чтения, оно не выдерживает и отображения.

02

Играбельный прототип без ключей и без затрат

Игра-расследование проходит целиком и без единого API-ключа: путь опирается на набор из 237 строк скриптованных реплик, а голоса становятся голосами браузера. Так можно увидеть игру от начала до конца до оплаты первого токена. Ту же логику мы применяем к любому проекту: демонстрационный режим — это требование к поставке, а не утешение.

03

Бюджет рендеринга, заданный до контента

С самого начала мы определяем цель: на каком устройстве всё должно работать приемлемо, каков предел pixel ratio, сколько есть уровней качества и когда останавливается цикл. Затем контент укладывается в этот бюджет. Это порядок, обратный обычному, и именно поэтому наши сцены не падают на телефоне.

04

Что показано — помечается, что нет — тоже

Каждое отображаемое значение получает статус: измерено, выведено из источников или симулировано. Поверхность в симуляции роботов в сцене несёт метку `visual_only`, чтобы никто не спутал её с поверхностью столкновения. Мы передаём метку вместе со значением; это дополнительная работа при сборке и единственное, что сохраняет страницу честной после нашего ухода.

05

Передача вместе с тем, чего не хватает

В конце мы передаём код, активы с их лицензиями и письменный список того, что не готово. Симуляция роботов публикуется как статический build, обслуживаемый Nginx, и не имеет автоматического pipeline публикации — это написано в её собственном README, а не во внутренней заметке. Мы предпочитаем, чтобы список недостающего исходил от нас.

1Regula scrisă pehârtie2scena în browser peThree.js3treapta de randarecare coboară singurăpe dispozitiv slabAceeași ordine în toate cele cinci proiecte.
Путь, в 3 шага

Данные

К чему прикасаемся, где оно лежит и сколько остаётся

Вопросы, которые задаёт всякий, у кого есть ответственный за защиту данных, — заданы здесь раньше, чем их задаст он.

Что выходит из браузера, а что нет
В игре-расследовании сохранение хранится в `localStorage` под ключом `dosarul14-save-v1` и никуда не уходит. На сервер отправляется только разговор, обрезанный до последних 20 сообщений, максимум по 600 символов на сообщение. Ключи модели и голоса находятся исключительно на сервере, в API-маршрутах; публичная страница их никогда не видит. В демонстраторе мира голосовая команда распознаётся браузером — аудио никуда не отправляется.
Откуда берутся данные и модели
Роботы G1 и Go2 являются производными от Google DeepMind MuJoCo Menagerie и сохраняют лицензию BSD-3-Clause, с уведомлением, включённым рядом с моделью. Город в городской сцене — это OpenStreetMap поверх Copernicus DEM GLO-30, с датой снимка, записанной в файле данных (2026-07-02). Фотографии на уровне улицы каждая содержат автора, лицензию и страницу-источник. Машина в демонстраторе мира и весь декор в симуляции роботов сгенерированы из примитивов — это не купленные активы.
Происхождение, показанное, а не только соблюдённое
Городская сцена имеет режим, который перекрашивает город, чтобы показать, у каких зданий высота заявлена в OpenStreetMap, а какие выведены из количества этажей — 1.128 заявленных против 8.378 оценочных, то есть 11,9 %. Вертикальное преувеличение ×3 указано в легенде, рядом с реальным диапазоном рельефа, 37,7–155,9 м. Демонстратор мира помечает каждое изменение в сцене одним из четырех источников, а творческий слой отображается буквально как «смоделировано».
Что у нас значит «validat»
В симуляции роботов действие становится validated только после версионированного сценария, авторитетного прогона физики, независимой валидации, заявленных допусков и воспроизводимого artefact. Сегодня ни одно из них не выполняет все пять условий, поэтому все 15 помечены как `cinematic`, и интерфейс это говорит. Отчёты MuJoCo существуют и версионированы: пассивное падение humanoid на Земле прогоняется с MuJoCo 3.10.0 и шагом времени 1 ms, на модели с 31 body, 72 geometries, 30 joints и общей массой 33,341142 kg, с `sha256`-отпечатком файла. Проверка ускорения при свободном падении проходит на −9,806650 m/s² с допуском 0,049033.
Ворота, которые говорят «нет»
Запущенный 06.09.2026, верификатор доказательств проекта отвечает: детерминизм — пройден; физика — пройдена; откалиброванный стопор сочленения — ложь; квалификация для запуска — заблокирована. Причина записана: 5-мс отклик стопора не откалиброван на реальном оборудовании. Шлюз остаётся красным, пока это не так.

Случай

Симуляция обучения, которая отказывается лгать

Ситуация

Команда хочет показывать в презентациях, как ведёт себя робот на Луне по сравнению с Землёй, без того чтобы техническая аудитория в зале могла сказать: «это всего лишь анимация».

Что мы построили

Модель робота загружается из его реального формата — MJCF, через написанный нами загрузчик, с каждым сочленением и его диапазоном; у гуманоидa входят 29 приводимых сочленений. Ходьба — обратная кинематика с двумя сегментами, с коэффициентом опоры 0,6. Гравитация меняет значения в формулах, а не скорость анимации: высота прыжка масштабируется по отношению гравитаций, период шага — по 2π√(L/g), автономность батареи проходит через снижение по температуре с четырьмя порогами. Рельеф генерируется детерминированно из семени планеты — 80 м сторона, амплитуда 0,18 м на Земле и 0,58 м на Луне — и несёт в сцене метку `visual_only`, чтобы никто не принял его за поверхность столкновения. Отдельно от браузера работает численная проверка в MuJoCo, с шагом 1 ms, которая записывает результат в версионированный JSON-отчёт, с отпечатком модели.

Что получилось

Сцена открывается по ссылке, на восьми языках, включая письмо справа налево. Каждое действие в интерфейсе честно помечено — сегодня все как кинематическая предварительная версия — а сворачиваемая панель показывает точно, что было проверено численно, а что нет. Когда кто-то в зале спрашивает «это доказано?», ответ на экране, а не в речи.

Чего этот случай не говорит

Предполагает модель робота в открытом формате, с проверенной лицензией; письменный список значений, которые нужно показывать; и согласие, что непроверенные значения остаются помеченными как таковые, включая в продажных презентациях. Без третьего пункта проект — не этот.

Вопросы

О чём нас спрашивают перед тем, как позвонить

На каком движке вы строите и почему именно на нём?

Three.js поверх WebGL, в браузере. Причина практическая: результат поставки — ссылка. У вас нет установки, нет магазина, нет процесса проверки, а исправление попадает ко всем в момент публикации. Мы используем его в пяти репозиториях — версии 0.184 и 0.185 — иногда через `@react-three/fiber` и `@react-three/drei`, иногда написанным напрямую, вплоть до уровня, где мы вручную управляем атрибутами буфера. Четыре проекта сейчас открыты публично, так что это можно проверить без того, чтобы спрашивать нас.

Можете сделать в Unity или Unreal?

Мы берем их по заказу, но честный ответ начинается иначе: у нас нет ни одного поставленного проекта на Unity или Unreal. Мы проверили весь код на рабочей машине — ни одной ссылки на `UnityEngine`, ни одного файла `.uproject`, ни одного `.csproj`, ни одной макрокоманды Unreal. Движки даже не установлены. Что практически меняется, если вы выбираете один из них: поставляемый результат больше не является веб-адресом, а сборкой для каждой платформы; дистрибуция проходит через магазин или установщик; а условия лицензирования — это те, которые опубликованы Unity, соответственно Epic, на дату проекта, и мы проверяем их тогда, а не предполагаем. Как мы действуем: начинаем с платного прототипа и, если проект требует опыта работы с движком, которого у нас нет внутри, говорим об этом до договора.

Работает на телефоне?

Да, и это решение принято на этапе сборки, а не надежда. Шейдер на этом сайте имеет три ступени качества — 24, 40 и 80 итераций — и сам понижает уровень: на мобильном он стартует на самой лёгкой, а на любом устройстве с 4 ядрами или меньше максимальная ступень становится средней. Коэффициент пикселей ограничен везде: 0,5 на низкой ступени здесь, 1,5 на мобильном в демонстраторе мира, 1,6 и 1,75 в двух сценах городской карты. Когда canvas выходит за экран, цикл останавливается. Чего я не могу дать: число кадров в секунду на конкретном телефоне — у нас нет такой публикуемой метрики, поэтому мы её не выдумываем.

Игра открывается в браузере или устанавливается?

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

Кому принадлежат код и активы в конце?

Код, написанный для вашего проекта, принадлежит вам, а условия прописываются в контракте до начала работы. Для активов различие важно: те, что сгенерированы из примитивов или из публичных данных, идут без дополнительных ограничений — машина в демонстраторе мира построена из коробок, капсул и цилиндров, город в городской сцене — это OpenStreetMap поверх Copernicus DEM. Импортированные сохраняют свою лицензию: роботы Unitree — BSD-3-Clause из MuJoCo Menagerie, с уведомлением рядом с моделью. В проекте с графикой, созданной под заказ, источник и право собственности на каждый актив определяются по списку, актив за активом.

Что происходит с многопользовательским режимом?

Это самое честное ограничение, которое у нас есть. Ни в одном из пяти проектов нет общей между игроками состояния: в игре-расследовании всё хранится в `localStorage`, симуляция роботов держит состояние в памяти страницы. Игра для нескольких людей одновременно требует авторитетного сервера состояния, синхронизации и обработки сетевой задержки — новых частей, а не опции, которую можно просто отметить. Это можно построить, но это входит в проект как отдельный подсистемный модуль, со своей работой, а не как настройка.

Сколько времени нужно, чтобы увидеть что-то играбельное?

Я не дам вам число, которое не могу подтвердить. Я дам вам порядок: первая поставка — это играбельный прототип с правильным правилом и минимальной графикой, и он должен работать без какого-либо API-ключа — так же, как наша игра-расследование полностью проходит на скриптовых репликах. Только после того, как правило держится, добавляются графика, голос и модель. Если поставщик обещает срок до того, как увидит правило, он обещает то, что не измерял.

Сколько стоит держать персонажей «живыми», то есть на модели?

Расходы вы контролируете через ограничения, записанные в коде, а не надеждой. В игре-расследовании: история, отправляемая в модель, обрезается до последних 20 сообщений, сообщение игрока — до 600 символов, ответ — до 400 токенов, а максимальное время ожидания — 45 секунд. Синтез речи обрезает текст до 900 символов. Каждый из этих порогов — это линия, которую мы можем двигать вместе, с прямым влиянием на счёт. И остаётся режим без ключей, в котором игра работает на скриптовых репликах и ничего не расходует.

Чего вы не делаете?

Мы не утверждаем, что анимация физически доказана. В симуляции роботов все 15 действий помечены в коде как `cinematic`, панель доказательств объявляет `actionValidation: "none"`, а проверка запуска сегодня отвечает «Release qualification: blocked», потому что ответ 5 ms ограничителя сустава не откалиброван на реальном оборудовании. Мы не поставляем multiplayer как скрытую опцию. Мы не представляем себя как студию Unity или Unreal. И мы не помещаем demo в предложение, не сказав, публичное ли оно — наша игра-расследование, например, работает только локально и не имеет адреса.

На чём основаны утверждения выше (25 источников)
  1. Cele patru demonstratoare publice răspund 200: humanoid-sim.megapromoting.com (974 B), vision.megapromoting.com (619 B), www.megapromoting.com/satelit/ (1.160 B), relieva.vercel.app (680.122 B)https://humanoid-sim.megapromoting.com/ · https://vision.megapromoting.com/ · https://www.megapromoting.com/satelit/ · https://relieva.vercel.app/ · 2026-09-06

24 из них — код и файлы из наших репозиториев. Мы не публикуем их название и строку: вместе, на одной странице, они слишком точно описали бы, как устроены системы, которые принадлежат не только нам. Мы разбираем их вместе с тобой, в репозитории, по запросу — проверка остаётся возможной, просто она проходит в разговоре.

Что вы хотели бы наладить?

Расскажите о своём процессе. Вместе определим, что стоит построить, что можно подключить и как проверим результат.

Давайте обсудим