使用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个单位表示一米,在放置对象和创作内容时需要考虑到这一点。
考虑对象交互
沿着放置的平面移动物体。游戏或者应用在手机和平板电脑上运行,最佳做法是使用触摸手势