前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >现在做 Web 全景合适吗?

现在做 Web 全景合适吗?

作者头像
企鹅号小编
发布于 2018-01-08 06:57:09
发布于 2018-01-08 06:57:09
4.6K0
举报
文章被收录于专栏:企鹅号快讯企鹅号快讯

Web 全景在以前带宽有限的条件下常常用来作为街景和 360° 全景图片的查看。它可以给用户一种 self-immersive 的体验,通过简单的操作,自由的查看周围的物体。随着一些运营商推出大王卡等免流服务,以及 4G 环境的普及,大流量的应用也逐渐得到推广。比如,我们是否可以将静态低流量的全景图片,变为动态直播全景视频呢?在一定网速带宽下,是可以实现的。后面,我们来了解一下,如何在 Web 端实现全景视频。先看一下实例 gif:

tl;dr;

使用 three.js 实现全景技术

UV 映射原理简介

3D 坐标原理和移动控制

Web 陀螺仪简介

iv-panorama 简单库介绍

基于 Three.js

全景视频是基于 3D 空间,而在 Web 中,能够非常方便触摸到 3D 空间的技术,就是 WebGL。为了简化,这里就直接采用 Three.js 库。具体的工作原理就是将正在播放的 video 元素,映射到纹理(texture) 空间中,通过 UV 映射,直接贴到一个球面上。精简代码为:

具体的过程差不多就是上面的代码。上面代码中有两块需要注意一下,一个是 相机的视野范围值,一个是几何球体的相关参数设置。

相机视野范围

具体代码为:

这里主要利用透视类型的相机,模拟人眼的效果。设置合适的视野效果,这里的范围还需要根据球体的直径来决定,通常为 2*radius + 100,反正只要比球体直径大就行。

几何球体的参数设置

上面其实有两个部分需要讲解一下

球体参数设置里面有三个属性值比较重要,该 API 格式为: 。

raidus: 设置球体的半径,半径越大,视频在 canvas 上绘制的内容也会被放大,该设置值合适就行。

width/height Segments: 切片数,主要用来控制球体在宽高两个维度上最多细分为多少个三角切片数量,越高纹理拼接的边角越清晰。不过,并不是无限制高的,高的同时性能损耗也是有的。

在几何绘制时,通过坐标变换使 X 轴的像素点朝内,让用户看起来不会存在 凸出放大的效果。具体代码为: 。

UV 映射

上面只是简单介绍了一下代码,如果仅仅只是为了应用,那么这也就足够了。但是,如果后面遇到优化的问题,不知道更底层的或者更细节内容的话,就感觉很尴尬。在全景视频中,有两个非常重要的点:

UV 映射

3D 移动

这里,我们主要探索一下 UV 映射的细节。UV 映射主要目的就是将 2D 图片映射到三维物体上,最经典的解释就是:

盒子是一个三维物体,正如同加到场景中的一个曲面网络("mesh")方块.如果沿着边缝或折痕剪开盒子,可以把盒子摊开在一个桌面上.当我们从上往下俯视桌子时,我们可以认为U是左右方向,V是上下方向.盒子上的图片就在一个二维坐标中.我们使用U V代表"纹理坐标系"来代替通常在三维空间使用的 X Y.在盒子重新被组装时,纸板上的特定的UV坐标被对应到盒子的一个空间(X Y Z)位置.这就是将2D图像包裹在3D物体上时计算机所做的.

from 浙江研报

这里,我们通过代码来细致讲解一下。我们需要完成一个贴图,将如下的 sprite,贴到一个正方体上。

from iefreer

这里,我们先将图片加载到纹理空间:

那么,现在我们有一个如下的纹理空间区域:

这块内容,就实际涉及到 WebGL 的知识,纹理空间和物理空间并不是在一块,WebGL 中的 GLSL 语法,就是将纹理内容通过相关规则,映射到指定的三角形区域的表面。

这里需要注意的是,纹理空间并不存在所谓的最小三角区域,这里适应的只是在物理空间中划分的三角区域。为了简单起见,我们设置的 boxGeometry 只使用单位为 1 的 Segments,减少需要划分的三角形数量。

这样,就存在 12 块需要贴的三角区域。这里,我们就需要利用 来手动划分一下纹理空间的区域,实际在映射的时候,就是按顺序,将物理空间的定点 和 纹理空间的定点一一映射,这样就实现了将纹理和物理空间联系到一起的步骤。

因为,Three.js 中 在划分物理空间时,定义的面分解三角形的顺序 是 根据逆时针方向,按序号划分,如下图所示:

