当前位置: 首页 > news >正文

学习threejs,使用VideoTexture实现视频Video更新纹理

👨‍⚕️ 主页: gis分享者
👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录

  • 一、🍀前言
    • 1.1 ☘️VideoTexture 视频纹理
  • 二、🍀使用VideoTexture实现视频VIDEO更新纹理
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

本文详细介绍如何基于threejs在三维场景中使用VideoTexture实现视频VIDEO更新纹理,亲测可用。希望能帮助到您。一起学习,加油!加油!

1.1 ☘️VideoTexture 视频纹理

VideoTexture创建一个使用视频来作为贴图的纹理对象。
它和其基类Texture几乎是相同的,除了它总是将needsUpdate设置为true,以便使得贴图能够在视频播放时进行更新。自动创建mipmaps也会被禁用。
构造函数:
VideoTexture( video : Video, mapping : Constant, wrapS : Constant, wrapT : Constant, magFilter : Constant, minFilter : Constant, format : Constant, type : Constant, anisotropy : Number )
video – 将被作为纹理贴图来使用的Video元素。
mapping – 纹理贴图将被如何应用(映射)到物体上,它是THREE.UVMapping中的对象类型。 请参阅mapping constants(映射模式常量)来了解其他选项。
wrapS – 默认值是THREE.ClampToEdgeWrapping. 请参阅wrap mode constants(包裹模式常量)来了解其他选项。
wrapT – 默认值是THREE.ClampToEdgeWrapping. 请参阅wrap mode constants(包裹模式常量)来了解其他选项。
magFilter – 当一个纹素覆盖大于一个像素时,贴图将如何采样。 其默认值为THREE.LinearFilter。请参阅magnification filter constants(放大滤镜常量)来了解其它选项。
minFilter – 当一个纹素覆盖小于一个像素时,贴图将如何采样。 其默认值为THREE.LinearMipMapLinearFilter。请参阅minification filter constants(缩小滤镜常量)来了解其它选项。
format – 在纹理贴图中使用的格式。 请参阅format constants(格式常量)来了解各个选项。
type – 默认值是THREE.UnsignedByteType. 请参阅type constants(类型常量)来了解其他选项。
anisotropy – 沿着轴,通过具有最高纹素密度的像素的采样数。 默认情况下,这个值为1。设置一个较高的值将会比基本的mipmap产生更清晰的效果,代价是需要使用更多纹理样本。 使用renderer.getMaxAnisotropy() 来查询GPU中各向异性的最大有效值;这个值通常是2的幂。
属性:
基类Texture共有属性。
在这里插入图片描述
方法:
基类Texture共有方法。
在这里插入图片描述

