В Three.js спрайт (THREE.Sprite) представляет собой
плоский объект, который всегда ориентирован к камере, независимо от её
положения. Спрайты идеально подходят для реализации UI-элементов в
3D-сцене: иконок, меток, индикаторов здоровья, маркеров или любых
элементов интерфейса, которые должны оставаться «видимыми» с любого угла
обзора.
Создание спрайта начинается с текстуры и материала типа
THREE.SpriteMaterial:
const texture = new THREE.TextureLoader().load('icon.png');
const material = new THREE.SpriteMaterial({ map: texture, transparent: true });
const sprite = new THREE.Sprite(material);
scene.add(sprite);
Ключевые моменты:
map задаёт текстуру спрайта.transparent: true обеспечивает корректное отображение
альфа-канала.Спрайты по умолчанию имеют размер 1×1 в мировых координатах. Для
управления визуальным размером используют свойство
scale:
sprite.scale.set(2, 2, 1); // ширина 2, высота 2
Важно понимать, что изменение масштаба спрайта не влияет на его ориентацию — он продолжает быть «билбордом», всегда повернутым к камере.
Для интерфейсных целей часто требуется размещение спрайтов поверх 3D-сцены, имитируя HUD или аннотации. Существует два подхода:
sprite.position.copy(object.position);
const uiScene = new THREE.Scene();
const uiCamera = new THREE.OrthographicCamera(
-window.innerWidth / 2, window.innerWidth / 2,
window.innerHeight / 2, -window.innerHeight / 2,
0, 10
);
const uiSprite = new THREE.Sprite(material);
uiSprite.position.set(0, 0, 0);
uiScene.add(uiSprite);
Для живых интерфейсных элементов часто требуется менять текстуру или цвет спрайта в процессе работы:
// Замена текстуры
sprite.material.map = new THREE.TextureLoader().load('new_icon.png');
sprite.material.needsUpdate = true;
// Изменение цвета
sprite.material.color.set(0xff0000); // красный
Можно комбинировать текстуры и цвет, что позволяет создавать анимации и визуальные эффекты без сложной геометрии.
При использовании большого количества спрайтов важно учитывать производительность:
draw calls).THREE.InstancedMesh с билборд-эффектом или
специализированные библиотеки, чтобы минимизировать нагрузку на
GPU.sprite.material.rotation позволяет повернуть спрайт вокруг
его центра.sprite.material.blending можно создавать эффекты свечения,
наложения и прозрачности.depthTest позволяет всегда отображать спрайт поверх других
объектов, а depthWrite контролирует запись в буфер
глубины.Спрайты можно сочетать с THREE.Group для логической
группировки и анимации, использовать вместе с
THREE.Raycaster для взаимодействия с пользователем и
реагирования на клики или наведение. Например, спрайт-метка может менять
цвет при наведении или перемещении камеры.
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
function onMouseMove(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([sprite]);
if (intersects.length > 0) {
sprite.material.color.set(0x00ff00);
} else {
sprite.material.color.set(0xffffff);
}
}
window.addEventListener('mousemove', onMouseMove);
Использование спрайтов в Three.js обеспечивает лёгкую и гибкую
реализацию 2D-интерфейса и аннотаций в 3D-пространстве. С помощью
масштабирования, изменения текстуры, цвета и оптимизации можно создавать
визуально насыщенные UI-элементы без значительной нагрузки на
производительность. Их сочетание с билборд-ориентацией и взаимодействием
через Raycaster делает спрайты универсальным инструментом
для современных веб-приложений с 3D-графикой.