ARKit和CoreLocation:第一部分

使用线性代数(和Trig)导航

  示范代码 
  ARKit和CoreLocation:第一部分 
  ARKit和CoreLocation:第二部分 
  ARKit和CoreLocation:第三部分 

背景

自从我写了一篇新的博客文章以来已经有一段时间了,所以希望能弥补这一点。 这篇文章和下一篇文章将是我对ARKit和CoreLocation进行实验的两部分系列! 第一部分将介绍ARKit的基础知识,MapKit的指导以及矩阵转换的基础知识。 第二部分将处理计算两个位置之间的方位,以及如何获取位置数据并将其转换为ARKit场景中的位置。

介绍

提到“增强现实”,最先引起人们注意的是PokemonGO。 如果您像大多数人一样,可能曾经玩过一两次(或痴迷过)。PokemonGO证明了在设置方面,没有什么能比我们的世界更好。 就像PokemonGO一样令人敬畏,这只是对增强现实体验的深度和潜力的一瞥。

苹果文档

增强现实 (AR)描述了用户体验,这些体验将2D或3D元素添加到设备相机的实时视图中,从而使这些元素看起来像是居住在现实世界中。 ARKit结合了设备运动跟踪,相机场景捕获,高级场景处理和显示便利性,以简化构建AR体验的任务。

借助iOS 11,Apple已将ARKit的功能释放给iOS开发社区。 我们距离iOS 11尚有几周的上线时间,但我们已经看到的情况似乎可能会重新定义移动用户体验的可能性。

首先,一些基本原理

所以,这是魔术吧? 我不想成为这样说的人,但是不,这只是数学。 因此,如果这不是魔术,那么他们如何实现呢? 视觉惯性里程表! (快说十遍。)

定义

视觉惯性里程表(VIO) :ARKit会分析手机摄像头和运动数据,以便跟踪其周围的环境。 计算机视觉记录了环境中的显着特征,并且无论iPhone的移动如何,都能够保持其在现实世界中位置的意识。

苹果公司非常热衷于围绕会话组织代码。 会议是一个 封装包含在应用程序活动的定义时间段内的逻辑和数据的方法。 使用URLSession时,这是您的应用程序发送网络请求并回传数据时的逻辑和数据。

ARSession 在ARKit中, ARSession协调创建增强现实体验所需的逻辑和数据。 这包括相机和运动数据以及跟踪世界时所需的计算。

ARFrameARFrame包含视频帧数据和位置跟踪数据,这些数据会在currentFrame属性中传递给ARSession。 ARKit将该图像数据与运动跟踪数据结合起来,以计算iPhone的位置。

ARAncho r ARAnchor是现实世界中保持的位置,无论摄像机的运动或位置(理论上)如何。 它固定在一个特定的位置,并且大部分将保留在那里。

AR配置

ARWorldTrackingConfiguration 是用于跟踪设备方向,位置并检测特征点(如相机记录的表面)的配置。 ARConfigurations将您和手机所处的物理世界与手机根据摄像头和运动数据生成的虚拟坐标空间进行连接。

  worldAlignment: ARSession上的worldAlignment属性定义ARSession如何在3D坐标映射系统上解释ARFrame的运动数据,该系统用于跟踪世界并建立增强现实体验。 

worldAlignment —苹果文档

创建AR体验取决于能够构建一个坐标系统以将对象放置在虚拟3D世界中,该虚拟3D世界映射到设备的真实位置和运动。 运行会话配置时,ARKit会根据设备的位置和方向创建场景坐标系。 您创建的或AR会话检测到的任何ARAnchor对象都相对于该坐标系定位

  重力:通过将对齐方式设置为重力, ARKit可使y轴与重力平行,并且z轴和x轴沿设备的原始方向定向。 

worldAlignment.gravity —苹果文档

首次运行会​​话配置时设备的位置和方向确定坐标系统的其余部分:对于z轴,ARKit选择指向设备摄像头方向的基本矢量(0,0,-1)面并垂直于重力轴。 ARKit使用右手规则基于z轴和y轴选择一个x轴,也就是说,基向量(1,0,0)与其他两个轴正交,并且(对于观看者而言,负z方向)指向右侧。

  gravityAndHeading:通过将对齐方式设置为gravityAndHeadingARKit 会将与重力平行的y轴对齐,并将z轴和x轴定向为指南针航向。 原点放置在设备的初始位置。 尽管大多数情况下这是准确的,但它的精确度并不是很高,因此仅依靠这些数据来创建沉浸式增强现实体验可能会很棘手。 

