three.js全景视频

2023-11-07

小生最近学习three.js,将three.js官网提供的网站实例翻译翻译,共同学习。接下来翻译一下 webgl_video_panorama_equirectangular.html

运行结果https://threejs.org/examples/#webgl_video_panorama_equirectangular

<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - equirectangular video panorama</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<style>
			body {
				background-color: #000000;
				margin: 0px;
				overflow: hidden;
			}

			#info {
				position: absolute;
				top: 0px; width: 100%;
				color: #ffffff;
				padding: 5px;
				font-family:Monospace;
				font-size:13px;
				font-weight: bold;
				text-align:center;
			}

			a {
				color: #ffffff;
			}
		</style>
	</head>
	<body>

		<div id="container"></div>

		<script src="../build/three.js"></script>

		<script>
		    //原理:通过three.js建立一个球模型,将视频贴到球模型上,通过矩阵变换将视频贴到模型内部,观察点不动,通过鼠标拖动,改变相机的位置来实现全景视频的观看。
		    //当然需要将模型添加到场景中,通过渲染器不断的渲染 
			var camera, scene, renderer;
			var texture_placeholder,//多余代码
			isUserInteracting = false,//鼠标按下的标志,开始鼠标没有按下为false
			onMouseDownMouseX = 0, onMouseDownMouseY = 0,
			lon = 0,//记录水平方向的偏角,即水平角
            		onMouseDownLon = 0,//多余代码
			lat = 0,//记录竖直方向的偏角,即仰俯角
            		onMouseDownLat = 0,//多余代码
			phi = 0,//在three.js中 phi代表与xoy平面的夹角,即仰俯角
            		theta = 0, //theta代表与xoy平面的夹角, 即水平角
			distance = 500,//观察点到相机的距离,即球半径
			onPointerDownPointerX = 0,//记录鼠标按下瞬间的屏幕x值
			onPointerDownPointerY = 0,//记录鼠标按下瞬间的屏幕x值
			onPointerDownLon = 0,//记录上一次鼠标水平移动的角度.
			onPointerDownLat = 0;//记录上一次鼠标竖直移动的角度.

			init();
			animate();

			function init() {

				var container, mesh;

				container = document.getElementById( 'container' );

				camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1100);//透视投影,即远景相机,模仿人眼
				camera.target = new THREE.Vector3( 0, 0, 0 );//初始化相机观察点

				scene = new THREE.Scene();//初始化场景

				var geometry = new THREE.SphereBufferGeometry( 500, 60, 40 );//建立半径为500,水平垂直分割面分别为60,40的缓冲球面
				geometry.scale(  -1, 1, 1 );//进行缩放,进行矩阵变换,将视频贴在球内表面

				var video = document.createElement( 'video' );
				video.width = 640;
				video.height = 360;
				video.loop = true;//视频是否循环
				video.muted = true;//是否关闭音频
				video.src = "textures/pano.webm";
				video.setAttribute( 'webkit-playsinline', 'webkit-playsinline' );
				video.play();

				var texture = new THREE.VideoTexture( video );//视频纹理
				texture.minFilter = THREE.LinearFilter;//纹理在缩小时的过滤方式,默认THREE.LinearMipMapNearestFilter选择最临近的mip层,并执行线性过滤
				texture.format = THREE.RGBFormat;//像素数据的颜色格式, 默认为THREE.RGBAFormat,还有以下可选参数
			    //THREE.AlphaFormat = 1019;	//GL_ALPHA 	Alpha 值
			    //THREE.RGBFormat = 1020;		//Red, Green, Blue 三原色值
			    //THREE.RGBAFormat = 1021;	//Red, Green, Blue 和 Alpha 值
			    //THREE.LuminanceFormat = 1022;	//灰度值
			    //THREE.LuminanceAlphaFormat = 1023;	//灰度值和 Alpha 值

				var material = new THREE.MeshBasicMaterial({ map: texture });//基础网孔材料

				mesh = new THREE.Mesh( geometry, material );

				scene.add( mesh );

				renderer = new THREE.WebGLRenderer();//webGL渲染器
				renderer.setPixelRatio(window.devicePixelRatio);//返回当前设备的像素比
				renderer.setSize( window.innerWidth, window.innerHeight );
				container.appendChild( renderer.domElement );

				document.addEventListener( 'mousedown', onDocumentMouseDown, false );
				document.addEventListener( 'mousemove', onDocumentMouseMove, false );
				document.addEventListener( 'mouseup', onDocumentMouseUp, false );
				document.addEventListener( 'wheel', onDocumentMouseWheel, false );

				//

				window.addEventListener( 'resize', onWindowResize, false );

			}

			function onWindowResize() {
                	//自适应
				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( window.innerWidth, window.innerHeight );

			}
            		//鼠标按下
			function onDocumentMouseDown( event ) {

				event.preventDefault();//阻止默认行为

				isUserInteracting = true;

				onPointerDownPointerX = event.clientX;
				onPointerDownPointerY = event.clientY;

				onPointerDownLon = lon;
				onPointerDownLat = lat;
                
			}

			function onDocumentMouseMove( event ) {
				if ( isUserInteracting === true ) {
                    	//按下并移动,计算移动的角度
					lon = ( onPointerDownPointerX - event.clientX ) * 0.1 + onPointerDownLon;
					lat = (  onPointerDownPointerY -event.clientY ) * 0.1 + onPointerDownLat;
				}

			}
            		//鼠标抬起
			function onDocumentMouseUp( event ) {

				isUserInteracting = false;

			}
            		//鼠标滚轮操作,改变相机位置
			function onDocumentMouseWheel( event ) {

				distance += event.deltaY * 0.05;

			}

			function animate() {

				requestAnimationFrame( animate );
				update();

			}

			function update() {
                	//将角度转化为弧度
				lat = Math.max( - 85, Math.min( 85, lat ) );
				phi = THREE.Math.degToRad( 90 - lat );
				theta = THREE.Math.degToRad( lon );
               		 //球面坐标计算公式,相当于相机在球面移动,观察点不动
				camera.position.x = distance * Math.sin( phi ) * Math.cos( theta );
				camera.position.y = distance * Math.cos( phi );
				camera.position.z = distance * Math.sin( phi ) * Math.sin( theta );

				camera.lookAt( camera.target );

				/*
				// distortion
				camera.position.copy( camera.target ).negate();
				*/
                //渲染
				renderer.render( scene, camera );

			}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

