良心教程:用户交互的黑科技ARKit

2017 年 10 月 9 日 CocoaChina

开发环境

Xcode9, 使用语言Swift4


目的


本教程旨在帮助您通过构建ARKit演 示应 用程序来熟悉使 用SceneKit的ARKit的基础知识。

 

现在是时候弄湿你的脚了,你看到建立一个ARKit应用程序的过程,让你通过你的设备与AR世界互动。


本教程的全部想法是通过构建应用程序来学习该技术及其API。通过这个过程,您将了解ARKit如何在真实设备中工作,与您创建3D对象进行交互。


先决条件


本教程建议您深入了解iOS开发的基础知识。这是一个中级教程。您还需要Xcode 9或更高版本。


要测试您的ARKit应用程序,您将需要一个Apple的ARKit兼容设备,它们是具有Apple A9处理器或更高版本的设备。


现在你有一切都准备好了,你适应了。我们来吧!以下是我将走过的事情:



为ARKit应用程序创建新项目

设置ARKit SceneKit视图

使用View Controller连接ARSCNView连接

IBOutlet配置ARSCNView会话

允许相机使用

将3D对象添加到ARSCNView

将手势识别器添加到ARSCNView

从ARSCNView中删除对象将多个对象添加到

ARSCNView



创建新项目


打开Xcode。在Xcode菜单中,选择文件>新建>项目...选择单一视图应用程序,然后按next。Xcode具有ARKit模板,但实际上,您只需使用单 一视图应用程序模板来构建AR应用程序。



您可以为您的项目命名任何您想要的。我命名我的项目ARKitDemo。然后按next创建新项目。


设置ARKit SceneKit视图


现在打开Main.storyboard。在对像库中查看ARKit SceneKit视图。将ARKit SceneKit视图拖动到View Controller上。



然后给出您的ARKit SceneKit View约束以填充整个View Controller。它应该看起来像这样:



酷!这个ARKit SceneKit视图是我们将用增强现实显示SceneKit内容的地方。


连接IBOutlet


我们仍然在Main.storyboard文件。进入工具栏,打开助手编辑器。在ViewController.swift文件顶部添加导入语句以导入ARKit:



从ARKit SceneKit视图拖动到该ViewController.swift文件。当提示时,命名IBOutlet sceneView 。随意删除该didReceiveMemoryWarning() 方法。我们在本教程中不需要它。



配置ARSCNView会话


我们希望我们的应用程序通过相机镜头开始探索世界,并开始检测我们周围的环境。这是一个非常疯狂的技术,如果你想到它。苹果已经为开发人员提供了增强的现实,而无需从头开发整个技术。感谢苹果为ARKit祝福我们。


好的。现在是配置ARKit SceneKit视图的时候了。将以下代码插入到ViewController类中:



在该 viewWillAppear(_:) 方法中,我们初始化了一个名为AR 的配置

ARWorldTrackingConfiguration 。这是一个运行世界跟踪的配置。


但等等,什么是世界跟踪?根据苹果的文档:

> 世界跟踪配置跟踪设备的方向和位置。它还可以通过设备的相机检测现实世界的表面。


现在我们设置sceneView的AR会话来运行刚刚初始化的配置。AR会话管理视图内容的运动跟

踪和摄像机图像处理。

现在添加另一种方法 ViewController



在该 viewWillDisappear(_: )方法中,我们只需告诉我们的AR会话,停止跟踪视图内容的运动和处理图像。


允许相机使用


现在我们可以运行我们的应用程序,我们需要通知我们的用户,我们将利用他们的设备的相机

增强现实。这是自iOS 10发布以来的一个要求。因此,打开Info.plist。右键单击空白区域,然

后选择添加行。设置隐私密钥- 相机使用说明。设置增值现实的价值。



在继续之前,让我们确保您一切正确设置到此为止。


拿出你的设备。挂在你的Mac上 在Xcode上构建并运行该项目。应用程序应该提示您允许相机访问。点击确定。

现在你应该可以看到你的相机的视图。


我们已经配置了sceneView的会话来运行世界跟踪配置。现在是激动人心的时刻。增强现实!


将3D对象添加到ARSCNView


时机已到。我们一直在等待的那一刻。

不用多说,让我们增加现实。我们要开始添加一个框。将以下代码插入到 ViewController中:


我们首先创建一个盒子形状。1= 1米。

之后,我们创建一个节点。节点表示3D空间中对象的位置和坐标。节点本身没有可见的内容。


我们可以通过给它一个形状来给节点一个可见的内容。我们通过将节点的几何设置为框来实现。


之后,我们给我们的节点一个位置。这个位置是相对于相机。正面x在右边。负x在左边。积极的y是up。负y是关闭的。正z向后。负z是向前的。


然后我们创建一个场景。这是要在视图中显示的SceneKit场景。然后我们将盒子节点添加到场景的根节点。场景中的根节点定义了由SceneKit呈现的现实世界的坐标系。


基本上,现在我们的场景有一个盒子。盒子以设备的相机为中心。相对于相机是向前0.20米。

最后,我们设置sceneView的场景来显示我们刚创建的场景。


现在宣告addBox()在viewDidLoad():

构建并运行应用程序 你应该可以看到一个浮动框!



您也 addBox() 可以简单地重构:

单独封装一些组件更容易。

好的。现在是添加手势的时候了。

将手势识别器添加到ARSCNView

在addBox()方法之下,添加以下代码:

在这里,我们初始化点击手势识别器,目标设置为ViewController,动作选择器设置为

