Passer au contenu
megapromotingDiscutons

Expertise · Jeux et simulations

Jeux, simulations et expériences interactives qui s’ouvrent depuis un lien, construits sur Three.js au-dessus de WebGL.

Nous construisons des expériences interactives dans le navigateur : des règles qui s’appliquent, un état qui change et une raison pour laquelle l’humain fait encore un pas. Cinq projets construits sur la même pile, dont quatre ouverts publiquement dès maintenant.

Déjà construitCinci 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.

Nous construisons des jeux, des simulations et des expériences interactives qui s’ouvrent depuis un lien. Sans installation, sans magasin, sans plugin : le moteur est Three.js au-dessus de WebGL, et le public entre en appuyant sur une adresse. C’est la pile que nous pouvons montrer — cinq projets construits, dont quatre publics, tous ouverts à quiconque veut les vérifier.

Un jeu n’est pas une belle page. Ce sont des règles qui s’appliquent, un état qui change et une raison pour laquelle l’humain fait encore un pas. Dans notre jeu d’enquête, la raison est une horloge de 72 heures : une réplique vous coûte 10 minutes, un déplacement en ville 30, et à l’heure de fermeture le dossier se ferme avec vous ou sans vous. Dans la simulation de robots, la raison est la curiosité : le même robot, le même saut, une autre gravité.

La partie que nous prenons plus au sérieux que d’habitude, c’est la provenance. Dans une simulation, le mensonge le plus facile est de laisser une belle animation passer pour une physique démontrée. Dans la simulation de robots, les 15 actions de l’interface sont toutes marquées dans le code comme `cinematic`, le panneau de preuves de l’application déclare `actionValidation: "none"`, et la porte de lancement du projet répond aujourd’hui « Release qualification: blocked ». Nous préférons publier la porte qui refuse plutôt qu’une affirmation que nous ne pouvons pas soutenir.

À propos de Unity et Unreal, nous disons les choses franchement : nous les prenons sur commande, mais nous n’avons livré aucun projet dessus. Ce qui suit cette phrase — les conditions, les risques et la manière dont nous démarrons — est écrit ci-dessous, pas caché dans une note de bas de page.

Ce que cela comprend

Le travail, par composantes

D’abord la règle, ensuite le graphisme

Un prototype sans aucune texture, mais avec la bonne règle, en dit plus qu’une belle scène sans enjeu. Dans le jeu d’enquête, la règle signifie cinq personnages, huit indices dont trois sont des preuves solides, quatre motifs, quatre fins et une horloge de 72 heures dans laquelle chaque réplique coupe 10 minutes, et un déplacement 30. Les heures 00:00–07:00 sont sautées automatiquement, afin que l’horloge ne se consume pas pendant le sommeil.

La scène dans le navigateur, sur Three.js

La même bibliothèque dans cinq dépôts : Three.js 0.184–0.185, parfois via `@react-three/fiber` et `@react-three/drei`, parfois écrite directement. Deux projets utilisent la variante React ; deux autres écrivent Three.js pur, jusqu’au niveau où nous gérons manuellement les attributs de buffer. Le plus grand moteur interne a 1.824 lignes et dessine tous les satellites comme un seul objet `THREE.Points`, avec les attributs de position, couleur, taille et transparence mis à jour sur place, image par image.

Rendu qui baisse de lui-même sur les appareils faibles

Le shader de ce site comporte trois paliers : `low` avec 24 itérations de raymarching et un rapport de pixels 0,5, `medium` avec 40 et 0,65, `high` avec 80, une précision `highp` et un rapport plafonné à 2. Le choix est automatique : sur mobile il descend à `low`, et tout appareil de 4 cœurs ou moins le rétrograde de `high` à `medium`. Si WebGL est absent, le composant s’éteint proprement au lieu de lancer une erreur. La même discipline dans les autres projets : plafond 1,6 dans la scène de ville et 1,75 dans celle de terrain, 1,5 sur mobile dans le démonstrateur de monde, avec la boucle de rendu arrêtée lorsque le canvas sort de l’écran.

De grandes scènes qui restent un seul dessin

Une ville avec 9.506 bâtiments ne veut pas dire 9.506 objets. Chaque empreinte d’OpenStreetMap devient une `ExtrudeGeometry` sans chanfrein et avec `curveSegments: 1`, reçoit la couleur écrite directement dans les sommets, son attribut `uv` est supprimé — puis le tout est fusionné en une seule géométrie via `mergeGeometries`. Les anneaux géométriques dégénérés provenant des données publiques sont ignorés avec `try`/`catch`, et non laissés pour faire tomber la page.

