AR技能简介

  • 增强实际技能(Augmented Reality,简称 AR),是一种实时地计算相机印象的方位及视点并加上相应内容(图画、视频、3D模型)的技能,其本质便是在设备屏幕上把虚拟国际套在实际国际并进行互动。
  • 当下移动互联网常见的AR的使用场景:
    • AR内容导览 – 扫描目标物体,浏览内容(修建、规划、广告等)
    • AR互动 – 教育教学、游戏
    • AR试妆、试穿
  • 作为一个iOS客户端的开发,咱们建立一个根底的AR场景需求具有一下这些技能才能,或许说了解和使用才能
    • 相机/摄像头,原生开发才能
    • 3D立体模型(当下直接运用现成的)
    • 三维的矩阵坐标的了解,便于对物体的方位设定、移动等操作
    • ARKit、SceneKit结构API的了解和运用

ARKit

结构

主流的使用场景根本都是根据3D完结AR技能,也有根据2D完结的:

  • SceneKit:根据3D场景完结的增强实际
  • SpriktKit:根据2D场景完结的增强实际 其中SceneKit的进场率是极高的。为什么有必要要依赖这两个结构呢?由于只要只要游戏引擎才能加载物体模型。
视图

ARKit供给两种虚拟增强实际的视图:

  • ARSCNView:展现3D作用
  • ARSKView:展现2D作用 这两个视图都会用相机视图作为布景视图,这个相机视图便是ARKit结构中的ARCamera捕捉而来的
ARSession

ARSession能够说是ARKit中非常重要的一个类,它是ARSCNView和ARCamera进行关联的桥梁,能够了解为会话,要运行一个ARSession会话,就有必要指定一个会话追寻装备目标:ARConfiguration,其主要目的便是负责追寻相机在3D国际中的方位以及特征捕捉。

节点

SCNNode,节点是个笼统的概念,节是个看不见,摸不到的东西,没有几何形状,可是它有方位,以及本身坐标系。在场景中创立一个增加节点后,你就能够在这个节点上放游戏元素了,比方模型,灯火,摄像机等等… 节点上能够增加节点的,每个节点都有本身坐标系.

ARKit架构

AR场景实践(1) - ARKit探究

场景实践:AR识图+AR模型展现

需求场景

咱们设想一种场景,公司的产品(App)需求扫描带有公司文化图片的图片,辨认成功后展现预设的3D模型动画,这可能是AR技能中最为简略的场景了。

完结第一步:识图

首要咱们需求创立一个AR视图

.....
/// AR、3D结构
import SceneKit
import ARKit
/// 创立AR视图
private lazy var arSCNView: ARSCNView = {
    let scnview = ARSCNView(frame: self.view.bounds)
    return scnview
}()

创立会话装备,此处仅是demo验证,所以咱们直接能够在ViewController生命周内创立它

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let arConfig = ARWorldTrackingConfiguration()
    arConfig.detectionImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil)
    arSCNView.session.run(arConfig, options: [.resetTracking, .removeExistingAnchors])
}

咱们能够即将辨认的图片内容先增加到工程内,咱们创立一个Assets并将需求辨认的图片增加进去,咱们在这儿增加了一个飞机的图片

AR场景实践(1) - ARKit探究
增加图片的时分,咱们需求注意,如果呈现了如下警告:AR reference image must have non zero positive width,说明没有给图片增加物理尺寸。

AR场景实践(1) - ARKit探究
在运用ARKit增加图片,这是有必要的,否则它无法判断图画在相机图画中显得小是由于它在物理上很小而且在附近,还是由于它很大而且很远。咱们只需求增加上就好,增加完图片后咱们需求再方才的会话装备代码部分加上,要在场景中检测的图画的设置

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let arConfig = ARWorldTrackingConfiguration()
    // 要在场景中检测的图画的设置
    arConfig.detectionImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil)
    arSCNView.session.run(arConfig, options: [.resetTracking, .removeExistingAnchors])
}

在设置完会话装备后,咱们需求给AR视图设置署理,并完结对应的署理办法

override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(self.arSCNView)
    arSCNView.delegate = self
}
extension ARSCNViewController: ARSCNViewDelegate {
    /// 当新节点已映射到给定图画锚点时会调用。
    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        let imageAnchor = ARImageAnchor.init(anchor: anchor)
        let referenceImage = imageAnchor.referenceImage
        if referenceImage.name == "plane" {
            print("sacn 成功")
        }
    }
}

此刻,辨认图的代码咱们现已完结,咱们run一下看看

相机扫描咱们方才增加的那张飞机图片,执行了ARSCNViewDelegate的署理办法,并且成功打印了“sacn 成功”,这说明,咱们根本简略的识图逻辑现已完结,

完结第二步:增加模型

首要咱们要预备一个模型,SceneKit支撑的模型类型如下

这儿我预备的是一个飞机模型,没有模型的能够在模型网站上下载,咱们新增了一个scnassets,将飞机模型的.scn文件增加到目录下

AR场景实践(1) - ARKit探究
在进行代码部分的新增调整前,我先介绍下SCNScene和SCNVector3,由于下面的代码咱们会运用到它,SCNScene 是包含节点层次结构和大局特点的容器,并构成可一个显现的 3D 场景。

AR场景实践(1) - ARKit探究
咱们要运用 SceneKit 显现 3D 内容,咱们就需求创立一个SCNScene实例,相同,当实例场景创立后,咱们需求确定一个接收者的方位,这个方位是SCNVector3目标的值。

