使用ARKit开发AR游戏-基础篇:ARKit入门篇

| 导语 11月到12月,使用新出的ARkit开发了一个AR游戏,梳理下开发过程的经验,整理成文。 计划是一个系列,入门篇主要是收集的资料整合;探索篇(经验篇)坑及个性探索说得。计划赶不上变化,谁知道会不会胎死腹中呢,生活毕竟如此艰难。

增强现实(AR)

         AR体验的基本需求(及ARKit框架的定义),是在用户所处的现实世界空间与可视化建模内容的虚拟空间之间创建对应关系的能力。当您的应用程序显示虚拟内容与实时摄像头图像,用户会感受到增强的现实:产生虚拟内容是真实世界的一部分的错觉。

AR设备和SDK

AR设备

在相当多的文章中都有涉及,不再赘述,主要是头盔的方式,透明显示将对象叠加到现实世界中。如MicrosoftHolenlens、meta、Magic leap。

移动设备和SDK方案

由移动硬件相机驱动,提供一个“窗口”进入。可以看到现实世界与AR的对象。

现在比较成熟的SDK方案是:Vuforia、GoogleARCore、Apple ARkit。

ARKit概述

         ARKit是Apple的基于自身硬件的AR解决方案,有别于传统(以Vuforia为代表)基于单纯视觉测距方案,采用视觉加惯性传感器。

视觉惯性测距(Visual-inertialodometry)

为了在真实空间和虚拟空间之间创建对应关系,ARkit使用一种称为视觉惯性测距的技术。该过程会将iOS设备的运动感应硬件捕捉的信息与设备相机可见的场景的计算机视觉分析相结合。

Frame是什么?

         ARKit的运行原理基于Frame概念。运行的AR会话连续从设备摄像机捕获视频帧(Frame)。对于每一帧,ARKit会将图像与来自设备的运动感应硬件的数据一起分析,以估计设备的现实位置和方向。ARKit以ARFrame对象的形式提供跟踪信息和成像参数。

摄像机的采集速度大约30次/秒,主要提供运动信息的更新;运动感应硬件采集速度大约几千次,主要负责旋转信息的更新。

主要功能:ARKit的场景理解系统的一些功能

平面寻找

使用稀疏点云提取和创建平面。

Prefabs\GeneratePlanes和UnityARGeneratePlane.cs可以生成平面。该脚本监听平面并检测更新,再为检测到的每个平面创建一个新平面的实例。

l 水平面与重力相关

l 在多帧间运行

l 表面对齐程度

l 平面合并

碰撞检测

针对点云射线碰撞检测。

         ARKit SDK分析相机视图中的内容,并根据可识别的功能和估计的深度确定点数。碰撞结果按照与设备的距离进行排序。平面优先于feature point.

         FeaturePoint:由ARKit自动识别的点是连续表面的一部分,但没有相应的锚点(anchor)。

         EstimateHorizontalPlane:通过搜索检测到的现实平面(没有相应的锚点),其方向垂直于重力。

         ExistingPlane:已经在场景中检测的平面锚点(使用planeDetection选项检测),不管平面的大小。

         ExistingPlaneUsingExtent:已经在场景中的平面锚点(使用planeDetection选项检测),需要考虑平面的有限的大小。

光估计

估计当前摄像机的环境光值,以使用真实世界的光照亮数字物体。

         ARKit SDK提供了对当前摄像机视图ambientLight(环境光)的估计。通过将ARkit值在UnityARAmbient.cs中统一转换为更合适的强度来调整场景中单位光的亮度(通常为Direction Light)。

这允许应用程序用真实世界的光来照亮场景中的对象。

         AmbientColorTemperature是整个场景光环境光的估计温度(开尔文)。

Unity场景设置

相机配置

         ARCameraManager.cs

设置MainCamera的local position

         UnityARVRVideo.cs

从设备摄像机读取视频

         UnityARCameraNearFar.cs

