CanvasTexture — это класс библиотеки
Three.js, позволяющий использовать HTML-элемент
<canvas> в качестве источника текстуры для
3D-объектов. Такой подход открывает возможность динамического создания и
обновления текстур в реальном времени без необходимости загружать
изображения с сервера.
Для начала необходимо иметь элемент <canvas> в
документе или создавать его программно:
const canvas = document.createElement('canvas');
canvas.width = 512;
canvas.height = 512;
const context = canvas.getContext('2d');
context.fillStyle = 'blue';
context.fillRect(0, 0, canvas.width, canvas.height);
context.fillStyle = 'white';
context.font = '48px Arial';
context.fillText('Three.js', 50, 100);
Создание текстуры на основе этого элемента выполняется через конструктор CanvasTexture:
const texture = new THREE.CanvasTexture(canvas);
Теперь texture можно применять к материалам:
const material = new THREE.MeshBasicMaterial({ map: texture });
const geometry = new THREE.BoxGeometry(2, 2, 2);
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
CanvasTexture наследует свойства от Texture, поэтому поддерживает все стандартные настройки текстуры:
THREE.RepeatWrapping,
THREE.ClampToEdgeWrapping,
THREE.MirroredRepeatWrapping).THREE.LinearFilter,
THREE.NearestFilter).THREE.RGBAFormat.Пример использования фильтров и оборачивания:
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set(2, 2);
texture.minFilter = THREE.LinearFilter;
texture.magFilter = THREE.LinearFilter;
Одно из главных преимуществ CanvasTexture — возможность динамически обновлять изображение:
function animate() {
requestAnimationFrame(animate);
// обновление canvas
context.clearRect(0, 0, canvas.width, canvas.height);
context.fillStyle = 'black';
context.fillRect(0, 0, canvas.width, canvas.height);
context.fillStyle = 'red';
context.font = '48px Arial';
const time = new Date().toLocaleTimeString();
context.fillText(time, 50, 100);
// уведомление текстуры о необходимости обновления
texture.needsUpdate = true;
renderer.render(scene, camera);
}
animate();
Ключевой момент: после изменения содержимого
<canvas> необходимо установить
texture.needsUpdate = true, чтобы Three.js заново
загрузил данные текстуры на видеокарту. Без этого изменения новые
рисунки на канвасе не будут видны на 3D-объекте.
canvas API.clearRect) и обновлять только изменяющиеся фрагменты.context.createPattern вместо полного
перерисовывания большого полотна.CanvasTexture поддерживает альфа-канал. Для прозрачных областей
достаточно использовать context.clearRect или задавать
прозрачный fillStyle:
context.clearRect(0, 0, canvas.width, canvas.height);
context.fillStyle = 'rgba(255, 0, 0, 0.5)';
context.fillRect(50, 50, 200, 200);
Текстура с прозрачностью корректно взаимодействует с материалами
MeshBasicMaterial,
MeshStandardMaterial и другими при установке свойства
transparent = true:
const material = new THREE.MeshBasicMaterial({
map: texture,
transparent: true
});
В сложных сценах можно создавать несколько CanvasTexture, каждая со своей уникальной визуализацией. Это удобно для:
CanvasTexture является мощным инструментом для интеграции динамической 2D-графики в 3D-сцену, позволяя гибко управлять визуализацией объектов без необходимости генерации отдельных изображений на сервере. Его использование открывает путь к интерактивным и адаптивным текстурам, которые можно обновлять в реальном времени, создавая богатую и динамичную графику.