良心教程:用户交互的黑科技ARKitQQQ1
开发环境
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:) 方法应该是这样的
构建并运行您的项目。除了以前做过的一切,您现在应该可以在功能点上添加一个框。
摘自:http://mp.weixin.qq.com/s/-yVpvZV5dvsQxTDlS8dt6w