美文网首页iOS相关iOS 艾欧艾斯Unity教程合集
ARKit从入门到精通(2)-ARKit工作原理及流程介绍

ARKit从入门到精通(2)-ARKit工作原理及流程介绍

作者: 坤小 | 来源:发表于2017-06-11 15:22 被阅读7943次

    转载请注明出处:http://www.jianshu.com/p/0492c7122d2f

    <h2 id="1.1">1.1-写在前面的话</h2>

    • 初次接触ARKit,很多人会为其复杂的架构关系而感到畏惧。这里笔者将以最基础简介的方式带领一下一睹苹果原生AR(虚拟增强现实)的风采

    • ARKit并不是一个独立就能够运行的框架,而是必须要SceneKit一起用才可以,换一句话说,如果只有<ARKit>,而没有<SceneKit>,那么ARKit和一般的相机没有任何区别

    • 由于笔者从事多年的iOS应用开发,并没有从事过3D游戏的开发(只是业余爱好写了一个3D打飞机的游戏),所以在本篇介绍ARKit的过程中,我们将以最小的篇幅来介绍SceneKit,毕竟如果没有丰富的3D游戏开发经验,那么光是相机捕捉到的2D界面如果转化为3D世界的矩阵都非常难以理解

      • 关于3D系统X/Y/Z,与4x4矩阵等之间的转换及关系,不会过多深入,笔者将保证每一个不懂3D游戏开发的人都可以学习如何使用ARKit
      • 笔者认为:ARKit最难的部分在于3D坐标的矩阵转换
    • 笔者介绍ARKit的流程大概如下

      • 1.介绍ARKit的工作原理及流程(本篇)
      • 2.通过对ARKit的原理及流程的了解,我们自定义实现ARKit
      • 3.介绍ARKit框架中的所有API,PS:是翻译官方整个ARKit框架中所有的API………………~
      • 4.介绍ARKit框架中几个重量级的类ARScnView,ARSession,ARCamera
      • 5.ARKit实现捕捉现实世界中的平地,并将虚拟物体添加到平地中
      • 6.ARKit实现让虚拟物体跟随相机移动
        • 笔者没有单独的3D模型,这里主要以苹果官方给出的参考3D模型(飞机)来实现
      • 7.ARKit实现让虚拟物体围绕摄像机(拿着iPhone的人)旋转

    <h2 id="1.2">1.2-ARKit与SceneKit的关系</h2>

    • 1.在上一小节中介绍过,AR技术叫做虚拟增强现实,也就是在相机捕捉到的现实世界的图像中显示一个虚拟的3D模型。这一过程可以分为两个步骤:

      • 一:相机捕捉现实世界图像
        • ARKit来实现
      • 二:在图像中显示虚拟3D模型
        • SceneKit来实现
    • 2.下图是一个<ARKit><SceneKit>框架关系图,通过下图可以看出

      • 继承:子类拥有父类所有的属性及方法

      • 1.<ARKit>框架中中显示3D虚拟增强现实的视图ARSCNView继承于<SceneKit>框架中的SCNView,而SCNView又继承于<UIKit>框架中的UIView

        • UIView的作用是将视图显示在iOS设备的window中,SCNView的作用是显示一个3D场景,ARScnView的作用也是显示一个3D场景,只不过这个3D场景是由摄像头捕捉到的现实世界图像构成的
      • 2.ARSCNView只是一个视图容器,它的作用是管理一个ARSession,笔者称之为AR会话。

        • ARSession的作用及原理将在本篇下一小节介绍
      • 3.在一个完整的虚拟增强现实体验中,<ARKit>框架只负责将真实世界画面转变为一个3D场景,这一个转变的过程主要分为两个环节:ARCamera负责捕捉摄像头画面,由ARSession负责搭建3D场景。

      • 4.在一个完整的虚拟增强现实体验中,将虚拟物体现实在3D场景中是由<SceneKit>框架来完成中:每一个虚拟的物体都是一个节点SCNNode,每一个节点构成了一个场景SCNScene,无数个场景构成了3D世界

      • 5.综上所述,ARKit捕捉3D现实世界使用的是自身的功能,这个功能是在iOS11新增的。而ARKit在3D现实场景中添加虚拟物体使用的是父类SCNView的功能,这个功能早在iOS8时就已经添加(SceneKit是iOS8新增)

        • 今后在介绍使用ARSCNView时将不再累述这一关系,可以简单的理解为:ARSCNView所有跟场景和虚拟物体相关的属性及方法都是自己父类SCNView
    0301.png

    <h2 id="1.3">1.3-ARKit工作原理</h2>

    <h3 id="1.3.1">1.3.1-ARSCNView与ARSession</h3>

    • 1.ARKit提供两种虚拟增强现实视图,他们分别是3D效果的ARSCNView和2D效果的ARSKView(关于3D效果和2D效果区别以及在上一小节介绍),无论是使用哪一个视图都是用了相机图像作为背景视图(这里可以参考iOS自定义相机中的预览图层),而这一个相机的图像就是由<ARKit>框架中的相机类ARCamera来捕捉的。

    • 2.ARSCNViewARCamera两者之间并没有直接的关系,它们之间是通过AR会话,也就是ARKit框架中非常重量级的一个类ARSession来搭建沟通桥梁的

      • 在iOS框架中,凡是带session或者context后缀的,这种类一般自己不干活,作用一般都是两个:1.管理其他类,帮助他们搭建沟通桥梁,好处就是解耦 2.负责帮助我们管理复杂环境下的内存
        • context与session不同之处是:一般与硬件打交道,例如摄像头捕捉ARSession,网卡的调用NSURLSession等使用的都是session后缀。没有硬件参与,一般用context,如绘图上下文,自定义转场上下文等
    • 3.要想运行一个ARSession会话,你必须要指定一个称之为会话追踪配置的对象:ARSessionConfiguration,ARSessionConfiguration的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大

      • ARSessionConfiguration是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类ARWorldTrackingSessionConfiguration,该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型
    0302.png

    <h3 id="1.3.2">1.3.2-ARWorldTrackingSessionConfiguration与ARFrame</h3>

    • 1.ARSession搭建沟通桥梁的参与者主要有两个ARWorldTrackingSessionConfigurationARFrame

    • 2.ARWorldTrackingSessionConfiguration(会话追踪配置)的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。它的内部实现了一系列非常庞大的算法计算以及调用了你的iPhone必要的传感器来检测手机的移动及旋转甚至是翻滚

      • 我们无需关心内部实现,ARKit框架帮助我们封装的非常完美,只需调用一两个属性即可
    • 3.当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理(与前面说的session管理内存相呼应),而相机的位置数据对应的类就是ARFrame

      • ARSession类一个属性叫做currentFrame,维护的就是ARFrame这个对象
    • 4.ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它觉得了我们看物体的视野

    • 它们三者之间的关系看起来如下图:

    0303.png
    • ARCamera在3D世界的位置看起来是这样的
    0304.png

    <h2 id="1.4">1.4-ARKit工作完整流程</h2>

    • ARKit框架工作流程可以参考下图:
      • 1.ARSCNView加载场景SCNScene
      • 2.SCNScene启动相机ARCamera开始捕捉场景
      • 3.捕捉场景后ARSCNView开始将场景数据交给Session
      • 4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
      • 5.给ARSCNView的scene添加一个子节点(3D物体模型)
        • ARSessionConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置
          • 在3D坐标系统中,有一个世界坐标系和一个本地坐标系。类似于UIView的Frame和Bounds的区别,这种坐标之间的转换可以说是ARKit中最难的部分
    0305.png

    相关文章

      网友评论

      • 6a21a3b1a1d8:老师您好,我是北航出版社编辑,想问下您有兴趣写书吗?望回复,谢谢。
      • 果汁果肉:我有个问题哈。我用自带的小飞机
        写下

        SCNScene *scene = [SCNScene sceneNamed:@"Models.scnassets/ship.scn"];
        //换成DAE格式的文件
        SCNNode *tigerNode = scene.rootNode.childNodes[0];
        tigerNode.position = SCNVector3Make(0, -1, -1);
        [self.arSCNView.scene.rootNode addChildNode:tigerNode];
        --------------------------------
        加载scn文件可以显示。但是通过这种方式加载DAE格式的模型就不能显示。
        但直接通过
        self.arSCNView.scene = scene这种形式就可以显示。这是什么原因呢?
        果汁果肉:已解决。
        改代码SCNNode *tigerNode = scene.rootNode;
      • 尼古拉斯骄傲:你好 ARSessionConfiguration这个类 为啥写不出来
        坤小:@果汁果肉 好的,谢谢您的提醒,最近太忙了一直没时间更新
        尼古拉斯骄傲:@果汁果肉 :smiley:
        果汁果肉:正式版改名字了。
        叫做ARWorldTrakingSessionConfiguration->ARWorldTrackingConfiguration.
        ARSessionConfiguration->ARConfiguration
      • coderYL:学习了 ,:+1:
      • 伪装v5:ARWorldTrackingSessionConfiguration 怎么找不到了。。
        果汁果肉:正式版改名字了。
        叫做ARWorldTrakingSessionConfiguration->ARWorldTrackingConfiguration.
        ARSessionConfiguration->ARConfiguration
      • CrystalZhu:作者写的很详细,赞👍!
      • 吃蘑菇De大灰狼:刚刚看了WWDC的introducing ARKit,作者总结的很好,正在入门。
      • iOS_July:。。为什么我的Xcode没有AR?
        e0f6992dbc10:@书生的剑 开发者帐号里面可以下 网上也能找到吧
        iOS_July:@yyqkn ...我Xcode提示我更新到了8.3?Xcode9在哪?
      • 程序员钙片吃多了:作者好,"每一个虚拟的物体都是一个节点SCNNode,每一个节点构成了一个场景SCNScene,无数个场景构成了3D世界" 这句话不正确,一个SCNScene 是由多个节点构成的,并不是每一个节点构成一个 SCNScene。
        坤小:@Andy_Ron 那是因为我说的并不是错的,只是这位读者对我的描述做了一个补充防止歧义。 我说的是ARKit的一个节点构成了一个场景,但是我并没有说一个场景只能加载一个节点,确实在加载场景时,主节点是我们的3D模型,我们还可以通过其他的一些节点对场景做一个渲染操作。我并不是专精于做3D游戏开发,所以这一部分知识尽量避免与人争论~~~ -。-
        Andy_Ron:@坤小 那为什么文章没有改掉呢!? 辛亏看了一下评论:smile:
        坤小:是的,您说的是对的。这里是我的疏忽,非常感谢:pray:
      • 童冀:思维导图用的什么软件?
        坤小:@童冀 mindnote
        坤小:@童冀 我用的是mindnode
      • 郑州程序员王一:厉害,厉害,已关注
      • cee8eb5e0927:坤哥威武

      本文标题:ARKit从入门到精通(2)-ARKit工作原理及流程介绍

      本文链接:https://www.haomeiwen.com/subject/hsvhqxtx.html