Three.js — это высокоуровневая библиотека JavaScript, предназначенная для упрощения работы с WebGL. WebGL предоставляет низкоуровневый доступ к графическому процессору через браузер, позволяя создавать 2D и 3D графику, но требует значительного объема кода для базовых операций: создания сцен, камер, геометрий, материалов и управления рендерингом. Three.js абстрагирует эти сложности, предоставляя удобные классы и методы для быстрого создания интерактивных 3D-приложений.
Главная задача Three.js — минимизация рутинного кода и обеспечение совместимости с разными браузерами, включая особенности поддержки WebGL. Она работает поверх WebGL, но также поддерживает Canvas и SVG рендереры для упрощенных случаев. Это делает библиотеку универсальным инструментом для веб-разработки 3D-контента.
Сцена (Scene) — контейнер всех объектов, камер и
источников света. В Three.js сцена создается через класс
THREE.Scene():
const scene = new THREE.Scene();
Камера (Camera) задаёт точку зрения на сцену. Чаще всего используются:
PerspectiveCamera — перспективная камера, имитирующая
восприятие человеческого глаза.OrthographicCamera — ортографическая камера,
сохраняющая размеры объектов без перспективного сжатия.Пример создания перспективной камеры:
const camera = new THREE.PerspectiveCamera(
75, // угол обзора
window.innerWidth / window.innerHeight, // соотношение сторон
0.1, // ближняя плоскость отсечения
1000 // дальняя плоскость отсечения
);
camera.position.z = 5;
Рендерер (Renderer) отвечает за преобразование сцены
и камеры в изображение. Основной класс — WebGLRenderer.
Важные параметры: размер холста, включение или отключение антиалиасинга,
цвет фона.
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
Геометрия (Geometry) описывает форму объектов.
Three.js предоставляет набор готовых форм: BoxGeometry,
SphereGeometry, PlaneGeometry и т.д. Геометрия
состоит из вершин и индексов, определяющих, как строятся полигоны.
const geometry = new THREE.BoxGeometry(1, 1, 1);
Материал (Material) задаёт внешний вид объекта. Основные виды:
MeshBasicMaterial — простой материал без
освещения.MeshStandardMaterial — физически корректный материал,
учитывающий свет и отражение.MeshPhongMaterial — отражение и блики на
поверхности.Пример использования:
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
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);
Для создания динамических сцен используется метод
requestAnimationFrame, который вызывает функцию рендеринга
каждый кадр. Это позволяет реализовать плавную анимацию и
интерактивность.
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
Важным моментом является обновление объектов сцены до вызова
renderer.render(). Это обеспечивает согласованное
отображение всех трансформаций и анимаций.
Three.js легко интегрируется с HTML, CSS и другими
JavaScript-библиотеками. Например, можно использовать
dat.GUI для управления параметрами объектов или
GSAP для сложной анимации. Также поддерживаются
загрузка внешних моделей (форматы .glb, .gltf,
.obj) через GLTFLoader или
OBJLoader.
const loader = new THREE.GLTFLoader();
loader.load('model.gltf', function(gltf) {
scene.add(gltf.scene);
});
Поддержка разнообразных форматов и расширений делает Three.js ключевым инструментом для создания интерактивных веб-приложений с 3D-графикой.
Three.js предоставляет возможности для оптимизации:
Использование этих техник критично для сложных сцен с большим количеством объектов, обеспечивая плавный FPS даже на слабых устройствах.
Three.js обладает богатой экосистемой плагинов и утилит:
EffectComposer,
ShaderPass.Cannon.js,
Ammo.js.Raycaster для выбора
объектов и обработки событий мыши.Библиотека постоянно развивается, поддерживается большим сообществом разработчиков и активно обновляется, что обеспечивает совместимость с новыми стандартами WebGL и веб-технологий в целом.