根据上图的定义,我们可以得到每个几何物体的面映射到纹理空间的坐标值可以分为:

所以,我们需要定义一下纹理坐标值:

定点 UV 映射 API 具体格式为:

则定义具体面的映射为:

如果,你写过原生的 WebGL 代码,对于理解 UV 映射原理应该很容易了。

3D 移动原理

这里需要注意的是 Web 全景不是 WebVR。全景没有 VR 那种沉浸式体验,单单只涉及三个维度上的旋转而没有移动距离这个说法。

上面的描述中,提到了三维,旋转角度 这两个概念,很容易让我们想到《高中数学》学到的一个坐标系--球坐标系(这里默认都是右手坐标系)。

φ 是和 z 轴正方向

∂ 是和 x 轴正方向

p 是空间点距离原点的直线距离

计算公式为:

现在,如果应用到 Web 全景,我们可以知道几个已知条件:

p:定义的球体(SphereBufferGeometry)的半径大小

∆φ:用户在 y 轴上移动的距离

∆∂:用户在 x 轴上移动的距离

p 这个是不变的,而 ∆φ 和 ∆∂ 则是根据用户输入来决定的大小值。这里,就需要一个算法来统一协定。该算法控制的主要内容就是:

用户的手指在 x/y 平面轴上的 ∆x/∆y 通过一定的比例换算成为 ∆φ/∆∂

如果考虑到陀螺仪就是:

用户的手指在 x/y 平面轴上的 ∆x/∆y 通过一定的比例换算成为 ∆φ/∆∂,用户在 x/y 轴上旋转的角度值 ∆φ'/∆∂',分别和视角角度进行合并,算出结果。

为了更宽泛的兼容性,我们这里根据第二种算法的描述来进行讲解。上面 ∆φ/∆∂ 的变动主要映射的是我们视野范围的变化。

在 Threejs 中,就是用来控制相机的视野范围。那我们如何在 ThreeJS 控制视野范围呢?下面是最简代码:

这里主要模拟地球坐标:

lat 代表维度(latitude): 用户上下滑动改变的值,或者手机上下旋转

lon 代表经度(lontitude): 用户左右滑动改变的值,或者手机左右旋转

具体内容为:

在通常实践当中,改变全景视角的维度有两种,一种直接通过手滑,一种则根据陀螺仪旋转。

简单来说,就是监听 和 事件,根据触发信息来手动改变 lat/lon 的值。不过,这里有一个注意事项:

latitude 方向上最多只能达到 (-90,90),否则会造成屏幕翻转的效果,这种体验非常不好。

我们分别通过代码来实践一下。

添加 touch 控制

Touch 相关的事件在 Web 中,其实可以讲到你崩溃为止,比如,用户用几个手指触摸屏幕?用户具体在屏幕上的手势是什么( , )?

这里,我们简单起见,只针对一个手指滑动的距离来作为 相机 视角移动的数据。具体代码为:

touchYSens/touchXSens 用来控制灵敏度,这可以自行调试,比如 0.5。

x/y: 手指单次移动的距离

: 控制 latitude 的移动范围值

添加陀螺仪控制

Web 获取陀螺仪的信息主要是通过 事件获取的。其会提供相关的陀螺仪参数,alpha、beta、gamma。如果,不了解其内部的原理,光看它的参数来说,你也基本上是不会用的。具体原理,可以参考一下:orientation 陀螺仪 API。

简单来说,陀螺仪的参数在标准情况下,手机有两份坐标:

地球坐标 x/y/z:在任何情况下,都是恒定方向

手机平面坐标 x/y/z:相当于手机屏幕定义的方向

以手机本身为坐标点,地球坐标如图所示:

x:表示东西朝向,X 正向指向东

y:表示南北朝向,Y 正向指向北

z:垂直于地心,Z 正向指向上

手机参考点是手机平面,同样也有 3 个坐标系 X/Y/Z。

X:平行于屏幕向右

Y:平行于屏幕向上

Z:正向为垂直于手机屏幕向上

然后,手机自身在旋转或者移动时,取一下变换值就可以得到 ,alpha、beta、gamma。

其余的内容,直接参考一下 陀螺仪 API 即可。这里,我们就直接来看一下怎样通过陀螺仪来改变 相机 角度:

beta 是手机上下转动,lon 是手机左右转动。每次通过返回 orientation 的变动值,应用到具体 latitude 和 lontitude 的变化结果。

