Сцена в Three.js (THREE.Scene) является центральным
контейнером, который хранит все объекты, камеры, источники света и
вспомогательные элементы, участвующие в рендеринге 3D-сцены. Она
определяет пространство, в котором происходят все
взаимодействия, и предоставляет методы для управления иерархией
объектов.
Создание сцены выполняется через конструктор:
const scene = new THREE.Scene();
По умолчанию сцена пустая. После создания сцены необходимо добавить объекты, свет и камеру.
Все объекты в Three.js наследуются от класса
THREE.Object3D. Это может быть:
THREE.Mesh) с материалом
(THREE.Material)THREE.Camera)THREE.Light)THREE.Group) для организации объектовПример добавления простого куба:
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
Объекты можно добавлять по одному или группами,
используя метод add():
const group = new THREE.Group();
group.add(cube);
scene.add(group);
THREE.Scene поддерживает древовидную структуру объектов.
Любой объект может быть родителем для других объектов, что позволяет
применять трансформации на уровне группы, а не
отдельных элементов:
position) — перемещение
объекта в пространстве сцены.rotation) — ориентация
объекта по осям X, Y, Z.scale) — размер объекта в
пространстве сцены.matrix) —
внутреннее представление всех преобразований.Изменения родительского объекта автоматически влияют на дочерние. Например, вращение группы повернет все её дочерние объекты.
Сцена может иметь фон и туман:
scene.background = new THREE.Color(0x87ceeb); // Цвет фона
scene.fog = new THREE.Fog(0x87ceeb, 10, 50); // Линейная туманность
Фон может быть цветом, текстурой (THREE.Texture) или
кубической текстурой (THREE.CubeTexture) для создания
окружения. Туман добавляет глубину и реалистичность, особенно в больших
сценах.
Свет добавляется как объекты сцены, так же, как геометрия:
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(5, 10, 7.5);
scene.add(directionalLight);
Сцена не рендерится без источников света при использовании
материалов, требующих освещения (MeshStandardMaterial,
MeshLambertMaterial).
После добавления объектов и света необходимо обновлять трансформации и анимацию объектов перед рендером:
function animate() {
requestAnimationFrame(animate);
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
Сцена хранит все объекты, но сама не рендерится — для этого
используется объект THREE.WebGLRenderer.
Сцена допускает хранение произвольных данных, которые могут использоваться для управления логикой игры или приложения:
scene.userData.score = 0;
Это удобно для хранения глобального состояния, связанного с конкретной сценой.
scene.remove(object) освобождает память.Сцена сама по себе не обрабатывает события, но объекты сцены могут
быть источниками событий через raycaster, что позволяет
реализовать интерактивность.
Обычно структура сцены выглядит следующим образом:
scene
├── group (например, "environment")
│ ├── mesh1
│ └── mesh2
├── mesh (например, "player")
├── camera
├── lights
└── дополнительные элементы (particles, helpers)
Такой подход упрощает управление сложными сценами и позволяет масштабировать проект без потери производительности.