didTap(withGestureRecognizer:) 回调函数。然后我们将tap手势识别器添加到sceneView中。

现在是时候用点击手势识别器的回调函数来做某事了。


从ARSCNView中删除对象


在 ViewController.swift 文件中插入以下方法:



在这里,我们创建了一个 

didTap(withGestureRecognizer:) 方法。我们检索用户相对于sceneView的点击位置,并进行󰀉测试,看看我们是否点击任何节点。


之后,我们安全地从我们的第一个节点展开 hitTestResults 。如果结果至少包含一个节点,我们将删除从其父节点点击的第一个节点。


在我们测试对象删除之前,请更新viewDidLoad() 方法以添加对该方法的调用

addTapGestureToSceneView():



现在,如果您构建并运行󰀉项目,您应该可以点击框节点并将其从场景视图中删除。

看起来我们回到了一个。

好。现在是添加多个对象的时候了。


将多个对象添加到ARSCNView


现在我们的盒子有点孤独。我们给盒子一些盒子。我们将从特征点的检测中添加对象。

那么什么是功能点?

根据苹果,这里是一个特征点的定义:

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

它基本上是现实世界对象表面上的检测点。所以回到执行添加框。在我们这样做之前,让我们

在 ViewController 课程结尾创建一个扩展名



这个扩展基本上将矩阵转换成 float3 。它给出了矩阵中的x,y和z。

另外,我们需要修改 addBox() 如下



我们基本上添加了初始化 addBox() 函数的参数。我们还给出了默认参数值。这意味着我们可以调用, addBox() 而不必像其中一样指定x,y和z坐标 viewDidLoad() 。


酷。


现在我们需要修改 didTap(withGestureRecognizer:) 方法。如果有一个对象可以检测到,我们要添加一个对像到特征点。


所以在我们的 guard let 声明和我们的 return 声明之前。添加以下代码



首先,我们执行一个命中测试,类似于我们第一次测试。除此之外,我们.featurePoint为types

参数指定一个结果类型。该types参数要求命中测试搜索通过AR会话处理相机图像检测到的真实世界对像或曲面。结果类型有很多种类型。但是,我们将仅关注本教程中的特征。


特征点的测试后,我们可以安全地展开第一个测试结果。这很重要,因为可能并不总是有一个特点。ARKit可能并不总是能够检测现实世界中的真实世界对像或表面。


如果第一个命中测试结果可以安全地展开,那么我们将类型的矩阵转换matrix_float4x4为float3。


这是可能的,因为我们之前创建的扩展。这很方便地给出了我们感兴趣的x,y和z真实世界坐标。


然后,在点击检测到的特征点时,x,y和z添加一个新框。


你的 didTap(withGestureRecognizer:) 方法应该是这样的

构建并运行您的项目。除了以前做过的一切,您现在应该可以在功能点上添加一个框。


是不是意犹未尽呢?不用担心,良心教程第二弹,教你如何成为技术大神——

↓↓↓

我们致力于iOS技术分享,搭建和谐的知识交流平台,让匠心精神传播给更多的小伙伴。


点击“阅读原文”即可加入专属学习群。

登录查看更多
1

相关内容

苹果公司出品的主要用于 Mac 以及 iOS 开发的 IDE。
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
Gartner:2020年十大战略性技术趋势, 47页pdf
专知会员服务
74+阅读 · 2020年3月10日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
174+阅读 · 2020年1月1日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
183+阅读 · 2019年12月28日
Windows开源无人机仿真工具:AirSim1.0 入门
无人机
25+阅读 · 2019年6月8日
抖音爬虫
专知
3+阅读 · 2019年2月11日
Github项目推荐 | RecQ - Python推荐系统框架
AI研习社
8+阅读 · 2019年1月23日
教你打造一个属于自己的「搜索引擎」
少数派
9+阅读 · 2018年10月23日
Github 项目推荐 | 用 PyTorch 0.4 实现的 YoloV3
AI研习社
9+阅读 · 2018年8月11日
无需一行代码就能搞定机器学习的开源神器
人工智能头条
6+阅读 · 2017年11月7日
有了场景和画像才懂用户
互联网er的早读课
6+阅读 · 2017年8月26日
Self-Driving Cars: A Survey
Arxiv
41+阅读 · 2019年1月14日
Adversarial Transfer Learning
Arxiv
12+阅读 · 2018年12月6日
Arxiv
12+阅读 · 2018年9月5日
Arxiv
5+阅读 · 2018年5月1日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
Gartner:2020年十大战略性技术趋势, 47页pdf
专知会员服务
74+阅读 · 2020年3月10日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
174+阅读 · 2020年1月1日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
183+阅读 · 2019年12月28日
相关资讯
Windows开源无人机仿真工具:AirSim1.0 入门
无人机
25+阅读 · 2019年6月8日
抖音爬虫
专知
3+阅读 · 2019年2月11日
Github项目推荐 | RecQ - Python推荐系统框架
AI研习社
8+阅读 · 2019年1月23日
教你打造一个属于自己的「搜索引擎」
少数派
9+阅读 · 2018年10月23日
Github 项目推荐 | 用 PyTorch 0.4 实现的 YoloV3
AI研习社
9+阅读 · 2018年8月11日
无需一行代码就能搞定机器学习的开源神器
人工智能头条
6+阅读 · 2017年11月7日
有了场景和画像才懂用户
互联网er的早读课
6+阅读 · 2017年8月26日
Top
微信扫码咨询专知VIP会员