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>


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

相关文章
|
2月前
|
并行计算 API 开发者
万字详解:普通开发者如何用Ollama、llama.cpp把大模型无缝跑在本地消费级显卡上?
本文详解普通开发者如何用Ollama与llama.cpp,将7B–14B大模型高效部署于本地消费级显卡(如RTX 4060 8GB)。涵盖显存评估、量化原理(Q4_K_M等)、一键运行与精细调优、避坑指南及跨平台(CUDA/ROCm/Metal)实测数据,助你零成本、高隐私、离线可用。
|
11月前
|
存储 安全 数据管理
基于python的在线考试系统
本系统基于Python开发,旨在通过信息化手段提升各行业数据管理效率。系统具备良好的安全性、稳定性及可扩展性,支持数据高效处理与决策支持,适用于教育、医疗、旅游等多个领域,助力办公自动化与科学化管理,显著提升工作效率并降低错误率。
ThreeJs场景中添加视频
这篇文章详细说明了如何在Three.js场景中添加并播放视频,包括视频纹理的创建与应用,以及如何将视频流显示在3D模型的表面上。
798 3
ThreeJs场景中添加视频
ThreeJs添加拖动辅助线
这篇文章介绍了在Three.js中使用TransformControls组件来添加拖动辅助线,实现对3D模型在不同轴向上进行直观的拖动和平移操作。
933 0
|
机器学习/深度学习 存储 自动驾驶
《深度Q网络:在非平稳环境中破局与进化》
深度Q网络(DQN)在平稳环境中表现出色,但在非平稳环境下面临诸多挑战。例如,自动驾驶和金融市场中的动态变化导致Q值函数失效和数据分布漂移,使DQN难以适应。为此,研究者提出了改进经验回放机制、动态调整学习率和引入多模型融合等策略,以增强DQN的适应性。实际案例表明,这些改进显著提升了DQN在智能交通和工业控制中的表现。未来,进一步优化DQN在非平稳环境下的学习策略仍是关键研究方向。
386 11
|
数据处理 调度
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
8265 2
WebAssembly:让前端性能突破极限的秘密武器
|
JavaScript
ThreeJs通过DragControls实现物体拖动
这篇文章详细讲解了如何在Three.js中使用DragControls实现3D物体的鼠标拖动功能。
884 1
ThreeJs通过DragControls实现物体拖动
|
前端开发
【threejs教程】终于搞明白了!原来threejs中的透视相机这么简单!
【8月更文挑战第5天】深入学习threejs中的透视相机!
1423 2
【threejs教程】终于搞明白了!原来threejs中的透视相机这么简单!
ThreeJs设置模型的边线
这篇文章介绍了如何在Three.js中为3D模型添加边线效果,并提供了实现这一功能的代码示例。
577 2

热门文章

最新文章