Перейти до основного вмісту
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 Гц і високочастотний на 300 Гц, у циклі; потріскування вінілу — це короткі імпульси, що генеруються кожні 180 мс; грім — це вибух шуму з експоненційним спадом, запланований на 18–48 секунд. Візуальний дощ — окремий canvas 2D, до 180 нахилених крапель. Голос працює в обидва боки: диктування через інтерфейс розпізнавання браузера та синтезовані репліки для кожного персонажа через ElevenLabs `eleven_multilingual_v2`, MP3 44,1 кГц / 128 kbps.

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

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

Як це виглядає

Шлях, крок за кроком.

01

Правило на папері, перед будь-яким пікселем

Ми пишемо, що виграє гравець, що він втрачає, скільки коштує дія і коли все завершується. Ми передаємо документ правил і список станів — не moodboard. Якщо правило не витримує читання, воно не витримує й малювання.

02

Грабельний прототип без ключів і без витрат

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

03

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

Ми від початку визначаємо ціль: на якому пристрої має працювати прийнятно, яким є стелю співвідношення пікселів, скільки є рівнів якості і коли зупиняється цикл. Потім контент розміщується в цьому бюджеті. Це порядок навпаки порівняно з тим, як зазвичай роблять, і саме тому наші сцени не падають на телефоні.

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 м. Демонстратор світу позначає кожну зміну в сцені одним із чотирьох джерел, а творчий шар відображається буквально як «simulat».
Що для нас означає «validated»
У симуляції роботів дія стає validated лише після версіонованого сценарію, авторитетного запуску фізики, незалежної валідації, задекларованих допусків і відтворюваного артефакту. Сьогодні жодна не відповідає всім п’яти, тож усі 15 позначені `cinematic`, і інтерфейс це каже. Звіти MuJoCo існують і версіоновані: пасивне падіння гуманоїда на Землі запускається з MuJoCo 3.10.0 і кроком часу 1 ms, на моделі з 31 тілом, 72 геометріями, 30 суглобами та загальною масою 33,341142 kg, з `sha256`-відбитком файла. Перевірка прискорення у вільному падінні проходить на −9,806650 m/s² з допуском 0,049033.
Поріг, що каже «ні»
Запущений 06.09.2026, перевіряльник доказів проєкту відповідає: детермінізм — пройдено; фізика — пройдено; відкалібрований упор шарніра — хибно; кваліфікація до запуску — заблокована. Причина записана: відповідь упора за 5 мс не відкалібрована на реальному обладнанні. Брама лишається червоною, доки це не так.

Випадок

Симуляція навчання, яка відмовляється брехати

Ситуація

Команда хоче показати в презентаціях, як поводиться робот на Місяці порівняно із Землею, без того, щоб технічна аудиторія в залі могла сказати «це лише анімація».

Що ми збудували

Модель робота завантажується з його реального формату — MJCF, через наш написаний завантажувач, з кожним шарніром і його діапазоном; у humanoid входять 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, з повідомленням поруч із моделлю. У проєкті з графікою, створеною на замовлення, джерело і власність кожного активу визначаються списком, актив за активом.

Що відбувається з multiplayer?

Це найчесніша резервна умова, яку ми маємо. Жоден із п’яти проєктів не має спільного стану між гравцями: гра-розслідування тримає все в `localStorage`, симуляція роботів тримає стан у пам’яті сторінки. Гра для кількох людей одночасно потребує авторитарного сервера стану, синхронізації та обробки мережевої затримки — нових частин, а не опції, яку можна просто поставити галочкою. Це можна побудувати, але це входить у проєкт як окремий підсистемний модуль, зі своєю роботою, а не як опція.

Скільки часу потрібно, щоб побачити щось, у що можна грати?

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

Скільки коштує тримати персонажів «живими», тобто на моделі?

Витрати ви контролюєте через межі, записані в коді, а не через надію. У грі-розслідуванні: історія, яку надсилають до моделі, обрізається до останніх 20 повідомлень, повідомлення гравця — до 600 символів, відповідь — до 400 токенів, а максимальний час очікування — 45 секунд. Синтез голосу обрізає текст до 900 символів. Кожен із цих порогів — це межа, яку ми можемо рухати разом, із прямим впливом на рахунок. І залишається режим без ключів, у якому гра працює на скриптованих репліках і нічого не споживає.

Що ви не робите?

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

На чому ґрунтуються твердження вище (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 з них — це код і файли з наших репозиторіїв. Ми не публікуємо їхні назви чи номери рядків: разом, на одній сторінці, це надто точно описало б, як побудовані системи, які належать не лише нам. Ми проходимо їх разом із вами, у репозиторії, за запитом — перевірка залишається можливою, просто вона відбувається в розмові.

Що вам хотілося б налагодити?

Розкажіть про свій процес. Разом визначимо, що варто збудувати, що можна підключити і як перевіримо результат.

Поговорімо