В Three.js класс VideoTexture позволяет
использовать видеопоток как текстуру для материалов, открывая
возможности для динамического отображения видео на 3D-объектах. Это
эффективный инструмент для создания интерактивных сцен, рекламных
панелей, экранов, анимаций и даже визуализаций в реальном времени.
Для начала необходим HTML-элемент <video>:
<video id="video" src="video.mp4" loop muted playsinline></video>
Обязательные атрибуты:
loop — повтор видео при окончании воспроизведения.muted — отключение звука, требуется для автоматического
воспроизведения в браузерах.playsinline — предотвращает открытие полноэкранного
режима на мобильных устройствах.Инициализация VideoTexture в Three.js:
const video = document.getElementById('video');
video.play();
const videoTexture = new THREE.VideoTexture(video);
videoTexture.minFilter = THREE.LinearFilter;
videoTexture.magFilter = THREE.LinearFilter;
videoTexture.format = THREE.RGBFormat;
Ключевые моменты:
minFilter и magFilter управляют
масштабированием текстуры. Для плавного отображения часто используют
LinearFilter.format определяет цветовое пространство текстуры. Для
обычного видео применяется THREE.RGBFormat.VideoTexture можно использовать в любых материалах,
поддерживающих карту текстуры, чаще всего с
MeshBasicMaterial:
const geometry = new THREE.PlaneGeometry(16, 9);
const material = new THREE.MeshBasicMaterial({ map: videoTexture });
const plane = new THREE.Mesh(geometry, material);
scene.add(plane);
PlaneGeometry хорошо подходит для экранов и панелей,
так как сохраняет пропорции видео.Видеообъект работает как обычный HTML <video>.
Можно управлять:
video.pause();
video.play();
video.currentTime = 10; // перемотка на 10 секунд
Особенности:
playbackRate:video.playbackRate = 1.5; // ускорение видео
Видео текстуры могут быть ресурсоёмкими. Основные рекомендации:
mipmaps, anisotropy) увеличивают нагрузку на
GPU.video.readyState >= video.HAVE_CURRENT_DATA.Пример проверки:
if (video.readyState >= video.HAVE_CURRENT_DATA) {
const videoTexture = new THREE.VideoTexture(video);
}
VideoTexture можно интегрировать с шейдерами:
const material = new THREE.ShaderMaterial({
uniforms: {
uVideo: { value: videoTexture }
},
vertexShader: vertexShaderCode,
fragmentShader: fragmentShaderCode
});
Это позволяет создавать эффекты:
mix в фрагментном
шейдере.muted.VideoTexture обновляется автоматически каждый кадр, но
слишком большое видео может снизить FPS сцены.getUserMedia:navigator.mediaDevices.getUserMedia({ video: true })
.then(stream => {
video.srcObject = stream;
video.play();
const videoTexture = new THREE.VideoTexture(video);
});
Это открывает возможности для интерактивных инсталляций и игр с захватом движения пользователя.
VideoTexture является мощным инструментом для динамических текстур, обеспечивая плавное отображение видео на 3D-объектах с минимальными усилиями. Его гибкость позволяет использовать стандартные HTML-видео и расширять возможности с помощью шейдеров и эффектов.