《无人机英雄》:如何通过ARCore打造一款AR游戏

青亭网,虚拟现实,VR,AR,7tin,青亭,媒体,资讯,增强现实,neo2018

本文中,Jonas Johansson就如何将《无人机英雄》从VR转变为AR体验做了一个个案分析。大家好!首先我快速介绍一下自己:我叫Jonas Johansson,我十分喜爱科技和游戏,特别是二者的结合。我自己的游戏工作室Neuston最近发布了VR游戏《无人机英雄》,在游戏中用户可以操控无人机来完成一系列艰难的挑战。

Drone-Hero-AR-1

在成立Neuston之前,我是《愤怒的小鸟2》(Rovio)的主要程序员,在那以前我从事于《孤岛危机》(Crytek)和《正当防卫2》(Avalanche工作室)的开发。

构思

Google发布ARCore之后,我抱着试试看的心态下载了这个软件开发工具包和所需的Unity测试版。

鉴于《无人机英雄》中已经含有了一些有趣的无人机飞行力学,我觉得让一架无人机在我的客厅里飞来飞去将会非常炫酷。我将《无人机英雄》中与无人机相关的资源复制到了一个新的项目当中,并开始一心让无人机扩大规模并走向世界。

我将它装在一部Google Pixel中,然后,当当~我的客厅里有了一架无人机!

光线

之前无人机的形象没有与周围环境相融合,主要是因为真实场景和虚拟场景之间的照明不相一致。无人机似乎是被“粘贴”在摄像机图像上的。

幸运的是,ARCore软件开发工具包提供了光照参数,它可以为渲染对象进行着色以便他们更好地融入真实场景。

Drone-Hero-AR-4

事实上,Unity版本的软件开发工具包还含有一个名为“ARCore / DiffuseWithLightEstimateion”的便利着色程序。它是基于Lambert照明模型的表面着色程序,可以用估算亮度来(标量值)调整最终颜色。

现在,如果我改变现实中的亮度(例如,打开灯的开关),它会影响到无人机。毋庸置疑,无人机能够更好地融入场景当中了!

碰撞

我想让无人机撞向地面,那显然很酷。

ARCore软件开发工具包支持“可追踪平面”。可追踪平面在本质上是一个被识别的平面,如地面或桌面。ARCore持续对平面进行追踪并记录一切变更。

然后,我们在软件开发工具包中查询每个可追踪平面的“边界多边形”(按顺时针方向获取)点列表。为了利用这些点来构建一个网格,我们将它们围成三角形。如果知道边界多边形的拓扑结构,这件事可能就会变得非常简单,但我是通过将点围成三角形来创建三角形索引的。

ezgif-1-1e73f05ec4

无论如何,随着网格准备就绪,我们需要做的就是设置一个GameObject并添加一个相应的的MeshCollider组件。太好了,无人机现在可以与地面相撞了!

阴影

无人机似乎还是与环境有所疏离。很难获得比例感,也无法确定它与地板的距离。我想我们需要将阴影投射到地面上来更好地将无人机融入现实。

唯一的问题是虚拟场景中没有可以用于接受无人机阴影的地板。所以,我们需要增加一个可以投射阴影的无形地板。

Drone-Hero-AR-6

就我所知,Unity中没有开箱即用的合适的着色程序,所以我决定创建一个新的。我会适当回归之前的着色器,但这里首先需要的是一个投射阴影的光源。我在虚拟场景中添加了一个白色的向下定向光源。它当然不能完美地表现出真实场景中的光,但大部分光是来自于上方的,所以它依然有效。

在代码中,我为所有的可追踪平面添加了一个MeshRenderer和一个MeshFilter,并使用了之前为撞击所创建的网格。MeshRenderer使用了新的着色器中的材质。

期望结果

最终像素颜色=真实世界像素颜色(相机中的)*该像素的虚拟光(高光/阴影)。

顶点着色器

通过数据传递。

片段着色器

计算投射到该片段的虚拟光强度。阴影外添加白色。阴影内添加黑色。

ezgif-1-35303ef690 (1)

混合

Unity中的排列顺序是“Blend SrcFactor DstFactor”。

生成的颜色乘以SrcFactor。

已经在屏幕上的颜色乘以DstFactor。

两者加在一起。

为达到目标,我们可以:

将原始状态(虚拟地板表面的颜色)乘以零。

将目标状态(真实世界的颜色)与SrcColor(虚拟平面的颜色——白/黑,取决于高光/阴影)相乘。

两者相加。由于第一条的结果是零,所以只有第二部分会影响最终数据。

因此,这里的混合设置为“Blend Zero SrcColor”。

思考这个问题的最好办法是先不要混合,而是在场景中创建一个平面。对它进行观察,并想象平面的颜色将与背景颜色相乘。

注意,阴影强度可以降低,使其稍显柔和,但公式依然生效。

动态模糊

在移动相机时,真实世界会变得模糊。然而,无人机却依旧十分清晰。为了使它更好地融入环境,我们在相机中添加了动态模糊功能。我使用的是Unity叠后处理中的动态模糊。

点击这里可以查看:https://www.assetstore.unity3d.com/en/#!/content/83912

我将样本计数设置为4,以最小化其性能影响。这样它就可以融入到持续运动当中了。

最后的想法

视频可以展示出室内和室外的镜头,碰撞和阴影的源代码:https://github.com/jonas-johansson/ARCoreUtils 。

ARCore很容易上手,并且还带有一些不错的附加功能。探索ARCore的一个好方法是查看与软件开发工具包捆绑在一起的“HelloAR”场景,特别是“HelloARController.cs”。

祝你玩得愉快!

更多精彩内容,关注青亭网微信号(ID:qingtinwang),或者来微博@青亭网与我们互动!转载请注明版权和原文链接!
责任编辑:hi188
分享到QQ 分享到微信

0 条评论

头像发表我的观点

取消

  • 昵称 *
  • 邮箱 *
  • 网址
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册