В Three.js сцена является центральным объектом, который
содержит все визуальные элементы: камеры, объекты, свет и
вспомогательные элементы. Создание сцены выполняется с помощью класса
THREE.Scene:
const scene = new THREE.Scene();
После инициализации сцены можно добавлять объекты через метод
scene.add(). Все объекты сцены наследуются от
THREE.Object3D, что позволяет применять к ним
трансформации, такие как позиция, масштаб и вращение.
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);
Для визуализации сцены требуется камера. Наиболее часто используется
THREE.PerspectiveCamera, обеспечивающая перспективное
изображение:
const camera = new THREE.PerspectiveCamera(
75, window.innerWidth / window.innerHeight, 0.1, 1000
);
camera.position.set(0, 2, 5);
Управление камерой для отладки сцены удобно осуществлять с помощью
THREE.OrbitControls из официального модуля
examples/jsm/controls/OrbitControls.js. Этот контроллер
позволяет вращать, масштабировать и панорамировать сцену
интерактивно:
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
const controls = new OrbitControls(camera, renderer.domElement);
controls.update();
Основной рендерер — THREE.WebGLRenderer. Для удобства
отладки рекомендуется включать следующие параметры:
antialias: true — сглаживание краёв геометрии.physicallyCorrectLights: true — корректное физическое
освещение.shadowMap.enabled = true — отображение теней для
объектов сцены.const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
renderer.physicallyCorrectLights = true;
document.body.appendChild(renderer.domElement);
Для отладки сцены полезно использовать вспомогательные объекты: оси и
сетку. THREE.AxesHelper и THREE.GridHelper
позволяют ориентироваться в пространстве и контролировать масштаб
объектов.
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
const gridHelper = new THREE.GridHelper(10, 10);
scene.add(gridHelper);
Оси обозначают направление координат: X — красный, Y — зелёный, Z — синий.
Каждый объект сцены можно инспектировать через консоль браузера или специализированные панели отладки:
dat.GUI или lil-gui позволяет менять свойства
объектов в реальном времени:import GUI from 'lil-gui';
const gui = new GUI();
gui.add(cube.position, 'x', -5, 5);
gui.add(cube.rotation, 'y', 0, Math.PI * 2);
gui.add(cube.scale, 'z', 0.1, 3);
WebGLRenderer может выводить статистику о кадрах,
использовании памяти и геометрии.THREE.Clock и анимацииДля отладки динамических сцен важно иметь точное управление временем.
THREE.Clock позволяет отслеживать прошедшее время и
корректно синхронизировать анимации.
const clock = new THREE.Clock();
function animate() {
requestAnimationFrame(animate);
const delta = clock.getDelta();
cube.rotation.x += delta;
cube.rotation.y += delta;
controls.update();
renderer.render(scene, camera);
}
animate();
Использование delta обеспечивает независимость скорости
анимации от частоты кадров.
Для оценки производительности сцены удобно подключать библиотеку
stats.js, которая показывает FPS и нагрузку GPU:
import Stats from 'three/examples/jsm/libs/stats.module.js';
const stats = Stats();
document.body.appendChild(stats.dom);
function animate() {
requestAnimationFrame(animate);
stats.update();
renderer.render(scene, camera);
}
Комбинация stats.js и OrbitControls
позволяет наблюдать поведение сцены при интерактивной навигации и
оценивать оптимизацию объектов.
Отладка света и теней требует правильного включения источников света и свойств объектов:
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 10, 5);
light.castShadow = true;
scene.add(light);
cube.castShadow = true;
cube.receiveShadow = true;
Для контроля области тени можно использовать
light.shadow:
light.shadow.mapSize.width = 1024;
light.shadow.mapSize.height = 1024;
light.shadow.camera.near = 0.5;
light.shadow.camera.far = 50;
Для точной отладки коллизий и размеров объектов применяются
BoxHelper и Box3Helper:
const boxHelper = new THREE.BoxHelper(cube, 0xff0000);
scene.add(boxHelper);
Это позволяет визуально проверить, правильно ли позиционирован объект и как изменяется его геометрия при трансформациях.
Объекты сцены поддерживают события мыши и касания через raycasting:
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
window.addEventListener('mousemove', (event) => {
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
const intersects = raycaster.intersectObjects(scene.children, true);
if (intersects.length > 0) {
console.log('Пересечение с объектом:', intersects[0].object);
}
});
Raycasting позволяет отлаживать интерактивные элементы, проверять попадание курсора в объекты и взаимодействие с ними.
Для комплексной отладки сцены рекомендуется одновременно использовать:
AxesHelper и GridHelper для
пространственной ориентации.dat.GUI или lil-gui для динамического
изменения параметров.Stats.js для мониторинга производительности.BoxHelper для проверки размеров и границ объектов.OrbitControls для интерактивного исследования
сцены.Эта комбинация позволяет контролировать визуальные и технические аспекты сцены, выявлять ошибки трансформаций, освещения и производительности.