Three.js строится вокруг трёх ключевых компонентов: сцены, камеры и рендера. Каждое приложение начинается с создания этих объектов, которые формируют каркас 3D-пространства.
THREE.Scene) — контейнер для
всех объектов, освещения и эффектов. В неё добавляются меши, линии,
группы объектов, а также фон и туман.THREE.Camera) — точка зрения,
с которой пользователь видит сцену. Чаще всего используется
THREE.PerspectiveCamera, обеспечивающая перспективное
отображение, однако для 2D или изометрии подходит
THREE.OrthographicCamera.THREE.WebGLRenderer) — объект,
который превращает сцену и камеру в пиксели на экране. Важные параметры:
размер рендеринга (setSize) и цвет фона
(setClearColor).Создание сцены и рендера обычно происходит в начале скрипта:
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
Камеру обычно позиционируют в пространстве, чтобы она могла видеть все объекты сцены:
camera.position.set(0, 2, 5);
camera.lookAt(0, 0, 0);
Объекты в Three.js делятся на несколько категорий:
THREE.Geometry или
THREE.BufferGeometry) — набор вершин, ребер и
граней, описывающих форму. BufferGeometry предпочтительнее
для производительности.THREE.Material) —
определяют, как объект будет отображаться: цвет, текстура, отражение.
Наиболее используемые материалы: MeshBasicMaterial,
MeshStandardMaterial и MeshPhongMaterial.THREE.Mesh) — комбинация
геометрии и материала, создающая видимый объект.Пример создания меша:
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshStandardMaterial({ color: 0x0077ff });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
Для реалистичного отображения объектов необходимы источники света. В Three.js доступны несколько типов:
Пример добавления света:
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 10, 7.5);
scene.add(light);
Three.js использует цикл анимации, который обновляет сцену и перерисовывает её каждый кадр:
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
requestAnimationFrame обеспечивает плавность обновления
и синхронизацию с частотой обновления экрана.
Для взаимодействия с пользователем добавляются обработчики событий, чаще всего на изменение размеров окна или на действия мыши:
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
Для управления камерой используют контроллеры, например,
OrbitControls, позволяющий вращать камеру вокруг центра
сцены:
const controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
Для крупных проектов объекты группируют с помощью
THREE.Group, чтобы упростить трансформации:
const group = new THREE.Group();
group.add(cube);
scene.add(group);
group.rotation.y = Math.PI / 4;
Производительность зависит от количества вершин, материалов и источников света. Для оптимизации применяют:
Three.js предоставляет классы загрузчиков для текстур, моделей и шейдеров:
const textureLoader = new THREE.TextureLoader();
textureLoader.load('texture.jpg', (texture) => {
material.map = texture;
material.needsUpdate = true;
});
Для моделей используют GLTFLoader,
OBJLoader и другие:
const loader = new THREE.GLTFLoader();
loader.load('model.gltf', (gltf) => {
scene.add(gltf.scene);
});
Three.js поддерживает постобработку с использованием
EffectComposer и шейдерных эффектов:
Эффекты применяются после основного рендера и позволяют создавать профессиональные визуальные решения.
Эта структура обеспечивает гибкость и масштабируемость приложений, позволяя строить как простые визуализации, так и сложные интерактивные 3D-миры.