实现Web虚拟现实的最轻松方案—A-Frame框架

译文
移动开发
作为一个入门教程,本文将引导你一步步实现构建一个加入Web虚拟现实支持的Web页面的全过程。

【内容提要】本文将向你介绍一个实现Web虚拟现实支持的最易于上手的方案—A-Frame框架。A-Frame是一款开源的可通过定制HTML元素构建WebVR方案的框架。有了这个框架,Web程序员无需学习一门全新的语言或者类似于Unity和Unreal这样的三维引擎就可以在Web开发中加入虚拟现实支持。作为一个入门教程,本文将引导你一步步实现构建一个加入Web虚拟现实支持的Web页面的全过程。

一、 何谓A-Frame

A-Frame(https://aframe.io/)是一个开源框架,用于使用自定义的HTML元素创建WebVR体验。这些元素使用three.js(http://threejs.org/)和WebGL(https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API)在场景中创建支持虚拟现实的元素,而无需开发人员仅仅为了构建简单的体验而去学习例如WebGL这样的较低级别的API。

A-Frame开发团队正在努力创建可扩展的虚拟现实Web,从而允许开发人员构建具有竞争力的API。而且,这种思想一旦被广泛采用和建立起来,就很可能会成为某个定义的标准的一部分。这使我们今天能够使用例如JavaScript框架和实验版本的浏览器所提供的新功能,而无需等待实现某种标准并等待此标准为浏览器所支持。

二、 设备兼容性问题

接下来,一个很重要的问题很可能就是:A-Frame框架是否是跨浏览器兼容的?得到的一个出人意料的结论是:在各种平台上,只要是WebGL兼容的浏览器,A-Frame体验效果良好;当然在没有VR支持的情况下3D场景仍然看见。这意味着,Chrome、 Firefox、Edge和Opera这些流行的浏览器都能够显示桌面级的交互式3D体验。要想进行虚拟现实体验,需要把一部例如Oculus Rift这样的设备连接到一些支持WebVR技术的浏览器上,从而实现虚拟现实兼容性(请继续看下文内容)。

在智能手机方面,过去两代的运行iOS和安卓系统的现代智能手机是最适合的 (例如iPhone 6+、三星Galaxy S6+,还有我个人的 HTC One M9效果都很好)。这其中的大多数智能手机在插入Google Cardboard耳机时也支持虚拟现实。所以,相比与让虚拟现实工作在您的桌面机环境而言,VR兼容性方面在智能手机上实际上更易于实现与管理。

三、 准备工作

要按本文指导完成基于A-Frame的试验,你需要作如下准备工作:

要实现一个基本类型的非VR体验:

你需要安装一款如上所述的支持WebGL的浏览器。

要实现一个基于桌面的VR体验:

你需要安装一款支持WebGL的浏览器,例如最新的Chromium WebVR版本(https://drive.google.com/folderview?id=0BzudLt22BqGRbW9WTHMtOWMzNjQ)或者Firefox的Nightly版本(https://nightly.mozilla.org/)。

一款Oculus Rift耳机(也可能是HTC Vive,只是我还没有进行过实际测试)。

要实现基于移动设备的VR体验,则需要如下:

最新款式的智能设备一般都能够至少实现场景显示并允许你在一个半虚拟现实视图中四处观看。

一款谷歌的Cardboard或者Gear VR耳机。

四、 开始工作

首先,请打开A-Frame框架的入门级教程页面(https://aframe.io/docs/guide/getting-started.html)。目前,A-Frame团队已经提供了各种选项以方便进行与A-Frame框架有关的各种试验,这包括CodePen代码片段、一个npm构建版本、一个A-Frame框架的JS文件(可直接下载或通过CDN取得),一个HTML模板和一个本地开发服务器。为了使事情尽可能简单,我们将下载并直接使用A-Frame样板(https://github.com/aframevr/aframe-boilerplate/archive/master.zip)进行工作。

 

把上述模板解压到你的系统中你的Web项目所在位置。这个模板不必一定要运行于本地Web服务器上。模板使用来自于CDN的A-Frame框架,因此我们只需主要关注index.html文件即可。配置文件package.json中提供了一个基于npm的本地Web服务器用于测试目的。在本文中,我们将使用这个服务器——然而,现在不必测试它。

五、 启动本地服务器

如上文所述,A-Frame样板带有它自己准备使用的本地Web服务器。虽然这并不总是测试你的A-Frame框架的必要情形,但是这样做却是一个良好的实践并能够减少通过您的计算机上文件系统运行网页时出现的各种跨同源策略问题所带来的困惑。

为了运行本地Web服务器,请从你的终端/命令提示符下切换到你的模板项目文件夹中,然后运行下面的命令︰

npm install && npm start

这将安装Web服务器必需的所有文件,然后运行它。之后,如果你想要再次运行服务器,只需运行命令“npm start”。

一旦运行本地Web服务器,它应会自动打开我们的web浏览器并加载我们的模板网页文件。模板中加入了LiveReload支持——这意味着,无论何时更改页面其内容都会自动刷新。

如果你需要在不同的设备上打开网页,或者在运行本地Web服务器后网页不会自动打开,您可以通过在你的浏览器输入http://localhost:3000或者http://192.168.0.1:3000。注意,这里的IP地址正对应于你的计算机的IP地址。

你应该会看到初始场景看起来像下图所示的样子︰

 

六、 构建新场景

现在,让我们删除模板代码并去掉<body>标记内的所有内容,仅留下<a-scene>部分。我们所有的A-Frame元素都将放于这个<a-scene>组件内部。目前代码如下所示:

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8"/>

    <title>Our First A-Frame Experience</title>

    <script src="https://aframe.io/releases/0.2.0/aframe.min.js"></script>

  </head>

  <body>

    <a-scene>

      

    </a-scene>

  </body>

</html>

A-Frame提供了一组原型,这些原型提供给我们VR场景中常用的元素。

接下来,让我们添加一些元素来搭建一个定制场景。

七、 创建天空

每一个场景都需要一个天空部分(或者是某种类型的背景)。这或者是一个单色图像或者是一幅全景图像。这部分内容的原型是<a-sky>。

使用单色图像实现的天空部分的代码如下所示:

 

这将为我们的目标场景创建一个可爱的自然明亮的紫红色天空效果,如下图所示:

 

犹如辉煌的天空效果一样,使用一幅360度全景图像将看起来更漂亮。找到这样的天空盒图像的一个很好的去处是Flickr网站。此网站上提供了不少的全景图像供大家自由重用。

我在Flickr上发现了Luca Biada(https://flic.kr/p/bCMJ4X)提供的如下一幅图像:

 

当我们使用如下代码把它置于我们的场景中时:

 

我们可以得到该场景的一个如下图所示的360度全景图:

 

八、 加入一个长方体

现在,我们有了一个场景。接下来,让我们为它添加一些元素。这要使用<a-box>原型,我们可以将一些长方体和立方体放到我们的场景中。下面的代码将把一个橙色的长方体添加到我们的场景内的道路上:

<a-box color="#B76705" depth="2" height="2" width="4" position="0 0 -1.25"></a-box>

代码中的color属性与前面我们的天空盒中的color属性作用相同,用于指定我们的长方体元素的材质颜色。然后,通过属性depth,height和width指定形状。我们的长方体尺寸是2 x 2 x 4,样子像个很宽的盒子,隐隐约约看起来像个放到路上的纸车。要想把盒子放到场景中的不同位置,只需要修改一个它的position属性即可。这个属性使用了三个值,分别对应于三个坐标轴:x轴、y轴和z轴。

通过上述代码创建的长方体,在我们的场景中看起来有如下图所示的效果:

 

九、 加入几个圆柱体

现在,我们将使用<a-cylinder>原型把几个柱子添加到场景的街道中:

<a-cylinder color="#1E130E" height="40" radius="0.5" position="-40 0 -8"></a-cylinder>

颜色和位置属性以与上面我们创建的长方体含义一致;但是,这里还添加了两个新属性——height和radius,这两个属性分别用于设置圆柱的高度与半径。下图给出的是我们添加了新柱子后的场景图。

 

于是,我们可以非常容易地扩展上述想法。这只需要使用下面的代码就可以添加一排柱子:

<a-cylinder color="#1E130E" height="40" radius="0.5" position="-40 0 -8"></a-cylinder>

<a-cylinder color="#1E130E" height="40" radius="0.5" position="-10 0 -8"></a-cylinder>

<a-cylinder color="#1E130E" height="40" radius="0.5" position="20 0 -8"></a-cylinder>

<a-cylinder color="#1E130E" height="40" radius="0.5" position="50 0 -7"></a-cylinder>

运行结果如下图所示:

 

在A-Frame框架中,圆柱体(Cylinders)还有其他许多选项可用,读者可以自己查阅Cylinder参考文档(https://aframe.io/docs/primitives/a-cylinder.html)。

十、 再加入一个球体

现在,我们再在3D场景中添加一个球体。这可以通过使用<a-sphere>原型来实现,像下面这样:

<a-sphere color="#000000" radius="2" position="0 15 20"></a-sphere>

这段代码直截了当,它创建了一个令人有点毛骨悚然的黑色球体,漂浮在我们身后的天空中:

 

十一、 添加材质

我们可以通过<a-assets>标记将纹理添加到我们的长方体、圆柱和球等原型上。这需要搭建一个A-Frame资源管理系统,使我们能够定义资源,然后把它们应用于我们的形状之上。这是推荐的把纹理添加到场景的方法。

我下载并稍微修改了网址http://subtlepatterns.com/dark-sharp-edges/提供的一幅图像作为纹理使用。然后,我们可以通过如下方式将该资源添加到我们刚刚创建的场景中:

 

上述代码中的Id属性给出了引用纹理并把纹理应用于场景中的对象上时的名称。src属性告诉A-Frame我们想使用的图像文件名称。为了给场景中的对象指定材质,我们可以把材质通过对象的src属性指定——在纹理的ID前面使用哈希技术,请参考下面代码:

<a-sphere src="#darktexture" radius="2" position="0 15 20"></a-sphere>

通过上面的代码,将在天空中创建一个随机的、阴森森的球体,从效果上看将是一个更好看的、接近于科幻效果的纹理。请参考下面的效果图。

 

十二、 运行效果展示

要想实际在VR中观看上述体验,那么你要么需要把一个Oculus Rift连接到你的PC上,或者需要一部时髦的智能手机!当然,智能手机是最容易的选择。如果你没有VR耳机,那么当你走到你的智能手机上显示的场景中时你仍然能够看到上面实现的一切。此时,你可以摇动你的手机四处走走;请参考下图。

 

如果你有一个与你的手机一起使用的Google Cardboard耳机,你可以点击右下角的VR图标切换到VR视图下,请参考下图。

 

十三、 VR体验

好了,如果你想在上面的A-Frame大街示例中走上一走,那么,很好。你可以从这里点击A-Frame大街示例(https://www.devdiner.com/demos/aframedemo/)去体验一把吧。

十四、 小结

今天,当我们提到WebVR时,A-Frame无疑是一个简单而易于使用的框架。通过此框架,我们可以实现很多基于跨浏览器兼容的VR体验。其实,我们可以使用A-Frame实现更多的功能。在以后的文章中我将继续介绍这些问题。谢谢阅读!

责任编辑:李英杰 来源: 51CTO
相关推荐

2015-11-06 14:45:28

2018-02-01 10:38:08

VR虚拟现实

2016-04-13 09:52:31

虚拟现实webvr搭建

2016-01-22 08:54:43

虚拟现实下一代交互VR市场

2023-04-21 10:03:33

虚拟现实VR

2016-09-06 09:43:46

虚拟现实技术VR技术

2023-08-18 09:46:27

虚拟现实VR

2023-08-14 09:49:56

VR技术虚拟现实技术

2021-08-23 17:48:16

人工智能虚拟现实VR

2011-09-29 14:58:54

中视典VRP虚拟现实

2016-08-10 20:40:40

虚拟现实多感官交互技术

2020-11-18 10:57:56

虚拟现实VR医疗

2023-06-06 14:34:03

虚拟现实VR

2016-01-04 10:16:26

VR电影

2021-04-13 11:28:15

VRAR虚拟现实技术

2016-04-21 11:50:33

虚拟现实

2023-05-11 10:49:49

VR数字孪生元宇宙

2023-06-30 14:01:00

增强现实AR和VR

2016-05-03 11:22:09

虚拟现实眼球追踪

2021-05-25 05:28:34

ReactJavaScript前端
点赞
收藏

51CTO技术栈公众号