Des personnages qui mentent, se souviennent et cèdent selon les conditions

La vérité de l’affaire ne se trouve pas dans la page. Les dossiers des cinq personnages — biographie, secret, condition dans laquelle il se brise — se trouvent dans un fichier qui commence par `import "server-only"` et ne peut pas être importé depuis le client. Le personnage signale un indice débloqué par un tag que le joueur ne voit pas, et le serveur ne l’accepte que si ce personnage a le droit de donner cet indice. Un modèle qui invente un indice qui ne lui appartient pas est ignoré, et non cru.

La langue comme mécanique, pas comme traduction

Un personnage répond brièvement et sur la défensive en roumain, mais en russe il devient loquace et dangereusement sincère — la règle est écrite dans son dossier, et la première réplique en russe augmente sa confiance. Le microphone suit la même langue (`ru-RU` ou `ro-RO`). Là où la localisation est classique, nous allons plus loin : la simulation de robots a huit langues, avec l’arabe explicitement marqué comme écriture de droite à gauche.

Simulation avec des formules, pas avec des impressions

La hauteur du saut se met à l’échelle avec le rapport des gravités, la période de marche avec 2π√(L/g), le nombre de Froude avec v²/(g·L), et la résistance de l’air avec la densité atmosphérique de la planète. L’autonomie de la batterie passe par une fonction de décroissance selon la température avec quatre seuils : au-dessus de 20 °C inchangée, au-dessus de 0 °C `0,85 + 0,0075·T`, au-dessus de −20 °C `0,55 + 0,015·T`, au-dessus de −40 °C `0,12 + 0,02·T`, et en dessous 5 %. La marche est une cinématique inverse à deux segments, résolue par la loi des cosinus, avec un facteur d’appui de 0,6 par cycle.

Son et voix construits, non téléchargés

L’atmosphère du jeu d’enquête ne contient aucun fichier audio : la pluie est un bruit rose filtré passe-bas à 1.400 Hz et passe-haut à 300 Hz, bouclé ; le crépitement du vinyle est fait d’impulsions courtes générées toutes les 180 ms ; le tonnerre est une explosion de bruit à décroissance exponentielle, programmée à 18–48 secondes. La pluie visuelle est un canvas 2D séparé, jusqu’à 180 gouttes inclinées. La voix fonctionne dans les deux sens : dictée via l’interface de reconnaissance du navigateur et répliques synthétisées par personnage via ElevenLabs `eleven_multilingual_v2`, MP3 44,1 kHz / 128 kbps.

Format de modèle 3D pour lequel il n’existe pas encore de chargeur prêt à l’emploi

Les robots Unitree G1 et Go2 viennent en MJCF, le format MuJoCo, qui ne dispose pas d’un chargeur standard pour Three.js. Je l’ai écrit : 170 lignes qui lisent le XML, reconstruisent la hiérarchie des corps, extraient chaque articulation avec son axe et son intervalle, et chargent la géométrie via `STLLoader` et `OBJLoader`. Dans la scène entrent 67 fichiers de mesh, 62 MB — 29 articulations actionnées pour l’humanoïde, 12 pour le quadrupède, comptées dans le bloc `<actuator>` de chaque modèle.

À quoi cela ressemble

Le parcours, étape par étape.

01

La règle sur papier, avant tout pixel

Nous écrivons ce que le joueur gagne, ce qu’il perd, ce que coûte une action et quand cela se termine. Nous livrons le document de règles et la liste des états — pas un moodboard. Si la règle ne tient pas à la lecture, elle ne tient pas non plus dessinée.

02

Prototype jouable sans clés et sans coûts

Le jeu d’enquête se parcourt intégralement et sans aucune clé API : le parcours repose sur un ensemble de répliques scriptées de 237 lignes, et les voix deviennent celles du navigateur. On peut ainsi voir le jeu de bout en bout avant de payer le premier token. Nous appliquons la même logique à tout projet : le mode démo est une exigence de livraison, pas une consolation.

03

Budget de rendu, défini avant le contenu

Nous fixons dès le départ la cible : quel appareil doit fonctionner correctement, quel est le plafond de rapport de pixels, combien de niveaux de qualité il y a et quand la boucle s’arrête. Ensuite, le contenu se place dans ce budget. C’est l’ordre inverse de celui habituellement suivi, et c’est la raison pour laquelle nos scènes ne s’effondrent pas sur téléphone.