二、🍀使用VideoTexture实现视频VIDEO更新纹理

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景
  • 3、初始化camera相机,定义相机位置 camera.position.set。
  • 4、初始化THREE.AmbientLight环境光源,scene场景加入环境光源,初始化THREE.DirectionalLight平行光源,设置平行光源位置,设置平行光源投影,scene添加平行光源。
  • 5、加载几何模型:创建THREE.AxesHelper坐标辅助工具helper,scene场景中加入helper。创建THREE.BoxGeometry立方体几何体geometry。通过document.querySelector(‘#video’)获取h5 video元素video。传入video参数创建THREE.VideoTexture视频贴图texture,设置texture的水平和垂直包裹、采样。传入texture参数创建THREE.MeshBasicMaterial基础材质对象material。传入geometry、material参数创建THREE.Mesh网格对象,scene场景中加入创建的网格对象。
  • 6、加入controls控制,加入stats监控器,监控帧数信息。

2. ☘️代码样例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>learn59(使用VIDEOTEXTURE实现视频VIDEO更新纹理)</title><script src="lib/threejs/127/three.js-master/build/three.js"></script><script src="lib/threejs/127/three.js-master/examples/js/controls/OrbitControls.js"></script><script src="lib/threejs/127/three.js-master/examples/js/libs/stats.min.js"></script><script src="lib/threejs/127/three.js-master/examples/js/libs/dat.gui.min.js"></script><script src="lib/js/Detector.js"></script>
</head>
<style type="text/css">html, body {margin: 0;height: 100%;}canvas {display: block;}#video {position: fixed;left: 0;bottom: 0;}
</style>
<body onload="draw()">
<video id="video" autoplay controls><source src="data/video/sintel.ogv" type='video/ogg; codecs="theora, vorbis"'><source src="data/video/sintel.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
</video>
</body>
<script>var renderer, camera, scene, gui, light, stats, controlsvar initRender = () => {renderer = new THREE.WebGLRenderer({antialias: true})renderer.setSize(window.innerWidth, window.innerHeight)renderer.setClearColor(0xeeeeee)renderer.setPixelRatio(window.devicePixelRatio)renderer.shadowMap.enabled = truedocument.body.appendChild(renderer.domElement)}var initCamera = () => {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)camera.position.set(0, 0, 15)}var initScene = () => {scene = new THREE.Scene()}var initGui = () => {}var initLight = () => {scene.add(new THREE.AmbientLight(0x444444))light = new THREE.DirectionalLight(0xffffff)light.position.set(0, 20, 20)light.castShadow = truescene.add(light)}var initModel = () => {var helper = new THREE.AxesHelper(50)scene.add(helper)var geometry = new THREE.BoxGeometry(10, 5, 5)var video = document.querySelector('#video')var texture = new THREE.VideoTexture(video)texture.wrapS = texture.wrapT = THREE.RepeatWrappingtexture.minFilter = THREE.LinearFiltermaterial = new THREE.MeshBasicMaterial({map: texture})scene.add(new THREE.Mesh(geometry, material))}var initStats = () => {stats = new Stats()document.body.appendChild(stats.dom)}var initControls = () => {controls = new THREE.OrbitControls(camera, renderer.domElement)controls.enableDamping = true}var render = () => {renderer.render(scene, camera)}var onWindowResize = () => {camera.aspect = window.innerWidth / window.innerHeightcamera.updateProjectionMatrix()renderer.setSize(window.innerWidth, window.innerHeight)}var animate = () => {render()stats.update()controls.update()requestAnimationFrame(animate)}var draw = () => {if(!Detector.webgl) Detector.addGetWebGLMessage()initRender()initScene()initCamera()initLight()initModel()initStats()initControls()animate()window.onresize = onWindowResize}
</script>
</html>

效果如下:
在这里插入图片描述

http://www.lryc.cn/news/498844.html

相关文章:

  • 怎么获取键值对的键的数值?
  • 数据结构排序算法详解
  • 在Linux设置postgresql开机自启动,创建一个文件 postgresql-15.service
  • 【kafka】消息队列的认识,Kafka与RabbitMQ的简单对比
  • ProjectSend 身份认证绕过漏洞复现(CVE-2024-11680)
  • Android笔记(三十四):onCreate执行Handler.post在onResume后才能执行?
  • 关闭模组的IP过滤功能
  • 算法分析与设计复习笔记
  • vue-amap 高德地图
  • Numpy基础练习
  • 一番赏小程序定制开发,打造全新抽赏体验平台
  • 【前端】将vue的方法挂载到window上供全局使用,也方便跟原生js做交互
  • Oracle查询优化:高效实现仅查询前10条记录的方法与实践
  • go语言编译问题
  • mobi文件转成pdf
  • MobaXterm解决中文显示乱码问题
  • 西门子 SINAMICS G120 变频器借助 ProfiNet 转 EtherCAT 实现与汇川 H5U 通讯实例
  • 流媒体之linux下离线部署FFmpeg 和 SRS
  • NOBLEROYCE罗慕路斯门窗 以精工匠造开启私属人生
  • 【算法day8】字符串:反转
  • 【C++进阶】第二节:多态
  • 梯度下降法以及 Python 实现
  • Postman cURL命令导入导出
  • Java 在Json对象字符串中查找和提取特定的数据
  • synchronized的特性
  • 领域泛化与领域自适应
  • 使用aspx,完成一个转发http的post请求功能的api接口,url中增加目标地址参数,传递自定义header参数
  • 实际车辆行驶轨迹与预设路线偏离检测的Java实现
  • 从excel数据导入到sqlsever遇到的问题
  • Linux操作系统——Linux的磁盘管理系统、文件inode及软硬链接