Threejs - 加载视频纹理渲染 实现一个3D视频播放器

简介: Threejs - 加载视频纹理渲染 实现一个3D视频播放器

前情回顾

上一篇我们大致了解了Threejs中的纹理加载器(TextureLoader)的大致使用方法,纹理最基础的用法就是在材质上贴图,将图片通过THREE.TextureLoader加载,然后设置为材质的map属性

视频作为Three.js纹理贴图(VideoTexture)

视频本质上就是一帧帧图片流构成,把视频作为Threejs模型的纹理贴图使用,就是从视频中提取一帧一帧的图片作为模型的纹理贴图,然后不停的更新的纹理贴图就可以产生视频播放的效果。
实现效果如下:1.mp4(5 MB)

image.png 主要代码如下所示:
1. 创建video播放器


<video id="video" autoplay controls loop>      <source src="../assets/v.mp4" /></video>

2. 获取video对象,使用 VideoTexture 来加载video对象实例化纹理,然后设置为网格模型材质对象的map属性


//获取到video对象var video = document.querySelector("#video");
//通过video对象实例化纹理var texture = new THREE.VideoTexture(video);texture.wrapS = texture.wrapT = THREE.ClampToEdgeWrapping;texture.minFilter = THREE.LinearFilter;
// 几何体材质对象var material = new THREE.MeshLambertMaterial({    map: texture});

当然了,创建一个三维场景是必不可少的步骤(场景,相机,渲染器)



完整代码如下:


<template>  <div>    <div ref="content"></div>    <video id="video" autoplay controls loop>      <source src="../assets/v.mp4" />    </video>  </div></template>
<script>// 引入threejsimport * as THREE from "../../public/build/three";//鼠标控制import { OrbitControls } from "../../public/example/jsm/controls/OrbitControls.js";
export default {  components: {},  data() {    return {      // 创建一个场景      scene: null,      // 创建一个相机      camera: null,      // 创建一个渲染器      renderer: null,      // 模型对象      mesh: null,      // 平面      plane: null,      // 点光源      point: null,
      // step      step: 0    };  },
  mounted() {    this.init();  },  methods: {    // 初始化    init() {      // 初始化容器      var content = this.$refs.content;
      // 创建一个场景      this.scene = new THREE.Scene();      this.scene.background = new THREE.Color("#000");
      // 创建几何体      var geometry = new THREE.BoxGeometry(100, 50, 50);
      //获取到video对象      var video = document.querySelector("#video");      //通过video对象实例化纹理      var texture = new THREE.VideoTexture(video);      texture.wrapS = texture.wrapT = THREE.ClampToEdgeWrapping;      texture.minFilter = THREE.LinearFilter;
      // 几何体材质对象      var material = new THREE.MeshLambertMaterial({        map: texture      });
      // 创建网格模型对象      this.mesh = new THREE.Mesh(geometry, material);      //设置几何体位置      this.mesh.position.x = 0;      this.mesh.position.y = 10;      this.mesh.position.z = 0;      this.scene.add(this.mesh);
      // 创建点光源      var point = new THREE.PointLight("#FFF");      point.position.set(40, 200, 300);      this.point = point;      this.scene.add(point);
      const sphereSize = 10;      const pointLightHelper = new THREE.PointLightHelper(point, sphereSize);      this.scene.add(pointLightHelper);
      //创建环境光      var ambient = new THREE.AmbientLight(0x444444);      this.scene.add(ambient);
      // 创建一个相机      this.camera = new THREE.PerspectiveCamera(        45,        window.innerWidth / window.innerHeight,        0.1,        10000      );      this.camera.position.set(0, 0, 200);      this.camera.lookAt(0, 0, 0);
      //坐标轴辅助器,X,Y,Z长度30      //   var axes = new THREE.AxesHelper(300);      //   this.scene.add(axes);      // 辅助网格      //   let gridHelper = new THREE.GridHelper(100, 100);      //   this.scene.add(gridHelper);
      // 创建渲染器      this.renderer = new THREE.WebGLRenderer({ antialias: true });      this.renderer.setSize(window.innerWidth, window.innerHeight);      this.renderer.setClearColor(0xb9d3ff, 1);      //插入 dom 元素      content.appendChild(this.renderer.domElement);
      let controls = new OrbitControls(this.camera, this.renderer.domElement);      controls.addEventListener("resize", this.render(), false);    },
    render() {      this.renderer.render(this.scene, this.camera);      // 自动旋转动画      this.mesh.rotateX(0.01);      //   this.render      requestAnimationFrame(this.render);    }  }};</script>
<style lang="scss" scoped>#video {  position: fixed;  top: 0;  left: 0;  width: 300px;  height: 200px;}</style>


本人,某个不知名小公司的前端小菜鸡,由于技术太菜,业余时间总是喜欢捣鼓一些花里胡哨的东西,一边学习一边分享,希望能够和大家一起成长,梦想着成为一位前端大大牛。

相关文章
ThreeJs场景中添加视频
这篇文章详细说明了如何在Three.js场景中添加并播放视频,包括视频纹理的创建与应用,以及如何将视频流显示在3D模型的表面上。
746 3
ThreeJs场景中添加视频
|
数据采集 运维 测试技术
软件测试之道 -- 做一个有匠心的程序员
作者一年前围绕设计模式与代码重构写了一篇《代码整洁之道 -- 告别码农,做一个有思想的程序员!》的文章。本文作为续篇,从测试角度谈程序员对软件质量的追求。
847 17
ThreeJs添加拖动辅助线
这篇文章介绍了在Three.js中使用TransformControls组件来添加拖动辅助线,实现对3D模型在不同轴向上进行直观的拖动和平移操作。
877 0
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
8129 2
WebAssembly:让前端性能突破极限的秘密武器
|
JavaScript
ThreeJs通过DragControls实现物体拖动
这篇文章详细讲解了如何在Three.js中使用DragControls实现3D物体的鼠标拖动功能。
819 1
ThreeJs通过DragControls实现物体拖动
|
JavaScript 前端开发 开发工具
五子棋小游戏(JS+Node+Websocket)可分房间对战
本文介绍了通过JS、Node和WebSocket实现的五子棋游戏,支持多人在线对战和观战功能。
689 1
五子棋小游戏(JS+Node+Websocket)可分房间对战
|
前端开发
【threejs教程】终于搞明白了!原来threejs中的透视相机这么简单!
【8月更文挑战第5天】深入学习threejs中的透视相机!
1374 2
【threejs教程】终于搞明白了!原来threejs中的透视相机这么简单!
ThreeJs设置模型的边线
这篇文章介绍了如何在Three.js中为3D模型添加边线效果,并提供了实现这一功能的代码示例。
537 2
|
存储 JavaScript vr&ar
three.js中的矩阵变换(模型视图投影变换)
three.js中的矩阵变换(模型视图投影变换)
563 1