Skip to main content
Glama

🍝 Renderoni

3D веб-игры, подаваемые аль денте.
Движок 3D с полным набором функций, родной для агентов, для Three.js и Rapier.
Детерминированная физика WebAssembly, декларативные пресеты и встроенный протокол контекста модели (MCP) для парного программирования с ИИ.

CI Deploy Pages License: MIT TypeScript MCP


⚡ Проблема и решение

Создание 3D-игр с Three.js и Rapier WebAssembly обычно означает написание тысяч строк шаблонного кода: циклы с фиксированным шагом, интерполяция трансформаций, контроллер персонажа, пространственный звук, системы частиц и проекции интерфейса.

В то же время ИИ-агенты для кодирования (Claude, Gemini, Cursor) испытывают трудности с 3D-движками, потому что игровые циклы являются недетерминированными чёрными ящиками, требующими дорогих скриншотов для визуального анализа.

Renderoni даёт вам и то, и другое:

  • Для людей: Декларативный 3D-движок с полным набором функций. Один вызов createRenderoni() запускает физику, рендеринг, управление камерой, пространственный звук, автоматы анимации и системы частиц с типизированными пресетами.

  • Для ИИ-агентов и безголового CI: Детерминированное ядро симуляции со встроенным сервером Model Context Protocol (MCP). Агенты просматривают сцены через лёгкие семантические Markdown-описания (<500 байт / ~120 токенов), отправляют типизированные действия и проверяют состояние игры безголово в Node.js менее чем за 10 мс.


Related MCP server: maige-3d-mcp

🎮 Живые демо

Попробуйте интерактивную игровую площадку прямо в браузере: elemarin.github.io/renderoni (или запустите npm run dev локально).

Демо

Что делает

Управление

🪙 Quickstart Demo

Живая интерактивная браузерная реализация quickstart из README: герой, вращающаяся золотая монета-сенсор, звуковой сигнал и VFX с частицами.

WASD / Стрелки (Двигать героя), Space (Прыжок), Кнопка 🪙 Возродить монету

✈️ Flight Simulator

Аэродинамическая физика полёта с подъёмной силой, сопротивлением, взлётом и посадкой на взлётную полосу, убирающимся шасси и кольцевой трассой.

W/S (Тангаж), A/D (Рыскание), Q/E (Крен), Shift/Ctrl (Газ), Z/X (Макс/Отсечка), G (Шасси), C (Вид из кабины/преследование), R (Сброс)

🧱 Vast Voxel Sandbox

Многобиомный процедурный мир (~2 000+ блоков) с океанской водой, песчаными пляжами, холмами, заснеженными вершинами и деревьями.

WASD (Ходьба и автошаг), Shift (Спринт), Space (Прыжок), 1-6 (Панель быстрого доступа), ЛКМ/ПКМ (Разрушить/Поставить)

🔦 PSX 3rd-Person Horror

Ретро-хоррор в стиле PSX с камерой от третьего лица, коридором готического особняка, фонариком, головоломкой с ключом и анимированными железными воротами.

WASD (Прогулка детектива), Мышь (Вращение камеры), E (Подобрать ключ и открыть ворота)


📦 Установка

npm install renderoni three @dimforge/rapier3d-compat

Экспорты с поддержкой tree-shaking по подпутям:

import { createRenderoni } from 'renderoni';
import { body, kccPlayer, sensor, light } from 'renderoni/presets';
import { audio } from 'renderoni/audio';
import { animation } from 'renderoni/animation';
import { vfx } from 'renderoni/vfx';
import { ui } from 'renderoni/ui';
import { createMCPServer } from 'renderoni/mcp';
import 'renderoni/testing/matchers';

🚀 Быстрый старт

import { createRenderoni } from 'renderoni';
import { body, kccPlayer, sensor, light } from 'renderoni/presets';
import { audio } from 'renderoni/audio';
import { vfx } from 'renderoni/vfx';

// 1. Initialize engine (runs headlessly in CI or interactively in browser)
const game = await createRenderoni({
  mode: 'interactive', // or 'headless'
  seed: 42,
  subsystems: [
    audio({ volume: 0.8 }),
    vfx({ particles: true }),
  ],
});

