Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи? Написать
Дайджесты новостей
Лист единого HTML-файла превращается в процедурный горный ландшафт с волнами, туманом и движением солнца; рядом ноутбук показывает ту же сцену.

Интерактивные 3D-миры за 10 минут: Claude Opus 5.5 и чистый Three.js

Создание интерактивных трехмерных пространств для веба традиционно требовало участия целой команды: 3D-моделлеров, художников по текстурам и опытных фронтенд-инженеров, работающих со сложными движками вроде Unity или Unreal Engine. Однако развитие пространственного рассуждения в модели Claude Opus 5.5 открыло возможность прямого процедурного прототипирования 3D-сцен за считаные минуты.

Джулиан Голди продемонстрировал методику генерации комплексных виртуальных пространств с помощью Claude Opus 5.5 и популярной библиотеки Three.js. Главная особенность подхода — строгое ограничение на единый автономный HTML-файл без использования внешних графических ресурсов.

Процедурный подход к графике без внешних текстур

Подключение внешних картинок (текстур камня, травы или неба) в коде, сгенерированном нейросетью, часто приводит к техническим сбоям: ссылки устаревают, а браузер блокирует загрузку из-за ограничений междоменных запросов (CORS).

Решением стал отказ от растровых ассетов в пользу процедурной математической генерации. Все элементы окружения — волны на воде, рельеф гор, атмосферная дымка и цикл смены времени суток — описываются чистым кодом на JavaScript и шейдерами GLSL.

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <title>Процедурный 3D-мир</title>
  <style>
    body { margin: 0; overflow: hidden; background: #050512; }
    #viewport { width: 100vw; height: 100vh; }
  </style>
  <!-- Подключение Three.js через надежный публичный CDN -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
</head>
<body>
<div id="viewport"></div>
<script>
  // Инициализация базовой сцены и экспоненциального тумана
  const scene = new THREE.Scene();
  scene.fog = new THREE.FogExp2(0x0a0a20, 0.015);

  const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000);
  camera.position.set(0, 18, 40);
  camera.lookAt(0, 0, 0);

  const renderer = new THREE.WebGLRenderer({ antialias: true });
  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.shadowMap.enabled = true;
  document.getElementById('viewport').appendChild(renderer.domElement);

  // Настройка базового рассеянного и направленного освещения
  const ambientLight = new THREE.AmbientLight(0x223344, 1.2);
  scene.add(ambientLight);

  const sunLight = new THREE.DirectionalLight(0xffeedd, 1.6);
  sunLight.position.set(25, 45, 25);
  sunLight.castShadow = true;
  scene.add(sunLight);
</script>
</body>
</html>

Базовый каркас обеспечивает готовую графическую канву с мягкими тенями и корректной перспективой.

Процедурный ландшафт и динамический цикл суток

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

  // Генерация процедурного ландшафта на базе PlaneGeometry
  const terrainGeo = new THREE.PlaneGeometry(90, 90, 45, 45);
  terrainGeo.rotateX(-Math.PI / 2);

  const terrainMat = new THREE.MeshStandardMaterial({
    color: 0x1b3b6f,
    roughness: 0.8,
    metalness: 0.1
  });

  const terrain = new THREE.Mesh(terrainGeo, terrainMat);
  terrain.receiveShadow = true;
  scene.add(terrain);

  // Анимационный цикл со смещением источника света
  const clock = new THREE.Clock();

  function renderLoop() {
    requestAnimationFrame(renderLoop);
    const time = clock.getElapsedTime();

    // Симуляция суточного движения солнца по орбите
    sunLight.position.x = Math.sin(time * 0.25) * 50;
    sunLight.position.z = Math.cos(time * 0.25) * 50;

    renderer.render(scene, camera);
  }
  renderLoop();

  // Обработчик адаптивности при изменении размеров экрана
  window.addEventListener('resize', () => {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
  });

В результате получается файл размером менее десяти килобайт, который мгновенно открывается в любом современном браузере на компьютере или смартфоне с частотой 60 кадров в секунду.

Ключевые параметры системного промпта

Для получения стабильного результата промпт должен содержать три строгих запрета: запрет на подключение локальных изображений, требование объединять весь код строго в один тег <script> и указание явных координат для камеры и источников света.

Области практического применения

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