ARKit 上手指南 01

原文链接: http://fighting300.com...

增强现实技术(Augmented Reality,简称AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。

ARKit是2017年6月6日,苹果发布的iOS11系统所新增的框架,它能够帮助我们以最简单快捷的方式实现AR技术功能。而且ARKit框架对基于3D场景(SceneKit)和2D场景(SpriteKit)的增强现实都提供了支持。

本文将会使用ARKit创建一个简单的app,结束时就可以在AR世界里放置3D物体,并且可以用iOS设备绕着它移动。虽然这是一个非常简单的app,我们会在之后的文章中继续为其编写更多功能,包括平面检测、3D物理效果等其他东西。

开发环境

  1. Xcode版本: Xcode9以上
    Xcode 9 Beta:https://developer.apple.com/download/
    下载最新的beta版本就可以了,不过Xcode需要Mac 10.12.4及以上的版本。
  2. iOS系统: iOS11以上
  3. iOS设备: A9/A10处理器的iOS设备,即iPhone6s、iPad2017及以上的设备

创建项目

首先打开Xcode,选择ARKit模板,如下所示:

AR项目创建

之后,填写完项目信息后,选择Content Technology为SceneKit,当然也可以选择SpriteKit,不过在3D空间中就不是那么立体了。
开发语言选择Swift,Swift天然亲和ARKit,很多网上的Demo都是用Swift写的,这样也方便移植和借鉴。

然后连接你的测试设备并运行,app就可以运行了。该模版APP会在实施摄像头镜头中展示一架飞机的3D模型。如下图所示:

ARKit Demo

实际项目中,你也可以不使用该模版来创建项目,直接引入相关库也可以进行开发。

在项目中可以看到viewWillAppear方法中已经初始化了ARWorldTrackingConfiguration实例。

override func viewWillAppear(_ animated: Bool) {
      super.viewWillAppear(animated)  
      
      // Create a session configuration
      let configuration = ARWorldTrackingConfiguration()

      // Run the view's session
      sceneView.session.run(configuration)
}

放置3D物体

SceneKit有一些基础类,SCNScene是所有3D内容的容器,可以在其中添加多个3D物体。
要向scene中添加内容,要创建SCNGeometry,然后将其包装为SCNNode并添加到SCNScene中。

首先注释掉let scene = SCNScene(named: "art.scnassets/ship.scn")! sceneView.scene = scene,然后添加代码如下:

override func viewDidLoad() {
    super.viewDidLoad()
    // 存放所有3D几何体的容器
    let scene = SCNScene()

    // 想要绘制的 3D 立方体
    let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0.0)

    // 将几何体包装为node以便添加到scene
    let boxNode = SCNNode(geometry: boxGeometry)

    // 把box放在摄像头正前方
    boxNode.position = SCNVector3Make(0, 0, -0.5)

    // rootNode是一个特殊的node,它是所有node的起始点
    scene.rootNode.addChildNode(boxNode)

    // 将 scene 赋给 view
    sceneView.scene = scene
}

现在运行该项目,就会看到有3D立方体悬浮在空中,并且全方位无死角。

此外还可以增加一些调试信息

    // ARKit统计信息例如fps等
    sceneView.showsStatistics = YES;
    
    sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints];
    // 调整摄像头属性 当前摄像头有效直径在10m范围内
    if let camera = sceneView.pointOfView?.camera {
        camera.wantsHDR = true
       camera.wantsExposureAdaptation = true
       camera.exposureOffset = -1
       camera.minimumExposure = -1
       camera.zFar = 10
    }

之前简单体验了ARKit的功能,下面简单介绍ARKit的工作原理:

ARKit工作原理

在ARKit中,创建虚拟3D模型其实可以分为两个步骤:

  1. 相机捕捉现实世界图像--由ARKit实现
  2. 在图像中显示虚拟3D模型/2D模型--由SceneKit/SpriteKit实现

ARKit中ARSCNView用于显示3D虚拟AR的视图,它的作用是管理一个ARSession,一个ARSCNView实例默认持有一个ARSession。
在一个完整的AR体验中,ARKit框架只负责将真实世界画面转变为一个3D场景,这一个转变的过程主要分为两个环节:由ARCamera负责捕捉摄像头画面,由ARSession负责搭建3D场景,而将虚拟物体显示在3D场景中则是由SceneKit框架来完成,每个虚拟物体都是一个节点SCNNode,每个节点构成一个场景SCNScene。
ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它决定了我们看物体的视野。
下图是ARKit与SceneKit的框架关系图:

ARKit class结构

ARSessionConfiguration的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大。ARSessionConfiguration是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类ARWorldTrackingSessionConfiguration,该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型。

当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理,而相机的位置数据对应的类就是ARFrame。ARSession类一个属性叫做currentFrame,维护的就是ARFrame这个对象。

ARFrame

ARKit的完整运行流程可以参考下图:

  1. ARSCNView加载场景SCNScene
  2. SCNScene启动ARCamera开始捕捉图像
  3. ARSCNView开始将SCNScene的场景数据交给ARSession
  4. ARSession通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame(添加3D物体模型时计算3D模型相对于相机的真实矩阵位置时需要使用)
  5. 给ARSCNView的SCNScene添加一个子节点(SCNNode)
ARKit工作流程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 一、AR简介: 增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及...
    rectinajh阅读 2,073评论 0 6
  • 一、AR简介: 多媒体捕捉现实图像:如摄像头 三维建模:3D立体模型 传感器追踪:主要追踪现实世界动态物体的六轴变...
    DeerRun阅读 1,428评论 0 2
  • 转载请注明出处:http://www.jianshu.com/p/0492c7122d2f 1.1-写在前面的话 ...
    坤小阅读 17,811评论 18 76
  • 他最新一条动态是五年前。我现在大三,我认识他那年刚初三,下学期成为了一段时间的同桌。 他哪哪都是我喜欢的样子,从性...
    少女姓黄阅读 297评论 1 1
  • 今天妹妹跟我聊微信,说到她们这学期专业课的一个女老师终于在课堂上发飙了,我很好奇,怎么回事呀? 事情是这样的,今年...
    嬴鹿卢阅读 221评论 0 1