更新far和near clipping plane

场景的对象

         GeneratePlane.cs

保持平面预制参考

         PointCloudParticleExample

产生一个点云的粒子效果相同

工具脚本

         UnityARAmbient.cs

从SDK时间回调设置光强度

建议:通用小技巧

使用EeaturePoint

如果你需要碰撞检测速度更快,而不是更高的精度,优先使用Feature Points,而不是平面检测。

获取所需结果后,禁用平面检测

平面检测需要的计算量更大。因为放置在场景中的对象不需要一直做平面检测,所以在获得结果以后可以禁用平面检测。

允许在应用中重置ARKit会话

         m_session.RunWithConfigAndOption(config,option)可以重置上次会话。

添加阴影

使用shadowPlanePrefab在平面和现实世界中投射阴影。也可以使用BlobProjector。

使用真实世界大小

         Unity中的1个单位表示一米,在放置对象和创作内容时需要考虑到这一点。

考虑对象交互

沿着放置的平面移动物体。游戏或者应用在手机和平板电脑上运行,最佳做法是使用触摸手势

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

译文 | 与TensorFlow的第一次接触(一)

本人对一直对高性能网络服务器,分布式存储比较感兴趣,在BAT时也一直从事架构开发,并没有做过机器学习相关工作,平时喜欢阅读分析开源代码,到目前为止已分析完约8套...

35860
来自专栏AI研习社

AI 开发者看过来,主流移动端深度学习框架大盘点

AI 研习社按:移动设备相较于 PC ,携带便携,普及率高。近年来,随着移动设备的广泛普及与应用,在移动设备上使用深度学习技术的需求开始涌现。

37830
来自专栏IT派

50种机器学习和预测应用的API,你想要的全都有

API 是一套用于构建软件程序的协议和工具。对于应用开发者而言,有了开放的 API,就可以直接调用其他公司做好的功能为我所用,这在很大程度上提升了工作效率。

15620
来自专栏机器之心

想轻松复现深度强化学习论文?看这篇经验之谈

选自Amid Fish 作者:Matthew Rahtz 机器之心编译 近期深度强化学习领域日新月异,其中最酷的一件事情莫过于 OpenAI 和 DeepMin...

34160
来自专栏机器学习实践二三事

【Google 年度顶级论文】机器学习系统,隐藏多少技术债?

原文在此:google原文 1. 介绍 随着机器学习(ML)社群持续积累了几年对于活跃系统(live systems)的经验,一种让人不舒服的趋势广泛地浮出...

304100
来自专栏AI派

谷歌机器学习43条黄金法则(手册版+PDF)

之前的 谷歌机器学习法则:ML工程的最佳实践 将谷歌公司关于机器学习方面的实践经验详细的介绍了下,很多朋友会问有没有手册版以及PDF版本。这里会将精简后的法则内...

14240
来自专栏新智元

让神经网络替你编程:如何用深度学习实现程序自动合成

【新智元导读】本文介绍了训练神经网络学习用复杂的函数式语言(FlashFill DSL)进行编程取得的成功,标志着神经程序合成方面一个令人兴奋的突破。 ● 作...

43380
来自专栏机器人网

一个简单的多机器人编队算法实现--PID

用PID进行领航跟随法机器人编队控制 课题2:多机器人编队控制 研究对象:两轮差动的移动机器人或车式移动机器人 研究内容:平坦地形,编队的保持和避障,以及避障和...

51470
来自专栏新智元

Andrej Karpathy:神经网络是“软件2.0”,而非机器学习的一种工具

【新智元导读】深度学习和计算机视觉专家、特斯拉人工智能部门主管Andrej Karpathy最近提出将神经网络视为Software 2.0,而非“机器学习中的一...

43580
来自专栏月色的自留地

从锅炉工到AI专家(11)(END)

24070

扫码关注云+社区

领取腾讯云代金券