// 2. Add Environment & Lighting
game.add(light({ type: 'directional', position: [20, 40, 20] }));
game.add(body({ shape: 'box', type: 'fixed', size: [100, 1, 100], position: [0, 0, 0] }));

// 3. Add Collectible Item
const coin = game.add(sensor({
  id: 'golden_coin',
  shape: 'sphere',
  radius: 0.6,
  position: [4, 1.2, 0],
}));

// 4. Add Player Character
const player = game.add(kccPlayer({
  id: 'hero',
  position: [0, 1.5, 0],
  moveSpeed: 6.5,
}));

// 5. Handle Gameplay Events
game.events.on('sensor.enter', ({ sensor, target }) => {
  if (sensor.id === 'golden_coin' && target.id === 'hero') {
    game.audio.play('coin_pickup');
    game.vfx.spawnParticles({ count: 16, position: [4, 1.2, 0] });
    coin.destroy();
  }
});

// 6. Run headlessly (CI/Tests) or start interactive render loop (Browser)
game.step(60);   // Step 60 fixed ticks in ~1ms (Headless CI)
// game.start(); // Start 60fps presentation loop (Browser)

🤖 Интеграция с ИИ-агентами (MCP-сервер)

Подключите Claude Desktop, Antigravity, Cursor или любой MCP-клиент напрямую к вашей симуляции:

{
  "mcpServers": {
    "renderoni": {
      "command": "npx",
      "args": ["renderoni", "mcp"]
    }
  }
}

Встроенные инструменты MCP:

  • describe: Возвращает активные сущности, коллайдеры, теги и схемы движка.

  • observe: Возвращает сверхплотные сводки в Markdown Тир 0 (<500B / ~120 токенов) с позициями, скоростями и состоянием игры.

  • act: Внедряет детерминированные семантические игровые действия (game.act({ name, payload })).

  • step: Продвигает симуляцию на $N$ фиксированных тиков и возвращает хеши состояния.

  • check: Вычисляет утверждения машинного AST.


🧪 Безголовое тестирование с Vitest

Запускайте полные интеграционные тесты игры безголово в Node.js менее чем за 10 мс с помощью пользовательских матчеров Vitest:

import { expect, test } from 'vitest';
import { createRenderoni } from 'renderoni';
import { kccPlayer, sensor } from 'renderoni/presets';
import 'renderoni/testing/matchers';

test('player collects coin and verifies state hash', async () => {
  const game = await createRenderoni({ mode: 'headless', seed: 42 });
  const hero = game.add(kccPlayer({ id: 'hero', position: [0, 1, 0] }));
  const coin = game.add(sensor({ id: 'coin', position: [3, 1, 0] }));

  hero.actions.move({ x: 1, z: 0 });
  game.step(60);

  expect(game).toHaveTick(60);
  expect(hero.position[0]).toBeGreaterThan(1.5);
  expect(game).toHavePassedDiagnostics();
});

🏛️ Архитектура

┌────────────────────────────────────────────────────────────────────────┐
│                              L3 APPLICATION                            │
│           Game Rules, Custom Assets, Levels, Shaders, UI Layouts       │
├────────────────────────────────────────────────────────────────────────┤
│                           L2 TOOLING & AGENTS                          │
│     Built-in MCP Server (stdio/SSE), Vitest Matchers, Live Inspector   │
├────────────────────────────────────────────────────────────────────────┤
│                         L1 BATTERIES & SUBSYSTEMS                      │
│   Spatial Audio • Skeletal Animation • UI Projections • VFX Emitters   │
│   Declarative Presets: body, sensor, light, kccPlayer, dynamicPlayer   │
├────────────────────────────────────────────────────────────────────────┤
│                          L0 DETERMINISTIC KERNEL                       │
│   Integer Tick Clock • Seeded PRNG • Dual-Buffer Transform Pipeline    │
│   Quantized State Hashing (XXH3) • Resource Ownership Tracking         │
├────────────────────────────────────────────────────────────────────────┤
│                             NATIVE ENGINES                             │
│       Three.js (WebGL / WebGPU)   │   @dimforge/rapier3d-compat (WASM) │
└────────────────────────────────────────────────────────────────────────┘

📜 Лицензия

MIT © Esteban Leandro Marín

Related MCP Connectors

Related MCP Servers