ThreeJs场景中添加视频

        这节讲如何在threejs中添加一个视频的功能,在某些场景中可能会需要播放视频,比如在场景中方式一个大屏幕,大屏幕上需要播放视频,亦或者在场景中添加电视机的模型,电视机的画面上需要播放一些视频等。

        其实添加视频和以前介绍的添加纹理贴图一样,只不过这是添加视频的纹理贴图,让画面动起来,首先还是需要创建一个场景,包括scene,camera,renderer,OrbitControls可以根据需要添加

    initScene(){scene = new THREE.Scene();},initCamera(){this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);this.camera.position.set(100,100,100);},initRenderer(){this.renderer = new THREE.WebGLRenderer({ antialias: true });this.container = document.getElementById("container")this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);this.renderer.setClearColor('#294f9a', 1.0);this.container.appendChild(this.renderer.domElement);},initControl(){this.controls = new OrbitControls(this.camera, this.renderer.domElement);this.controls.enableDamping = true;// // 最大角度this.controls.maxPolarAngle = Math.PI / 2.2;},initAnimate() {requestAnimationFrame(this.initAnimate);this.renderer.render(scene, this.camera);},

创建完场景后,我们在场景中添加一个整体,然后在正方体的各个面都添加视频画面,

initVideo( x,y,z,width,length,videoId){//先创建一个正方体模型let geometry = new THREE.BoxGeometry(20,20,20);//获取到页面中video标签中的视频let video = document.getElementById(videoId);//将视频数据用于贴图let texture = new THREE.VideoTexture(video);//设置视频的效果texture.minFilter = THREE.LinearFilter;texture.magFilter = THREE.LinearFilter;//给每个面添加视频const material = [new THREE.MeshBasicMaterial({ map: texture}),new THREE.MeshBasicMaterial({ map: texture }),new THREE.MeshBasicMaterial({ map: texture }),new THREE.MeshBasicMaterial({ map: texture }),new THREE.MeshBasicMaterial({ map: texture }),new THREE.MeshBasicMaterial({ map: texture })]//创建网格let mesh = new THREE.Mesh(geometry, material);//设置位置mesh.position.set(x,y,z);//添加到场景中scene.add(mesh);},

最终就实现了在一个正方体的的六个面都添加视频效果,也可以根据需求将正方体设置会举矩形,类似电视机的效果,然后只在正面添加视频效果,完整的代码如下:

<template><div><div id="container"></div><video id="video" autoplay loop muted><source src="/static/video/video.mp4"></video></div>
</template><script>
import * as THREE from 'three'
import {OrbitControls} from "three/addons/controls/OrbitControls";let scene;
export default {name: "bay-single",data() {return{camera:null,water:undefined,}},methods:{initScene(){scene = new THREE.Scene();},initCamera(){this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);this.camera.position.set(100,100,100);},initVideo( x,y,z,width,length,videoId){//先创建一个正方体模型let geometry = new THREE.BoxGeometry(20,20,20);//获取到页面中video标签中的视频let video = document.getElementById(videoId);//将视频数据用于贴图let texture = new THREE.VideoTexture(video);//设置视频的效果texture.minFilter = THREE.LinearFilter;texture.magFilter = THREE.LinearFilter;//给每个面添加视频const material = [new THREE.MeshBasicMaterial({ map: texture}),new THREE.MeshBasicMaterial({ map: texture }),new THREE.MeshBasicMaterial({ map: texture }),new THREE.MeshBasicMaterial({ map: texture }),new THREE.MeshBasicMaterial({ map: texture }),new THREE.MeshBasicMaterial({ map: texture })]//创建网格let mesh = new THREE.Mesh(geometry, material);//设置位置mesh.position.set(x,y,z);//添加到场景中scene.add(mesh);},initRenderer(){this.renderer = new THREE.WebGLRenderer({ antialias: true });this.container = document.getElementById("container")this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);this.renderer.setClearColor('#294f9a', 1.0);this.container.appendChild(this.renderer.domElement);},initControl(){this.controls = new OrbitControls(this.camera, this.renderer.domElement);this.controls.enableDamping = true;// // 最大角度this.controls.maxPolarAngle = Math.PI / 2.2;},initAnimate() {requestAnimationFrame(this.initAnimate);this.renderer.render(scene, this.camera);},initPage(){this.initScene();this.initCamera();this.initRenderer();this.initControl();this.initVideo( 0, 0, 0, 200, 100 , 'video' );this.initAnimate();}},mounted() {this.initPage()}
}
</script><style scoped>
#container{position: absolute;width:100%;height:100%;overflow: hidden;
}</style>

效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/518460.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python读取influxDB数据库

1. influxDB连接 首先用InfluxDBStudio软件连接influxDB数据库来查看所有表&#xff1a; 2. 写sql语句来查询数据 然后和平时写sql查询语句一样&#xff0c;先创建连接client&#xff0c;然后调用其query函数来查询获取数据 self.client influxdb.InfluxDBClient(hostinflu…

Vue+SpringBoot打造校园疫情防控管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

制片管理工具:提高制片效率的必备工具

一、什么是制片管理工具 制片管理工具是一种为制片人提供支持和协助的软件或工具&#xff0c;并提供一种集中管理制作进度、任务分配、成本预算、资源管理和进度跟踪的方式。它可以帮助制片人在项目的开发、制作和发布方面更有效地进行规划和监督&#xff0c;确保整个流程能够…

线程安全——使用线程安全函数,多线程中执行fork引发的问题及如何解决

目录 一、引例 二、线程安全 三、多线程中执行fork 3.1 多线程中某个线程调用 fork()&#xff0c;子进程会有和父进程相同数量的线程吗? 3.2 父进程被加锁的互斥锁 fork 后在子进程中是否已经加锁 一、引例 在主线程和函数线程中进行语句分割并输出。 #include <stdi…

《Effective Modern C++》- 极精简版 1-4条

本文章属于专栏《业界Cpp进阶建议整理》 本文列出《Effective Modern C》的1-5条的个人理解的极精简版本。 Item1、模版类型推导 个人理解&#xff1a;推导规则是繁琐的&#xff0c;和运算符优先级一样&#xff0c;背下来没有意义&#xff0c;最好的办法是在使用中熟悉。常用的…

vue3: vscode自动补充ref变量的.value属性(解决方式)

操作一下步骤后&#xff0c; 然后重启vscode即可 效果图&#xff1a;

Doris入门

概念&#xff1a; 基于MPP设计理念实现的数据库&#xff0c;支持大数据集存储、实时数据分析&#xff0c;交互式数据分析等。 MPP&#xff1a;将任务并行分散至多个节点&#xff0c;由各节点单独计算&#xff0c;再将各节点计算结果汇总得到最终结果。 原理&#xff1a; FE&…

thinkphp5框架漏洞

条件&#xff1a; 根据ThinkPHP版本&#xff0c;如是5.x版本&#xff0c;即可使用ThinkPHP 5.x远程代码执行漏洞&#xff0c;无需登录&#xff0c;即可执行任意命令&#xff0c;获取服务器最高权限。 具体版本 5.x < 5.1.31 5.0.x< 5.0.23 框架介绍&#xff1a; Thi…

CC攻击的特征和防护措施

随着互联网的快速发展&#xff0c;网络攻击日益频繁。在目前的各种网络攻击中&#xff0c;CC攻击是一种常见的网络攻击手段之一。CC攻击&#xff08;也称为DDoS攻击&#xff09;是指通过大量请求或恶意流量向目标网站或服务器发送请求&#xff0c;以使其服务不可用。可能大家都…

Mysql date_format 格式化时间输出

网上的文章都是列一个大而全的表格&#xff0c;还有错误&#xff0c;我完全用不到那么多形式。遂自己开篇文章记录。 把datetime格式化为形如 2024-12-15 18:59:59的形式&#xff1a; %Y-%m-%d %H:%i:%S# 日期格式化输出select date_format(now(),%Y-%m-%d %H:%i:%S) time1,no…

如何通过3D线上科技展厅全方位展现企业创新实力?

随着数字化转型的加速&#xff0c;企业对于科技展示的需求日益增长&#xff0c;而3D线上科技展厅作为一种新兴的展示方式&#xff0c;正逐步成为企业展示科技成果、产品特性的重要工具。 一、全方位展示展品 线上科技展厅能够实现产品的全方位、多角度展示&#xff0c;这不仅增…

SAP在S4中,资产模块年结

在S4中&#xff0c;资产模块也发生了一些变化&#xff1a; 财政年度变更事务代码AJRW已经过时。它已被交易FAGLGVTR&#xff08;“总账&#xff1a;结转余额”&#xff09;取代。 资产会计中的所有APC变化都实时发布到总账中。因此&#xff0c;周期性的APC过账是没有用的&…