three.js全景视频 的相关文章

  • 将动画 Maya 模型转换为 JSON 以与三个 js 一起使用

    我有一个在 Maya 2008 中完成的 Maya 模型 我需要能够将其转换为 JSON 格式以便与三个 js 一起使用 到目前为止 我已经尝试过 1 ThreeJsFileTranslator py 它是一个用于导出模型的 Maya 插件
  • 如何在 GLSL / WebGL 中将 1 个 32 位整数打包为 4 个 8 位整数?

    我正在寻求并行化一些复杂的数学 而 WebGL 看起来是实现这一目标的完美方法 问题是 您只能从纹理中读取 8 位整数 理想情况下 我希望从纹理中获取 32 位数字 我的想法是使用 4 个颜色通道来获得每像素 32 位 而不是 4 乘以 8
  • canvas 与 openGL 的功能是什么?

    我知道如果你向 openGL 发送静态且很少变化的纹理 例如像图块一样 openGL 会产生奇迹 但当你有不断变化的精灵时就不行了 是否有可能纯粹从画布上创建类似绑架这样的游戏 它的性能如何 可以使用画布创建诸如绑架之类的游戏 但最终您将在
  • WebGL:如何使对象的一部分透明?

    我在浏览器中有一个 3D 球 现在我想在它上面挖一个洞以查看它的背面 我怎样才能使它成为可能 例如 我希望立方体的白色三角形部分可以是透明的 我的意思是我们可以看到立方体后面的背景 我尝试更改片段着色器中的 alpha 代码中的区域是正方形
  • Three.js 将对象附加到骨骼

    有什么方法可以将网格连接到骨骼上吗 例如 我加载动画 js 角色 并且想将武器附加到它的手上 可以对 Bone 和 Object3D 原型进行一些简单的修改 由于骨骼继承自 Object3D 因此它们可能有子级 因此我们可以轻松地将网格添加
  • 以到最近边缘的距离为函数的着色矩形会在对角线上产生奇怪的结果

    I m trying to color a rectangle in ShaderToy GLSL in function of each pixel s distance to the nearest rectangle edge How
  • Three.js中是否有一个容器类型对象来转换一组孩子?

    Three js 中是否有一个容器或节点对象 可以将多个网格添加为子对象 以便它们可以一起转换 一个不可见的容器 允许对组中的所有子对象执行转换 thanks Example http mrdoob github com three js
  • 在 WebGL 中与 HTML 背景混合

    我正在将平面颜色和纹理绘制到 WebGL 画布中 我的颜色和纹理具有不同的 alpha 值 我希望它们能够正确混合 我想要透明背景 它们应该与画布下的 HTML 内容混合 在 WebGL 中 我使用 gl clearColor 0 0 0
  • 2D 缩放到 webgl 中的点

    我正在尝试使用 WebGL 更具体地说 是 regl 创建 2D 图形可视化 通过我当前的实现 我已经可以看到力布局应用于每个节点 这很好 当我尝试相对于当前鼠标位置进行缩放时 问题就出现了 根据我的研究 要实现这种行为 需要按以下顺序应用
  • OpenGL 和 WebGL 的 Alpha 渲染差异

    I m rendering the same scene using the same exact C code once to native OpenGL on windows and once using Emscripten to W
  • WebGL/OpenGL:根据设备方向旋转相机

    我有一个 Web 应用程序 我试图在 3D 空间中显示地图图像图块的平面 我希望无论设备如何旋转 平面始终保持水平 最终效果类似于这个航海罗盘演示 http people opera com richt release demos orie
  • 如何使用 HTML5 Canvas 作为 WebGL 纹理

    我想要 为情况 i 设置统一值 将案例 i 的计算着色器渲染为 HTML5
  • 在 Three.js 中针对“子场景”进行光线投射

    因此 我正在使用 Three js 示例中的 webgl interactive cubes html 并且我有一个相对简单的问题 是否可以测试光线与对象的子对象的相交 例如 如果我做类似的事情 for var i 0 i lt 2000
  • WebGL 渲染抗锯齿

    我正在使用 webgl 和 javascript 有没有一种方法可以在不使用抗锯齿的情况下进行渲染 我需要每个像素都是纯色的 我当前的片段着色器非常简单 precision mediump float varying highp vec3
  • 如何在 Three.js 中使用反射?

    我想在带有 Three js 的 WebGL 页面中拥有一个反射立方体表面 它应该类似于手机显示屏 反射一些光 但它仍然必须是黑色的 我创建了一个反射立方体 以及反射球体 的示例 并附有详细的注释 现场版本位于 http stemkoski
  • 3D 图形矩阵 4x4 中最后一行的 magic 4 的用途是什么?

    当我阅读有关WebGL的书时 我看到了下一个矩阵描述 有关于书中最后一行的信息 WebGL 初学者指南 初学者指南 Diego Cantor Brandon Jones 神秘的第四排 第四排没有任何特殊之处 意义 元素 m4 m8 m12
  • 将球体 a 旋转到自身的 b 点

    我试图弄清楚如何将球体从 A 点旋转到 B 点 我找到了一些Unity3d代码 Quaternion rot Quaternion FromToRotation pointA pointB sphere transform rotation
  • 重复凹凸贴图

    我正在尝试使用 Three js r55 将凹凸贴图应用到平面上 以创建一个模糊的感觉表面 这是我的代码 var mapHeight THREE ImageUtils loadTexture images felt png mapHeigh
  • 在每一帧上更新整个 VBO 是绘制许多变化的独特三角形的最有效方法吗?

    答复我之前的问题 https stackoverflow com questions 24592099 drawing many unique triangles with a single draw call for better per
  • 使用文件 API 将资源加载到 Three.js 中

    我想创建导入 3D 模型以在浏览器中查看的功能 方法是使用File API http www html5rocks com en tutorials file dndfiles Three js 加载器在我托管的文件上运行良好 我的理解是加

