ARCore:ARCore带来的新概念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/p106786860/article/details/78533538

一、ARCore能做什么


在Google官方提供的Demo中,实现了这样一个功能。当我们在照相机预览的空间轻轻点击屏幕的时候,在空间中就生成一个Android小机器人,如下图所示:
这里写图片描述
当我们更换手机的位置或者照相机的观察角度的时候,大家从如下图中有没有发现,Andorid小机器人所在的“位置并没有改变”,就像是真实的存在你的世界一样。
这里写图片描述

二、ARCore是如何做到的


那么ARCore是如何完成这一个功能的呢?它是如何将小机器人绘制在现实的空间中?并且变换角度还能保持“位置不变”?
1. 检测特征点
首先ARCore系统会从照相机拍摄到的图像帧,绘制成背景。然后根据当前图像帧中的内容,检测环境中的特征点,就是下图相机预览区域中的一个个小白点。
这里写图片描述
2. 寻找平面
通过分析这些特征点,ARCore会找到有纹理的二维平面。如果检测到有平面存在,就会绘制出白色网格平面。
这里写图片描述
3. 绘制内容
在被检测到的二维平面中,我们可以根据自己的需求绘制内容。如轻轻点击屏幕后,在摄像头和点击位置连接的射线和被检测到的平面交集,然后在交集处绘制Android机器人。
这里写图片描述
4. 计算位置
当我们的手机或者摄像机的观察位置变化的时候,ARCore会根据手机和摄像头位置的变化,更新对应的机器人坐标,以保持它看起来在实际空间中的“位置不变”。
这里写图片描述

这个Demo实现的功能,就会看到前面ARCore做的三件事情的体现。比如:
运动跟踪:即根据手机和摄像头的位置变化,更新机器人坐标保持空间位置不变;
环境理解:检测空间中的特征点,并且分析是否有可绘制的平面;
光学估计:在上效果图中没有具体体现出来,实际代码逻辑中会根据当前的环境的光线来绘制小机器人的阴影,是的更真实。

三、ARCore带来的新概念


了解了具体ARCore是如何实现以上功能的,我们的脑海里就有了这么几个关键点:预览图像帧、检测特征点、寻找二维平面、射线和平面交集,生成锚点、手机在空间位置和空间光线。那么这些概念在ARCore的API中又是如何体现的呢?

1. 帧(com.google.ar.core.Frame)
Frame最直观的理解是照相机获取的一帧图像,Demo背景渲染的画面就来自摄像头获取图像帧。

在ARCore中,Frame还包含更丰富的内容,还提供了某一个时刻AR的状态。这些状态包括:当前帧中环境的光线,如在绘制内容的时候根据光线控制物体绘制的颜色,使得更逼真;当前Frame中检测到的特征点云和它的Pose用来绘制点云;当前Frame中包含的Anchor和检测到的Plane集合用于绘制内容和平面;手机设备当前的Pose、帧获取的时间戳、AR跟踪状态和摄像头的视图矩阵等。

2. 特征点云(com.google.ar.core.PointCloud)
Demo在检测平面的时候,显示的一个个小白点,就是特征点云。

特征点云包含了被观察到的3d点和信心值的集合,还有它被ARCore检测到的时间戳。

3. 二维平面(com.google.ar.core.Plane)
ARCore中所有的内容,都要依托于平面类进行渲染。如Demo中的Android机器人,只有在检测到网格的地方才能放置。

ARCore中平面可分为水平朝上、朝下和非水平平面类型。Plane描述了对一个真实世界二维平面的认知,如平面的中心点、平面的x和z轴方向长度,组成平面多边形的顶点。检测到的平面还分为三种状态,分别是正在跟踪,可恢复跟踪和永不恢复跟踪。如果是没有正在跟踪的平面,包含的平面信息可能不准确。

两个或者多个平面还会被被自动合并成一个父平面。如果这种情况发生,可以通过子平面找到它的父平面。

4. 交集(com.google.ar.core.HitResult/PlaneHitResult/PointCloudHitResult)
点击平面的时候,从设备点击开始手机朝向方向发出一条射线,和被检测平面的是否有交集。如果就在交集处绘制Android机器人。

抽象的概括,HitResult就是射线和真实世界几何体的交集。我们可以中获取当前设备到有交集几何体的距离,交集的Pose。如果是平面交集就是PlaneHitResult,如果是点云就是PoinCludHitResult。

PlaneHitResult中可以判断交集点是否在被检测的集合范围内,是否在平面的正面。

5. 锚点(com.google.ar.core.Anchor)
每个Android机器人的位置,就是一个Anchor。Anchor位置会随着手机或者摄像头的位置更新而更新,这样才能保持“位置不变”。

锚点描述了在现实世界中一个固定的位置和方向。为了保持在物理空间的固定位置,这个位置的数值描述将会随着ARCore对空间的理解的改进而更新。使用getPose()获取这个Anchor的当前数值位置,这个位置每次update()被调用的时候都可能改变,但不会自发地改变。

6. 空间位置(com.google.ar.core.Pose)
Pose表示从一个坐标系到另一个坐标系的不变精确的转换。在所有的ARCore APIs中,Pose总是描述从物体的局部坐标系到世界坐标系的变换。也就是说,来自ARCore API的Pose可以被认为等同于OpenGL模型矩阵。

7. 空间光线(com.google.ar.core.LightEstimate)
LightEstimate给我们提供了一个接口来查询当前帧的光环境。我们可以获取当前相机视图的像素强度,一个范围在(0.0,1.0)的值,0代表黑色,1代表白色。使用该光线属性绘制内容,显得更逼真。

讲完以上概念后,对照API才发现还有两个重要的类Config和Session被忽略了。那么Config和Session在ARCore中又扮演了什么角色呢?
8. 会话(com.google.ar.core.Session)
Session是ARCore中重要的功能是管理AR系统的状态,处理Session生命周期,是ARCore API的主要入口。

在开始使用ARCore API的时候,通过设置的Config来检查当前设备是否支持ARCore。在Activity中对应的生命周期方法中需要处理Session的生命周期,这样AR系统会根据需要开始和暂停相机帧的采集,初始化和释放相关的资源。

在AR系统在每一帧画面的渲染过程中,我们从Session中获取当前相机反馈的Frame,根据需要保存、获取和删除Anchor,获取系统检测到的所有Plane,设置纵横缩放比,获取投影矩阵(渲染3d效果)等用于渲染相关工作。

9. 配置(com.google.ar.core.Config)
在当前市面上,并不是所有的Android设备都支持ARCore。那么这时候我们就要用到Config,它保存了用于配置Session相关设置。

我们可以针对是否开启平面检测和光线感知,获取帧时没有新图片是否阻塞等几个选项创建Config。默认Config开启平面检测和光线感知,获取帧时没有新图片阻塞。 在使用ARCore之前,使用创建的Config,检查当前设备是否支持ARCore,是一个比较好的做法。


1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)
1024工场服务号

2.完整和持续更新的《使用Android打开AR的开发大门—ARCore》文档,欢迎大家阅读!
https://www.kancloud.cn/p3243986735/arcore_develop/457951
这里写图片描述

猜你喜欢

转载自blog.csdn.net/p106786860/article/details/78533538