SCNVector3是一个三分向量的表示,咱们能够简略了解为,咱们这个接收者的方位在3D国际中的坐标信息。经过下面图,咱们能够更好的了解

AR场景实践(1) - ARKit探究
两个API咱们现已根本清楚了,现在开始编码,咱们新增一个办法,笼统新增场景节点的代码,便利识图部分的代码的调用

private func arViewShow() {
    // 加载scn文件,.scn的文件途径
    let scene = SCNScene.init(named: "thirdart.scnassets/plane.scn")
    // 目录下能够有多个文件,所以这儿取咱们要用的这个节点
    let planeNode = scene?.rootNode.childNodes.first
    // 接下来咱们需求确定接收者的方位,
    planeNode?.position = SCNVector3(x: 0, y: -1, z: -1)
    // 将节点附加到接收者的 childNodes 数组。
    self.arSCNView.scene.rootNode.addChildNode(planeNode!)
}

此刻,咱们能够run起来看看作用,扫描飞机图标,辨认成功,展现3D飞机模型

AR场景实践(1) - ARKit探究

当然咱们还能够给3D模型增加一些动画,这个飞机模型,本身是没有动画的,咱们将运用Scene的另一个API:SCNAction,一个简略的、可重复运用的动画,能够更改咱们附加到的任何节点的特点,下面 咱们增加上,看看这些动画完结的作用

咱们先增加一个旋转动画,作用如下图左

// 为了更好的作用,咱们将原有的方位z值调整的更小,也便是,离咱们更远,便利飞机旋转是的全景展现
planeNode?.position = SCNVector3(x: 0, y: -1, z: -5)
// 增加一个沿Y轴旋转的动画
// 这是一个以弧度为单位的相对值旋转节点的动作,这儿咱们设置了duration为1,y轴值为-5
planeNode?.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: -5, z: 0, duration: 1)))

咱们再换一个缩放的动画,作用如下图中

// 增加一个缩放动画
// 这个是经过相对值更改节点的 x、y 和 z 比例值,达到缩放作用,咱们设置该值为2,它应该在3s内变大两倍
planeNode?.runAction(SCNAction.scale(by: 2, duration: 3))

咱们再换一个平移的动画,作用如下图右

// 为了更好的作用,咱们将原有的方位z值调整的更小,也便是,离咱们更远
planeNode?.position = SCNVector3(x: 0, y: -1, z: -5)
// 增加一个平移动画
// 这是一个将节点移动到新方位的动作,咱们将新的方位z值调整为10,预测,这将是一个飞机由远及近,飞至咱们身后的动画
planeNode?.runAction(SCNAction.move(by: SCNVector3Make(0, 0, 10), duration: 3))

作用展现:

AR场景实践(1) - ARKit探究

场景实践:AR辨认物体

ARKit的物体检测功用可用于3D检测。如果进行物体检测,这个其实能够参考上面识图的逻辑。

实际中有一个物体,咱们经过AR辨认出这个物体,那咱们需求本地有一个已知物体,经过AR实物检测来跟已知物体进行匹配,从而完结辨认的才能

咱们需求先完结一个物体检测的功用,苹果官方供给了检测辨认的demo – Scanning and detecting 3D objects ,咱们直接能够用,这儿咱们也直接用苹果的demo示例图来看下辨认检测的过程:

AR场景实践(1) - ARKit探究

如果对作用满足,就能够经过demo导入到Xcode中,以供检测辨认。共享出的是一个 .arobject文件,咱们将这个文件存放到ar resource group目录下,此刻,咱们能够着手代码部分了,当然代码部分相比图片辨认,变化并不大,在场景中检测的目标需求设置为: ARReferenceObject

ARReferenceObject便是ARKit在物理环境中检测到的三维目标的描绘,需求运用ARObjectScanningConfiguration运行AR会话,以启用高保真度空间映射数据的收集,这便是咱们前面说的 苹果官方的物体检测demo 所做的事情。

// 相同,咱们需求设置在场景中检测的识物的设置
let arConfig = ARWorldTrackingConfiguration()
arConfig.detectionObjects = ARReferenceObject.referenceObjects(inGroupNamed: "AR Resources", bundle: nil)!
arSCNView.session.run(arConfig)

相同设置署理

arSCNView.delegate = self

接下来看署理完结部分

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    let bodyAnchor = ARObjectAnchor.init(anchor: anchor)
    let referenceObject = bodyAnchor.referenceObject
    if referenceObject.name == "scanbody" {
        print("sacn 成功")
    }
}

从上面的代码能够看到,抛开获取 .arobject 的部分,检测图片和检测实物的完结高度类似,这儿必要要说明的是,不是一切物体都能够经过ARKit进行检测的,关于实物有根本的一些要求:

  • 太大或许太小的物品
  • 刚性物体,不会被容易挤压变形
  • 纹理细节丰富,不要单纯的平面
  • 无外表反射、无透明作用

以这个为要求为根底,咱们测验进行AR的物体检测,看看能否进行物体扫描辨认,由于咱们并没有苹果demo示例中的那个狐狸玩偶,这儿我顺手拿了一瓶饮料来验证,看如下作用:

AR场景实践(1) - ARKit探究
AR场景实践(1) - ARKit探究

总结

本章内容覆盖了ARKit结构的一些介绍,也以demo的方法实践了AR视图、AR模型展现、模型动画。AR技能的使用场景在单个领域里是非常丰富的,作为App的开发者,关于ARKit结构的运用发掘也是非常重要的。后面咱们还将持续结合一些实际运用场景探究ARKit结构的内容以及相关的AR技能。