本节主要说明WebXR是什么,实现webXR的常用方法。
下节会对实现webXR的一个简单易用的第三方开发框架A-Frame进行介绍。
WebXR是什么
从使用的角度简单来说,WebXR 是一个用于在浏览器中创建身临其境的 3D、虚拟现实(和增强现实)体验。
从技术的角度来讲,WebXR 是一个 JavaScript API,它也是一组支持将渲染3D场景用来呈现虚拟世界(虚拟现实,也称作VR)或将图形图像添加到现实世界(增强现实,也称作AR)的标准。这个标准实际上是一组 WebXR Device API,它们实现了 WebXR 功能集的核心,管理输出设备的选择,以适当的帧速率将3D场景呈现给所选设备,并管理使用输入控制器创建的运动矢量。
WebXR 兼容性设备包括沉浸式3D运动和定位跟踪头盔,通过框架覆盖在真实世界场景之上的眼镜,以及手机设备,它们通过用摄像机捕捉世界来增强现实,并通过计算机生成的图像增强场景。
为了完成这些事情,WebXR Device API 提供了以下关键功能:
- 查找兼容的VR或AR输出设备
- 以适当的帧率将3D场景渲染到设备
- 将输出镜像到2D显示器(可选)
- 创建代表输入控件运动的向量
WebXR api 是建立在早期 WebVR api 之上的,如今除了支持 VR 之外,还添加了对 AR 的支持,VR、AR是从感官体验的角度来区分的:
- VR是用户借助外设输入输出(头戴、手柄、体感、运动感知等软硬件系统)来和纯虚拟场景的交互体验
- AR也是用户借助外设来体验额外的虚拟内容,区别是虚拟内容是叠加在真实世界上,其方式可以是通过投射或者视频叠加
VR Headsets和WebXR浏览器
VR Headsets,英文原文翻译为“VR头戴耳机”,我们习惯称之为VR头盔或VR眼镜。
不同功能的Headsets的重要的区别特征包括它们是否支持:
- 6DoF(6自由度)还是3DoF(3自由度),6DoF支持位置跟踪,3DoF只支持旋转跟踪
- 是否有控制器,以及这些控制器是否具有 6DoF 或 3DoF。通常,控制器的自由度数与头盔的自由度数相匹配。
- 由 PC 或移动设备或独立供电。
旋转跟踪允许人们环顾四周或旋转物体。所有VR耳机都提供旋转跟踪。
位置跟踪允许人们四处移动、靠近物体、向前伸手。随着 VR 行业的发展,最低限度的可行体验将趋向于使用带有位置跟踪控制器的位置跟踪耳机。位置跟踪对于赋予人们存在感、让他们感觉自己处于真实环境中很重要。使用仅旋转跟踪,人们只能环顾四周并摆动控制器。
| Headset | 平台 | 位置跟踪 | 控制器 | 控制器位置跟踪 |
|---|---|---|---|---|
| HTC Vive | PC | 有 | 有 | 有 |
| [Oculus Rift] | PC | 有 | 有 | 有 |
| Google Daydream | Android | 无 | 有 | 无 |
| Samsung GearVR | Android | 无 | 有 | 无 |
| Windows Mixed Reality | PC | 有 | 有 | 有 |
| [Oculus Go] | 一体机 | 无 | 有 | 无 |
| Vive Focus | 一体机 | 无 | 有 | 无 |
| [Oculus Quest] | 一体机 | 有 | 有 | 有 |
| [Oculus Quest 2] | 一体机 | 有 | 有 | 有 |
| [Pico Neo 3] | 一体机 | 有 | 有 | 有 |
| [Pico Neo 4/pro] | 一体机 | 有 | 有 | 有 |
A-Frame 使用 WebXR API 获取对 VR 耳机传感器数据(位置、方向)的访问权限,以转换相机并将内容直接渲染到 VR 耳机。请注意,不应将提供数据的 WebXR 与提供图形和渲染的 WebGL 混淆或混为一谈。
A-Frame 旨在提供高度沉浸式和交互式 VR 内容,并具有类似原生的性能。为此,A-Frame 认为最小可行标准将趋向于带有位置跟踪控制器的位置跟踪耳机。同时,A-Frame希望每个人都能参与到VR内容创作中来。A-Frame 支持所有主要的耳机及其控制器。幸运的是,A-Frame 拥有庞大的社区和贡献者,能够展望未来并满足当今 VR 领域的需求。
WebXR开发的VR应用的优点
WebXR是基于网页的XR应用程序,可以用来支持一些本地XR应用不那么适合的场景,比如一些短小精干时效不长的营销推广页面、在线沉浸式视频、电商、在线小游戏和艺术创作等。
相比于本地 XR 应用,WebXR 具备如下等优点:
- Web的即时性:我们只需通过链接分享一段内容然后单击,就能立即使用该内容。从用户的角度来看,这是一个优势——无需安装App即可使用内容。从开发者的角度来看,我们可以完全掌控自己的工作,无需征得许可,也无需通过管理或审批流程即可发布应用。
- Web 标准的稳定性:因为 Web 标准的存在,WebXR api 在现阶段已经发布之后,浏览器几乎就不会删除这些 api 了,因此我们通过 WebXR 建立的应用,可以保持长时间的稳定性,而不像原生应用那般需要不断随系统升级而进行适配。
- Web 开发拥有大量的从业者:目前 XR 在 Web 开发中尚未流行起来,而 Web 开发者的群体基数十分庞大,一旦 WebXR 开发在 Web 开发从业者中流行,那么势必会得到一个快速发展,促进该项技术的繁荣。
开发WebXR应用的三种方式
- 使用封装好的第三方库
对于没有 WebGL 基础的用户,学习和开发成本相对都比较高,因此市面上有一些在 WebGL 基础上封装的库,帮助我们快速上手开发 WebXR,例如 aframe、babylon、three.js
- WebGL + WebXR api
使用 WebGL 加 WebXR api 开发的方式,相对来说是比较贴近于底层的,对于底层,特别是渲染模块我们可以做一些优化操作从而提升 XR 的性能和体验。
- 传统 3d 引擎 + emscripten
传统的 3D 应用开发我们一般都会采用一些比较知名的 3D 引擎例如 unity、unreal 等,借助 emscripten,我们可以将 C 和 C++ 代码编译为 WebAssembly,从而实现 web 端的 XR。
经验与心得
通过上述介绍我们基本可以实现一个具有初步交互体验的Web端VR应用,但这只是第一步,单纯技术上的实现距离真正的可工程化还有一定差距。因为最终工程化之后面向用户的产品必须比技术原型要考虑更多具体的东西,比如渲染的质量、交互的流畅度、虚拟化的沉浸度等,这些都最终决定用户是否会持续使用产品、接受产品所提供的服务等,所以将上述技术在工程化应用之前还有很多的优化与改进工作要做。以下是个人在做Web端VR应用过程中体会的一些心得经验,分享出来供读者参考。
引擎的选用: 如果是使用已有的WebGL引擎,则可参考[5]中的文档来进行VR SDK集成。这里边需要做到引擎层与VR SDK层兼容,以及VR模式与引擎的工具部分的整合,也可以参考桌面引擎如Unity3D和Unreal在VR SDK集成上的开发模式。如果选用第三方的WebGL引擎则有Three.js或Babylon.js等可选,这些主流的WebGL引擎都已经(部分功能)集成了VR SDK。
调试的设备: 调试Web端的VR应用同样需要有具体的VR设备的支持。对于桌面WebM内容还是要尽量使用HTC Vive或Oculus等强沉浸感VR设备。对于移动Web应用,由于Android平台上的各浏览器的差异较大,表现也会不太一致,所以建议使用iOS设备进行开发与调试,但是在最终发布前仍要对更多的Andnoid设备进行适配性测试与优化。
性能的优化: 在Web端做三维的绘制与渲染,性能还是主要瓶颈,因而要尽可能的提高实时渲染的性能,这样才能有更多资源留给VR部分。目前的WebVR在渲染实时中并没有像桌面VR SDK一样可以调用众多的GPU底层接口做诸如Stereo rendering等深层次的优化,因而对性能的占用还是较多。
已知的问题: 目前,WebVR仍然不太稳定,还会有诸多的Bug,比如某些情况下会有设备跟踪丢失的情况,而且效率也不是太高。大多数WebVR应用可以作为后期产品的储备和预研,但要推出真正可供用户使用并流畅体验的产品,还是有较长的路要走。