04

Ce qui est démontré est étiqueté, ce qui ne l’est pas aussi

Chaque valeur affichée reçoit un statut : mesurée, déduite de sources, ou simulée. Le terrain dans la simulation de robots porte dans la scène le marquage `visual_only`, afin que personne ne le confonde avec une surface de collision. Nous livrons l’étiquette en même temps que la valeur ; c’est du travail supplémentaire à la construction et la seule chose qui maintient la page honnête après notre départ.

05

Livraison avec tout ce qui manque

À la fin, nous remettons le code, les assets avec leurs licences et la liste écrite de ce qui n’est pas prêt. La simulation de robots est publiée comme un build statique servi par Nginx et ne dispose pas de pipeline automatique de publication — c’est écrit dans son propre README, pas dans une note interne. Nous préférons que la liste des manques vienne de nous.

1Regula scrisă pehârtie2scena în browser peThree.js3treapta de randarecare coboară singurăpe dispozitiv slabAceeași ordine în toate cele cinci proiecte.
Traseul, în 3 pași

Les données

Ce que nous touchons, où elles sont et combien de temps elles restent

Les questions que pose toute personne ayant un délégué à la protection des données — posées ici avant qu'il ne les pose.

Ce qui sort du navigateur et ce qui n’en sort pas
Dans le jeu d’enquête, la sauvegarde se trouve dans `localStorage` sous la clé `dosarul14-save-v1` et ne part nulle part. Vers le serveur ne part que la conversation, tronquée aux 20 derniers messages, avec un maximum de 600 caractères par message. Les clés du modèle et de la voix restent exclusivement sur le serveur, dans les routes API ; la page publique ne les voit jamais. Dans le démonstrateur de monde, la commande vocale est reconnue par le navigateur — l’audio n’est envoyé nulle part.
D’où viennent les données et les modèles
Les robots G1 et Go2 sont dérivés de Google DeepMind MuJoCo Menagerie et conservent la licence BSD-3-Clause, avec la notification incluse à côté du modèle. La ville de la scène urbaine repose sur OpenStreetMap au-dessus de Copernicus DEM GLO-30, avec la date du cliché indiquée dans le fichier de données (2026-07-02). Les photographies au niveau de la rue portent chacune l’auteur, la licence et la page source. La voiture du démonstrateur de monde et tout le décor de la simulation de robots sont générés à partir de primitives — ce ne sont pas des assets achetés.
Provenance affichée, pas seulement respectée
La scène urbaine dispose d’un mode qui recolore la ville afin de montrer quels bâtiments ont la hauteur déclarée dans OpenStreetMap et lesquels sont déduits du nombre d’étages — 1.128 déclarés contre 8.378 estimés, soit 11,9 %. L’exagération verticale ×3 est écrite dans la légende, à côté de l’intervalle réel du terrain, 37,7–155,9 m. Le démonstrateur de monde étiquette chaque changement dans la scène avec l’une de quatre sources, et la couche créative est affichée littéralement comme « simulée ».
Ce que « validé » signifie chez nous
Dans la simulation de robots, une action ne devient validée qu’après un scénario versionné, une exécution de physique autoritaire, une validation indépendante, des tolérances déclarées et un artefact reproductible. Aujourd’hui, aucune ne remplit ces cinq conditions, donc les 15 sont marquées `cinematic` et l’interface le dit. Les rapports MuJoCo existent et sont versionnés : la chute passive de l’humanoïde sur Terre est exécutée avec MuJoCo 3.10.0 et un pas de temps de 1 ms, sur un modèle avec 31 corps, 72 géométries, 30 articulations et une masse totale de 33,341142 kg, avec l’empreinte `sha256` du fichier. La vérification de l’accélération en chute libre passe à −9,806650 m/s² avec une tolérance de 0,049033.
La gate qui dit « non »
Exécuté le 06.09.2026, le vérificateur de preuves du projet répond : déterminisme — passé ; physique — passé ; butée d’articulation calibrée — faux ; qualification pour le lancement — bloquée. Le motif est écrit : la réponse de 5 ms de la butée n’est pas calibrée sur du matériel réel. La porte reste rouge jusqu’à ce que ce soit le cas.

Un cas

Une simulation de formation qui refuse de mentir

La situation

