CSS2DRenderer — это компонент библиотеки Three.js,
предназначенный для отображения HTML-элементов поверх 3D-сцены. В
отличие от стандартного рендерера WebGL, CSS2DRenderer использует DOM
для рендеринга, что позволяет легко создавать тексты, аннотации
и лейблы, которые остаются читаемыми и масштабируемыми при
вращении сцены.
Ключевой особенностью является возможность позиционирования элементов в 3D-пространстве, при этом их визуальное отображение управляется CSS. Такой подход облегчает стилизацию текста, иконок или панелей информации без сложного взаимодействия с шейдерами.
Для использования CSS2DRenderer необходимо подключить соответствующий модуль:
import { CSS2DRenderer, CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';
Создание рендерера осуществляется аналогично WebGLRenderer:
const labelRenderer = new CSS2DRenderer();
labelRenderer.setSize(window.innerWidth, window.innerHeight);
labelRenderer.domElement.style.position = 'absolute';
labelRenderer.domElement.style.top = '0px';
document.body.appendChild(labelRenderer.domElement);
Важно выставить position: absolute и привязать элемент к
body или контейнеру сцены, чтобы лейблы отображались поверх
WebGL-канвы.
Лейбл представляет собой HTML-элемент, обернутый в
CSS2DObject:
const div = document.createElement('div');
div.className = 'label';
div.textContent = 'Точка интереса';
div.style.marginTop = '-1em';
const label = new CSS2DObject(div);
label.position.set(1, 2, 3); // позиция в 3D-пространстве
scene.add(label);
Особенности:
label.position
задаёт координаты в мировом пространстве, как и для любых объектов
Three.js.div, включая шрифты, цвета, фон, анимацию.Для корректного отображения необходимо обновлять CSS2DRenderer вместе с основным рендерером:
function animate() {
requestAnimationFrame(animate);
// обновление анимации объектов сцены
renderer.render(scene, camera);
labelRenderer.render(scene, camera);
}
animate();
Важно всегда рендерить WebGLRenderer первым, а затем
CSS2DRenderer, чтобы DOM-лейблы корректно накладывались
поверх 3D-сцены.
CSS2DRenderer автоматически синхронизирует лейблы с камерой. При вращении или масштабировании сцены элементы остаются ориентированными к экрану, сохраняя читаемость текста. Лейблы можно использовать для:
Хотя рендеринг через DOM проще для текстовых аннотаций, он требует аккуратного управления количеством элементов:
display: none для скрытых объектов.При правильной настройке CSS2DRenderer позволяет создавать интерактивные, информативные и читаемые аннотации, которые невозможно реализовать стандартными средствами WebGL без сложной работы с текстурами.
CSS-класс для лейбла может включать:
.label {
color: white;
background-color: rgba(0,0,0,0.5);
padding: 2px 5px;
border-radius: 3px;
font-family: Arial, sans-serif;
font-size: 14px;
pointer-events: auto; /* позволяет взаимодействовать с элементами */
}
С помощью CSS можно добавлять тени, градиенты, анимацию появления и исчезновения, что делает лейблы не только информативными, но и эстетически привлекательными.
CSS2DRenderer отлично работает совместно с
CSS3DRenderer, позволяя комбинировать плоские
аннотации и полноценные 3D-DOM-объекты. При
этом 2D-лейблы остаются всегда ориентированными к камере, а
3D-DOM-элементы полностью интегрируются в пространство.
THREE.Group
для удобного управления видимостью и позиционированием.CSS2DRenderer обеспечивает эффективный способ добавления информативных аннотаций, улучшая визуальное восприятие сцены без сложной работы с текстурами и шейдерами.