You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Three.js在平面几何体上添加视频?新手遇空白页问题

在Three.js平面几何体上显示视频的问题修复

嘿,我来帮你搞定这个视频纹理显示的问题~作为Three.js新手,你遇到的页面空白无报错的情况,多半是代码里几个细节没处理到位,我帮你拆解问题,再给你一个完整的可运行方案:

先说说你代码里的几个关键问题

  • 你写了new THREE.VideoTexture(videoImage),但videoImage这个变量根本没定义呀!应该直接用你获取到的video元素来创建纹理
  • texture.needsUpdate是个需要赋值的属性,得写成texture.needsUpdate = true,而且要在合适的时机(比如视频播放后或者渲染循环里)设置它
  • 视频加载是异步的,直接调用video.play()很可能因为视频还没准备好而失效,得监听视频的canplay事件再触发播放
  • 你只写了纹理和部分Mesh的代码,大概率缺失了场景、相机、渲染器这些Three.js的核心基础组件,这也是页面空白的重要原因

完整的修正代码示例

先写HTML部分(要先有一个video元素和渲染用的容器):

<video id="video" muted loop style="display:none"></video>
<div id="container"></div>

然后是JavaScript部分:

// 获取视频元素和容器
const video = document.getElementById('video');
const container = document.getElementById('container');

// 设置视频源(替换成你的视频URL)
video.src = "***VIDEO URL***";

// 初始化Three.js核心组件
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);

// 创建视频纹理
const texture = new THREE.VideoTexture(video);
texture.minFilter = THREE.LinearFilter;
texture.magFilter = THREE.LinearFilter;
texture.format = THREE.RGBFormat;
texture.crossOrigin = 'anonymous';

// 创建平面几何体和材质,组合成Mesh
const geometry = new THREE.PlaneGeometry(16, 9); // 16:9的比例适配视频
const material = new THREE.MeshBasicMaterial({ map: texture });
const planeMesh = new THREE.Mesh(geometry, material);
scene.add(planeMesh);

// 设置相机位置(确保能看到平面)
camera.position.z = 10;

// 监听视频可播放事件,开始播放并启动渲染循环
video.addEventListener('canplay', () => {
  video.play();
  // 渲染循环,每一帧更新纹理
  function animate() {
    requestAnimationFrame(animate);
    texture.needsUpdate = true; // 确保纹理每一帧都更新
    renderer.render(scene, camera);
  }
  animate();
});

// 处理窗口大小变化
window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
});

额外要注意的点

  • 浏览器自动播放策略:现在大部分浏览器禁止无用户交互的自动播放,所以最好给页面加个按钮,点击按钮再触发video.play(),比如:
    document.getElementById('playBtn').addEventListener('click', () => {
      video.play();
    });
    
  • 跨域问题:如果视频是跨域的,除了设置texture.crossOrigin = 'anonymous',还需要视频服务器配置允许跨域的响应头
  • 视频格式:确保浏览器支持你使用的视频格式(比如MP4、WebM)

内容的提问来源于stack exchange,提问作者Siva Sunkara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:32:59