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

👨‍⚕️ 主页: gis分享者

👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录


一、🍀前言

本文详细介绍如何基于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. ☘️代码样例

html 复制代码
<!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, controls
  var initRender = () => {
    renderer = new THREE.WebGLRenderer({antialias: true})
    renderer.setSize(window.innerWidth, window.innerHeight)
    renderer.setClearColor(0xeeeeee)
    renderer.setPixelRatio(window.devicePixelRatio)
    renderer.shadowMap.enabled = true
    document.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 = true
    scene.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.RepeatWrapping
    texture.minFilter = THREE.LinearFilter
    material = 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.innerHeight
    camera.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>

效果如下:

相关推荐
gis分享者2 天前
学习threejs,通过设置纹理属性来修改纹理贴图的位置和大小
threejs·纹理贴图·位置和大小
gis分享者6 天前
学习threejs,使用设置normalMap法向量贴图创建更加细致的凹凸和褶皱
threejs·normalmap·法向量贴图
gis分享者6 天前
学习threejs,使用CubeCamera相机创建反光效果
threejs·cubecamera·立方体相机·反光效果
gis分享者12 天前
学习threejs,通过SkinnedMesh来创建骨骼和蒙皮动画
threejs·蒙皮网格·skinnedmesh·骨骼和蒙皮动画
gis分享者13 天前
学习threejs,导入FBX格式骨骼绑定模型
threejs·骨骼动画·fbx
gis分享者14 天前
学习threejs,对模型多个动画切换展示
threejs·动画切换
allenjiao14 天前
webgl threejs 云渲染(服务器渲染、后端渲染)解决方案
webgl·云渲染·threejs·服务器渲染·后端渲染·云流化·三维云渲染
gis分享者19 天前
学习threejs,使用TWEEN插件实现动画
threejs·tween·补间动画
优雅永不过时·19 天前
Three.js 原生 实现 react-three-fiber drei 的 磨砂反射的效果
前端·javascript·react.js·webgl·threejs·three