Une équipe veut montrer dans des présentations comment un robot se comporte sur la Lune par rapport à la Terre, sans que le public technique dans la salle puisse dire « ce n’est qu’une animation ».

Ce que nous avons construit

Le modèle du robot est chargé depuis son format réel — MJCF, via notre chargeur écrit en interne, avec chaque articulation et son intervalle ; pour l’humanoïde, 29 articulations actionnées sont intégrées. La marche repose sur une cinématique inverse à deux segments, avec un facteur d’appui de 0,6. La gravité modifie les valeurs dans les formules, pas la vitesse d’une animation : la hauteur du saut se met à l’échelle selon le rapport des gravités, la période du pas selon 2π√(L/g), l’autonomie de la batterie passe par la baisse liée à la température avec quatre seuils. Le terrain est généré de façon déterministe à partir du seed de la planète — 80 m de côté, amplitude de 0,18 m sur Terre et de 0,58 m sur la Lune — et porte dans la scène le marquage `visual_only`, afin que personne ne le prenne pour une surface de collision. À part du navigateur, une validation numérique tourne dans MuJoCo, avec un pas de 1 ms, et écrit son résultat dans un rapport JSON versionné, avec l’empreinte du modèle.

Ce qui en est sorti

La scène s’ouvre depuis un lien, en huit langues, y compris avec une écriture de droite à gauche. Chaque action dans l’interface est étiquetée honnêtement — aujourd’hui, toutes comme aperçu cinématique — et un panneau déroulant montre exactement ce qui a été validé numériquement et ce qui ne l’a pas été. Quand quelqu’un dans la salle demande « est-ce démontré ? », la réponse est à l’écran, pas dans le discours.

Ce que le cas ne dit pas

Supposez un modèle du robot dans un format ouvert, avec sa licence vérifiée ; une liste écrite des valeurs à afficher ; et l’accord que les valeurs non validées restent marquées comme telles, y compris dans les présentations de vente. Sans le troisième point, le projet n’est pas celui-ci.

Questions

Ce que les gens nous demandent avant d'appeler

Sur quel moteur construisez-vous et pourquoi précisément celui-là ?

Three.js sur WebGL, dans le navigateur. La raison est pratique : le livrable est un lien. Pas d’installation, pas de boutique, pas de processus d’examen, et une correction atteint tout le monde au moment de la publication. Nous l’utilisons dans cinq dépôts — les versions 0.184 et 0.185 — parfois via `@react-three/fiber` et `@react-three/drei`, parfois écrit directement, jusqu’au niveau où nous gérons manuellement les attributs de buffer. Quatre des projets sont ouverts au public en ce moment, donc l’affirmation peut être vérifiée sans nous demander.

Pouvez-vous le faire dans Unity ou Unreal ?

Nous les prenons sur commande, mais la réponse honnête commence autrement : nous n’avons livré aucun projet sur Unity ou Unreal. Nous avons cherché dans tout le code de la machine de travail — aucune référence à `UnityEngine`, aucun fichier `.uproject`, aucun `.csproj`, aucune macrocommande Unreal. Les moteurs ne sont même pas installés. Ce qui change concrètement si vous en choisissez un : le livrable n’est plus une adresse web, mais un build par plateforme ; la distribution passe par une boutique ou un installateur ; et les conditions de licence sont celles publiées par Unity, respectivement Epic, à la date du projet, et nous les vérifions alors, nous ne les supposons pas. Comment nous procédons : nous commençons par un prototype payé et, si le projet exige une expertise moteur que nous n’avons pas en interne, nous le disons avant le contrat.

Est-ce que ça marche sur téléphone ?

Oui, et c’est une décision prise à la construction, pas un espoir. Le shader de ce site a trois niveaux de qualité — 24, 40 et 80 itérations — et descend tout seul : sur mobile il démarre au niveau le plus léger, et sur tout appareil avec 4 cœurs ou moins le niveau maximal devient celui du milieu. Le ratio de pixels est plafonné partout : 0,5 au niveau bas ici, 1,5 sur mobile dans le démonstrateur de monde, 1,6 et 1,75 dans les deux scènes de la carte urbaine. Quand le canvas sort de l’écran, la boucle s’arrête. Ce que je ne peux pas vous donner : une fréquence d’images pour un téléphone précis — nous n’avons pas une telle mesure publiable, donc nous n’en inventons pas.

Le jeu s’ouvre dans le navigateur ou s’installe-t-il ?