随机推荐

  • 微信小程序 scroll-view

    微信小程序 scroll view 用法 微信官方文档地址 https developers weixin qq com miniprogram dev component scroll view html 微信小程序 scroll vie
  • Docker部署 registry

    系列文章目录 Docker部署 registry Docker搭建 svn Docker部署 Harbor Docker 部署SQL Server 2017 Docker 安装 MS SqlServer Docker部署 Oracle12c
  • 使用WebSocket实现服务端向指定的客户端推送消息

    写这篇博客记录一下自己在用websocket的时候遇到的坑 需求是这样的 需要将activeMq来的数据利用websockt推送给客户端显示出来 有多个服务终端 需要将不同的消息推送到对应的服务终端上 1 服务端代码 需要写一个WebSoc
  • Eureka测试环境、开发环境服务宕机不踢掉处理

    SpringCloud eureka 服务宕机踢掉演示DEMO 版本信息 br springboot 1 5 9 br springcloud Dalston RC1 br 贴重点配置 br server br aidl eureka in
  • 使用Go Test测试单个文件和单个方法

    前置条件 1 文件名须以 test go 结尾 2 方法名须以 Test 打头 并且形参为 t testing T 举例 hello test go package main import testing fmt func TestHell
  • 【Android】在android中配置orientation

    参考资料 横竖屏切换 Activity 清单文件中不设置android configChanges属性时 先销毁onPause onStop onDestroy 再重新创建onCreate onStart onResume 方法 也可以 设
  • 程序员学习网站

    包括框架学习 涉及到Google源码的介绍 转载于 http www ha97 com 2908 html 程序员一般都会浏览哪些网站 转载于 http www ha97 com 2908 html 极客导航 转载于 http www go
  • RMQ(区间最值查询问题)

    简介 RMQ Range Minimum Maximum Query 问题是指 对于长度为 n 的数列 A 回答若干询问 RMQ A i j i j n 返回数列A中下标在 i j 里的最小 大 值 也就是说 RMQ问题是指求区间最值的问题
  • 算力云服务器是干啥的,云服务器将成趋势计算力和安全性是考验

    云服务器是一种简单高效 安全可靠 处理能力可弹性伸缩的计算服务 通常来说 平台的每个集群节点被部署在互联网的骨干数据中心 可以独立提供计算 存储 在线备份 托管 带宽等互联网基础设施服务 关注的是高性能吞吐量计算能力 关注的是在一段时间内的
  • 多网卡的情况下收udp组播数据的坑

    多网卡的情况下收udp组播收不到 有可能是如下原因造成 https www cnblogs com xiaouisme p 12658554 html
  • 【设计】OOA、OOD、OOP

    这三者都是 OO Object Oriented 领域的思想 一般我们我们接到产品经理的需求后 开发阶段分这样几个步骤 可行性预研阶段 此阶段评估需求是否合理 能否实现 OOA阶段 此阶段分析用例 定义领域模型 OOD阶段 此阶段定义类图
  • Chat 插件上线,免注册即可使用~

    OpenAI 新上线的 Chat 可谓是火爆出圈 这个语言对话模型可以回答问题 承认错误 挑战不正确的前提 还能帮你修改代码中的 bug Chat 的应用场景很广泛 它可以用于处理多种类型的对话 包括对话机器人 问答机器人和客服机器人等 它
  • 几种常用时钟分频实现方法

    在我们学习中 常常需要对时钟进行分频处理 本文将介绍几种常用分频方法 一 2的整数次幂分频 这种分频很简单 只需要设置一个计数器 对计数器进行计数 计数器的第i位则对应的2的i 1次幂分频 此方法适用于占空比为1 2 如果占空比不为1 2
  • CentOS7安装Docker详细步骤

    查看此文章前强烈建议先看这篇文章 Java江湖路 专栏目录 前言 记录在CentOS7中安装docker的每一个步骤 1 Docker介绍 什么是docker 虚拟化容器技术 Docker基于镜像 可以秒级的启动各种容器 每一种容器都是一个
  • 使用cloudflare-pages托管网站

    欢迎关注 攻城狮Gala 公 众 号 每天一起学习 努力成为Web3全栈 如何白嫖省心的CloudFlare Pages服务 完美替代Github Pages 对大陆网络友好 背景 之前自己重新开始写博客了 为了方便本地md笔记 参考个人笔
  • [Orangepi 3 LTS]学习记录(一)

    本章内容基于官方手册 OrangePi 3 LTS H6 用户手册 v2 4 与自己实际操作撰写 准备香橙派开发板 闪迪TF卡 性能会更好一些 TF读卡器 USB转TTL模块 串口调试 HDMI 桌面登录 一 镜像安装 1 版本选择 下载对
  • WAF防火墙

    添加依赖 一下看情况而添加 不确定需不需要 apt get install gcc libpcre3 libpcre3 dev zlib1g dev tengine依赖 sudo apt get install openssl libssl
  • Nginx里的root/index/alias/proxy_pass的意思

    1 alias 别名配置 用于访问文件系统 在匹配到location配置的URL路径后 指向 alias 配置的路径 如 注意alias配置最后一定要有 而root可以没有 location test alias home sftp img
  • LEFT JOIN 和JOIN 多表连接

    转载 https blog csdn net mccand1234 article details 51734713 四张表contract customer customer3 customer4 这是比较熟悉的3张表的连接 SELECT
  • three.js全景视频

    小生最近学习three js 将three js官网提供的网站实例翻译翻译 共同学习 接下来翻译一下 webgl video panorama equirectangular html 运行结果https threejs org examp