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>


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

相关文章
|
负载均衡 Ubuntu 应用服务中间件
ThreeJs场景中添加视频
这篇文章详细说明了如何在Three.js场景中添加并播放视频,包括视频纹理的创建与应用,以及如何将视频流显示在3D模型的表面上。
427 2
ThreeJs场景中添加视频
|
Rust 前端开发 JavaScript
前端技术新探索:从React到WebAssembly的高效之路
前端技术新探索:从React到WebAssembly的高效之路
392 2
|
9月前
|
JSON API 开发者
闲鱼商品详情API接口(闲鱼API系列)
闲鱼商品详情API为开发者提供便捷、高效且合规的途径,获取闲鱼平台上特定商品的详细信息,如标题、价格、描述和图片等。该接口采用GET请求方式,需传入app_key、item_id、timestamp和sign等参数,返回JSON格式数据。示例代码展示了如何使用Python调用此API,包括生成签名和处理响应。开发者需替换实际的app_key、app_secret和商品ID,并关注官方文档以确保接口使用的准确性。
3110 1
|
9月前
|
弹性计算 开发者
【上云基础系列-01】如何把控公网带宽费,实现低成本用云(基于单体架构)
本文主要面向开发者,介绍在单体架构下如何巧妙选择服务器和公网产品方案,实现低门槛用云。针对个人开发者和企业不同需求,推荐使用阿里云的ECS、EIP和CDT组合方案,特别是CDT提供的200GB/月免费公网流量,帮助用户显著降低网络成本。该方案不仅适合个人开发者的低成本需求,也满足初创企业和大型电商平台的扩展要求。通过灵活配置服务,用户可以在保障性能的同时实现成本节约。
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
5767 2
WebAssembly:让前端性能突破极限的秘密武器
|
编解码 监控 网络协议
如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频
本文详细介绍了如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频。内容涵盖环境搭建、编码配置、服务器端与客户端实现等方面,适合视频监控系统和直播平台等应用场景。通过具体命令和示例代码,帮助读者快速上手并实现目标。
3044 6
|
前端开发
【threejs教程】终于搞明白了!原来threejs中的透视相机这么简单!
【8月更文挑战第5天】深入学习threejs中的透视相机!
940 2
【threejs教程】终于搞明白了!原来threejs中的透视相机这么简单!
|
编解码 缓存 算法
Three.js如何降低3D模型的大小以便更快加载
为加快600MB的3D模型在Three.js中的加载速度,可采用多种压缩方法:1) 减少顶点数,使用简化工具或LOD技术;2) 压缩纹理,降低分辨率或转为KTX2等格式;3) 采用高效文件格式如glTF 2.0及draco压缩;4) 合并材质减少数量;5) 利用Three.js内置优化如BufferGeometry;6) 按需分批加载模型;7) Web Workers后台处理;8) 多模型合并减少绘制;9) 使用Texture Atlas及专业优化工具。示例代码展示了使用GLTFLoader加载优化后的模型。
1709 12
|
前端开发 NoSQL 数据库
Vue3 + Nest 实现权限管理系统 后端篇(三):基于RBAC 权限控制实现
RBAC(Role Based Access Control)是基于角色的权限控制,简单来说就是给用户赋予一些角色,那么该用户就会拥有这些角色的所有权限。接下来我们就用 NestJS 来实现基于 RBAC 的权限控制
694 0
Vue3 + Nest 实现权限管理系统 后端篇(三):基于RBAC 权限控制实现