Tout ce que nous avons construit jusqu’à présent s’ouvre dans le navigateur. Trois projets sont des builds statiques servis par Nginx depuis notre serveur ; un est sur Vercel. Un jeu installable — ordinateur, téléphone ou console — est une autre discussion : cela suppose un compte développeur, un processus d’examen, une classification d’âge et, très probablement, un autre moteur. Aucun de nos projets n’est distribué via une boutique, donc ce serait une nouvelle voie, avec ses étapes.

Qui possède le code et les actifs à la fin ?

Le code écrit pour votre projet vous appartient, et les termes sont écrits dans le contrat avant le début du travail. Pour les actifs, la distinction compte : ceux générés à partir de primitives ou de données publiques viennent sans contraintes supplémentaires — la machine du démonstrateur de monde est construite à partir de boîtes, capsules et cylindres, la ville de la scène urbaine est OpenStreetMap au-dessus de Copernicus DEM. Ceux importés conservent leur licence : les robots Unitree sont sous BSD-3-Clause de MuJoCo Menagerie, avec la notification à côté du modèle. Dans un projet avec des graphismes créés sur commande, la source et la propriété de chaque actif sont définies sur liste, actif par actif.

Qu’en est-il du multijoueur ?

C’est la réserve la plus honnête que nous avons. Aucun des cinq projets n’a d’état partagé entre les joueurs : le jeu d’enquête garde tout dans `localStorage`, la simulation de robots garde l’état dans la mémoire de la page. Un jeu avec plusieurs personnes simultanément exige un serveur autoritaire d’état, la synchronisation et la gestion du décalage réseau — de nouvelles pièces, pas un réglage à cocher. C’est possible à construire, mais cela entre dans le projet comme sous-système séparé, avec son propre travail, pas comme une option.

Combien de temps faut-il pour voir quelque chose de jouable ?

Je ne vous donne pas un chiffre que je ne peux pas soutenir. Je vous donne l’ordre : la première livraison est un prototype jouable avec la bonne règle et le graphisme minimal, et il doit fonctionner sans aucune clé API — comme notre jeu d’enquête, qui se parcourt intégralement sur des répliques scriptées. Ce n’est qu’après que la règle tient qu’on ajoute le graphisme, la voix et le modèle. Si un fournisseur vous promet le délai avant d’avoir vu la règle, il promet quelque chose qu’il n’a pas mesuré.

Combien cela consomme-t-il de garder les personnages « vivants », c’est-à-dire sur le modèle ?

La consommation, vous la contrôlez par les limites écrites dans le code, pas par l’espoir. Dans le jeu d’enquête : l’historique envoyé au modèle est tronqué aux 20 derniers messages, le message du joueur à 600 caractères, la réponse à 400 tokens, et le temps d’attente maximal est de 45 secondes. La synthèse vocale tronque le texte à 900 caractères. Chacun de ces seuils est une ligne que nous pouvons déplacer ensemble, avec un effet direct sur la facture. Et il reste le mode sans clés, dans lequel le jeu fonctionne sur des répliques scriptées et ne consomme rien.

Que ne faites-vous pas ?

Nous ne soutenons pas qu’une animation est une physique démontrée. Dans la simulation de robots, les 15 actions sont toutes marquées dans le code comme `cinematic`, le panneau de preuves déclare `actionValidation: "none"`, et le vérificateur de lancement répond aujourd’hui « Release qualification: blocked », car la réponse de 5 ms du bloqueur d’articulation n’est pas calibrée sur du matériel réel. Nous ne livrons pas le multijoueur comme option cachée. Nous ne nous présentons pas comme studio Unity ou Unreal. Et nous ne mettons pas une démo dans l’offre sans dire si elle est publique — notre jeu d’enquête, par exemple, fonctionne seulement en local et n’a pas d’adresse.

Sur quoi reposent les affirmations ci-dessus (25 sources)
  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 d'entre elles sont du code et des fichiers de nos dépôts. Nous n'en publions ni le nom ni la ligne : réunies sur une seule page, elles décriraient trop précisément comment sont construits des systèmes qui ne sont pas seulement les nôtres. Nous les parcourons avec vous, dans le dépôt, sur demande — la vérification reste possible, elle se fait simplement lors d'un échange.

Qu'est-ce que vous voudriez voir mieux fonctionner ?

Racontez-nous votre processus. Ensemble, nous décidons ce qui vaut la peine d'être construit, ce que nous pouvons connecter et comment nous vérifions le résultat.

Discutons