worldAlignment.gravityAndHeading —苹果文档

尽管此选项将三个坐标轴的方向固定为实际方向,但坐标系统原点的位置仍相对于设备,与首次运行会​​话配置时的设备位置相匹配。

场景套件

关于ARKit的最酷的事情之一是,它与Apple现有的图形渲染引擎(SpriteKit,Metal和SceneKit)很好地集成在一起。 我使用最多的是SceneKit,它用于渲染3D对象。

定义

ARSCNView ARSCNView是SCNView的子类,SCNView是用于渲染3D内容的标准SceneKit视图。 因为它专门用于ARKit,所以它已经具有一些非常酷的功能。其中之一是,它提供对手机相机的无缝访问。 更酷的是,视图的SceneKit场景的世界坐标系直接响应由会话配置建立的AR世界坐标系。 它还会自动移动SceneKit相机以匹配iPhone的真实运动。

ARSCN查看文档

因为ARKit会自动将SceneKit空间与现实世界匹配,所以放置虚拟对象以使其看起来可以保持真实世界的位置只需要适当地设置该对象的SceneKit位置即可。

您不一定需要使用ARAnchor类来跟踪添加到场景中的对象的位置,但是通过实现ARSCNViewDelegate方法,可以将SceneKit内容添加到ARKit自动检测到的任何锚点中。

将节点添加到场景

在继续之前,让我们先了解一些基本知识。 让我们来构建我们的第一个增强现实体验! 为此,我们将在镜头前1米处放置一个蓝色球体。

定义

SCNSphere 球体定义了一个曲面,该曲面的每个点均与其中心等距,该曲面位于其局部坐标空间的原点。 您可以使用其radius属性在所有三个维度上定义球体的大小。

SCNGeometry 可以在场景中显示的三维形状(也称为模型或网格),带有定义其外观的附加材料。

SphereNode领域代码

目前,这种方法行之有效。 因为ARKit将SceneKit空间与现实空间相匹配,所以我们的球体将自动出现以跟踪现实世界的位置。 如果要使用坐标,将来可能需要找到一些持久的锚定*提示*节点。

向量,矩阵和线性代数,哦,不!

如果您还记得数学课,则向量具有大小和方向。

在数学,物理学和工程学中,欧几里得向量(有时称为几何向量或空间向量,或者在这里简称为向量)是具有大小(或长度)和方向的几何对象。

—维基百科

在编程时,向量只是一个数字数组。 每个数字都是向量的“维”。

首先,将2 x 1矩阵用作向量。 让我们给它一个x = 1的值。绘制的向量(1,0)如下所示:

我们可以在一个非常简单的矩阵中表示相同的向量(1,0):

如上所述:

向量只是一个数字数组

如您所见,矩阵看起来类似于数字数组。 尽管它们看起来令人生畏,但在实际操作中,矩阵是一个非常简单的概念,并且在您进行了一些练习之后也很容易使用。

来自OpenGL的定义

简而言之,矩阵是具有预定行数和列数的数字数组

矩阵用于变换3D坐标。 这些包括:

  • 旋转(方向改变)
  • 缩放(大小更改)
  • 平移(移动位置)

转变

在大多数情况下,可以用以下公式表示转换点:

  变换点=变换矩阵×原始点 

如果您曾经与CoreGraphics合作过,那么您可能已经看到了CGAffineTransform。 它制作了一些非常酷的动画。 实际上,CGAffineTransform只是矩阵转换的另一种类型。

仿射变换是一种线性映射方法,可以保留点,直线和平面。

旋转太空飞船

让我们尝试一下转换! 尽管这与它们用于位置节点的方式不同,但它们之间的距离足够近,您可以开始考虑实际的原理。 为此,请使用SceneKit创建一个新的ARKit项目。 运行它时,如上面的屏幕截图所示,屏幕前面应该有一个太空飞船。

循环T环

在viewDidLoad下面添加以下行:

这是完整的ViewController代码:

导航

现在我们已经掌握了ARKit的基础知识,让我们继续进行导航和定位服务。 如果我们想被引导到目的地,我们将需要导航服务的帮助。

MapKit带有便捷的转弯路线API。 使用CoreLocation,目的地和MKDirectionsRequest,我们可以遵循一系列导航步骤,以将我们引至特定位置。

资料来源:

medium.com —逸彩

Aviation.stackexchange.com

github.com/ProjectDent/ARKit-CoreLocation

moving-type.co.uk/scripts/latlong.html

gis.stackexchange.com

opengl-tutorial.org

math.stackexchange.com