对于 3D 直播来说,还有很多点可以说,比如,全景点击,全景切换等等。如果想自己手动打造一个全景直播组件,这个就没必要了,这里,Now IVWeb 团队提供了一个 iv-panorama 的组件,里面提供了很多便捷的特性,比如,touch 控制,陀螺仪控制,图片全景,视频全景等功能。

iv-panorama 简介

iv-panorama 是 IVWEB 团队,针对于全景直播这个热点专门开发的一个播放器。现在 Web 对 VR 支持度也不是特别友好,但是,对于全景视频来说,在机器换代更新的前提下,全景在性能方面的瓶颈慢慢消失了。其主要特性为:

依赖于 Three.js,需要预先挂载到 window 对象上

灵活配置,内置支持陀螺仪和 touch 控制。

支持灵敏度参数的动态调整

使用 ES6 语法

兼容 React,jQuery(简单凑数的)

项目地址为:iv-panorama。该项目使用非常简单,有两种全景模式,一个是 图片,一个是视频:

全景资源都已经放在 github 仓库了,有兴趣的可以实践观察一下。

本文来自企鹅号 - 前端小吉米媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 前端小吉米媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
纯CSS实现720全景?不用Three.js 也可以
大家好,我是秋风。前段时间时间呢,我写了一个我给鸿星尔克写了一个720°全景看鞋展厅,看大家挺赶兴趣的,当时我是用 Three.js 来写的,但是 JS 实现可能在一些非常非常老旧的机型上兼容性可能没有那么完美。
秋风的笔记
2021/08/27
3.6K0
纯CSS实现720全景?不用Three.js 也可以
现在做 Web 全景合适吗?
Web 全景在以前带宽有限的条件下常常用来作为街景和 360° 全景图片的查看。它可以给用户一种 self-immersive 的体验,通过简单的操作,自由的查看周围的物体。随着一些运营商推出大王卡等
villainhr
2018/07/03
2.3K0
这次来实现VR全景看房,三种前端实现方案
事情是这样的,前几天我接到一个外包工头的新需求,某品牌要搭建一个在线VR展厅,用户可以在手机上通过陀螺仪或者拖动来360度全景参观展厅,这个VR展厅里会有一些信息点,点击之后可以呈现更多信息(视频,图文等)...
秋风的笔记
2021/08/27
2.4K0
这次来实现VR全景看房,三种前端实现方案
裸眼 3D 是什么效果?
作者:沙因,腾讯 IEG 前端开发工程师 介绍一种裸眼 3D 的实现方式,代码以 web 端为例。 平常我们都是戴着 3D 眼镜才能感受 3D 效果,那裸眼能直接看 3D 么?可以看看下面这个视频: 感兴趣可以扫描这个二维码实际体验下: 以上效果是基于 threejs 封装了个相机组件: <script src="https://game.gtimg.cn/images/js/sign/glassfree3d/js/GlassFree3dCamera.js" ></script> new THR
腾讯技术工程官方号
2020/03/19
1.8K0
硬核看房利器——Web 全景的实现
疫情期间,打破社交距离限制的交互模式被推向前台,为不少行业的传统交易提供了想象的空间。
winty
2020/09/14
2.2K0
BAT 要的是什么样的前端实习生?
---- 面试季又到了,各位小鲜肉也在着手准备基本的面试、实习。但是,有小鲜肉的思想我确实有点不敢苟同。面试无非就是问一些问题,你能答出来就行,答不出来就 pass。那如果我知道你要问哪些问题,这不就行了吗?感觉这不就是做一场考试吗? 一个学期的课程,我用 7 天学完,题目我都会做,考试分数还比那些学了一个学期的要好得多。那我为什么还要上课呢?现在,侥幸你通过了面试,知道如何做算法题,但在实际工程领域,你这样的人能解决什么问题呢? 年轻人拥有着无限可能大概是这世界上最搞笑的一句话了。本来在这个世界上在某一个
villainhr
2018/07/03
9340
不到30行代码实现一个酷炫H5全景
前言:本文将围绕:了解什么是全景 --> 怎么构成全景 --> 全景交互原理来进行讲解,手把手教你从零基础实现一个酷炫的Web全景,并讲解其中的原理。小白也能学习,建议收藏学习,有任何疑问,请在评论区讨论,笔者经常查看并回复。
coder_koala
2021/07/08
2.5K0
不到30行代码实现一个酷炫H5全景
加速计和陀螺仪
iPhone在静止时会受到地球引力,以屏幕中心为坐标原点,建立一个三维坐标系(如右图),此时iPhone收到的地球引力会分布到三个轴上。 iOS开发者可以通过CoreMotion框架获取分布到三个轴的值。如果iPhone是如图放置,则分布情况为x=0,y=-1.0,z=0。 在CoreMotion中地球引力(重力)的表示为1.0。
落影
2019/01/28
2.1K0
加速计和陀螺仪
终端图像处理实践:AR全景动态贴纸方案简介
全景动态贴纸主要包含三部分技术要点,本文将进行详细阐述。
天天P图攻城狮
2018/07/02
2.2K2
基于Three.js的360度全景--photo-sphere-viewer--简介
这个是基于three.js的全景插件  photo-sphere-viewer.js  ———————————————————————————————————————— 1、能添加热点; 2、能调用陀螺仪; 3、功能比较完善,能满足大多数人的需求了; 4、最主要的是操作简单,提供一长全景图片即可(大多数手机都可以拍摄)。 直接上代码: var photosphere = document.getElementById('photosphere'); var PSV = new PhotoSphereVie
hbbliyong
2018/03/29
5.8K0
MPU6050姿态解算2-欧拉角&旋转矩阵
注:本篇中的一些图采用横线放置,若观看不方便,可点击文章末尾的阅读原文跳转到网页版
xxpcb
2020/08/26
3.6K0
MPU6050姿态解算2-欧拉角&旋转矩阵
Three.js camera初探——转场动画实现
郭诗雅
2017/03/31
21.4K7
Three.js camera初探——转场动画实现
看完这篇,你也可以实现一个360度全景插件
本文从绘图基础开始讲起,详细介绍了如何使用 Three.js开发一个功能齐全的全景插件。
ConardLi
2019/05/23
9.1K0
FFmpeg + OpenGL ES 实现 3D 全景播放器
前文中,我们已经利用 FFmpeg + OpenGLES + OpenSLES 实现了一个多媒体播放器,本文将基于此播放器实现一个酷炫的 3D 全景播放器。
字节流动
2020/09/14
1.4K0
MLINE-VINS:基于光流曼哈顿与线特征的鲁棒单目视觉惯性SLAM
文章:MLINE-VINS: Robust Monocular Visual-Inertial SLAM With Flow Manhattan and Line Features
点云PCL博主
2025/03/19
1480
MLINE-VINS:基于光流曼哈顿与线特征的鲁棒单目视觉惯性SLAM
【笔记】《游戏编程算法与技巧》1-6
本篇是看完《游戏编程算法与技巧》后做的笔记的上半部分. 这本书可以看作是《游戏引擎架构》的入门版, 主要介绍了游戏相关的常见算法和一些基础知识, 很多知识点都在面试中会遇到, 值得一读.
ZifengHuang
2022/08/30
4.4K0
【Sensors】运动传感器(3)
重力,线性加速度,旋转矢量,显着运动,步进计数器和步进检测器传感器基于硬件或基于软件。 加速计和陀螺仪传感器始终基于硬件。 大多数由Android设备驱动的设备都有一个加速计,而且现在很多设备都包含一个陀螺仪。基于软件的传感器的可用性更加可变,因为它们通常依靠一个或多个硬件传感器来获取其数据。根据设备的不同,这些基于软件的传感器可以从加速计和磁力计或陀螺仪获取数据。
py3study
2020/01/14
2.3K0
3D 可视化入门:渲染管线原理与实践
玩 3D 游戏的时候,有没有想过这些 3D 物体是怎么渲染出来的?其中的动画是怎么做的?为什么会出现穿模、阴影不对、镜子照不出主角的情况?要想解答这些问题,就要了解实时渲染。其中最基础的,就是渲染管线。
Tecvan
2021/12/09
7.2K1
3D 可视化入门:渲染管线原理与实践
Android传感器_传感器网络的基本功能
Android系统提供了对传感器的支持,如果手机的硬件提供了这些传感器的话,那么我们就可以通过代码获取手机外部的状态。比如说手机的摆放状态、外界的磁场、温度和压力等等。 对于我们开发者来说,开发传感器十分简单。只需要注册监听器,接收回调的数据就行了,下面来详细介绍下各传感器的开发。
全栈程序员站长
2022/11/11
1.4K0
Android传感器_传感器网络的基本功能
FFmpeg + OpenGL ES 实现 3D 全景播放器
前文中,我们已经利用 FFmpeg + OpenGLES + OpenSLES 实现了一个多媒体播放器,本文将基于此播放器实现一个酷炫的 3D 全景播放器。
视界音你而不同
2021/01/18
1.5K0
FFmpeg + OpenGL ES 实现 3D 全景播放器
相关推荐
纯CSS实现720全景?不用Three.js 也可以
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档