ARKit从入门到精通(2)-ARKit工作原理及流程介绍
转载:http://blog.csdn.net/u013263917/article/details/73038519
1.1-写在前面的话
初次接触
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的人)旋转
1.2-ARKit与SceneKit的关系
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的
- 今后在介绍使用
1.3-ARKit工作原理
1.3.1-ARSCNView与ARSession
1.ARKit提供两种虚拟增强现实视图,他们分别是3D效果的
ARSCNView和2D效果的ARSKView(关于3D效果和2D效果区别以及在上一小节介绍),无论是使用哪一个视图都是用了相机图像作为背景视图(这里可以参考iOS自定义相机中的预览图层),而这一个相机的图像就是由<ARKit>框架中的相机类ARCamera来捕捉的。2.
ARSCNView与ARCamera两者之间并没有直接的关系,它们之间是通过AR会话,也就是ARKit框架中非常重量级的一个类ARSession来搭建沟通桥梁的- 在iOS框架中,凡是带session或者context后缀的,这种类一般自己不干活,作用一般都是两个:1.管理其他类,帮助他们搭建沟通桥梁,好处就是解耦 2.负责帮助我们管理复杂环境下的内存
- context与session不同之处是:一般与硬件打交道,例如摄像头捕捉ARSession,网卡的调用NSURLSession等使用的都是session后缀。没有硬件参与,一般用context,如绘图上下文,自定义转场上下文等
- 在iOS框架中,凡是带session或者context后缀的,这种类一般自己不干活,作用一般都是两个:1.管理其他类,帮助他们搭建沟通桥梁,好处就是解耦 2.负责帮助我们管理复杂环境下的内存
3.要想运行一个
ARSession会话,你必须要指定一个称之为会话追踪配置的对象:ARSessionConfiguration,ARSessionConfiguration的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大ARSessionConfiguration是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类ARWorldTrackingSessionConfiguration,该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型
1.3.2-ARWorldTrackingSessionConfiguration与ARFrame
1.ARSession搭建沟通桥梁的参与者主要有两个
ARWorldTrackingSessionConfiguration与ARFrame2.
ARWorldTrackingSessionConfiguration(会话追踪配置)的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。它的内部实现了一系列非常庞大的算法计算以及调用了你的iPhone必要的传感器来检测手机的移动及旋转甚至是翻滚- 我们无需关心内部实现,
ARKit框架帮助我们封装的非常完美,只需调用一两个属性即可
- 我们无需关心内部实现,
3.当
ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理(与前面说的session管理内存相呼应),而相机的位置数据对应的类就是ARFrame- ARSession类一个属性叫做currentFrame,维护的就是
ARFrame这个对象
- ARSession类一个属性叫做currentFrame,维护的就是
4.
ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它觉得了我们看物体的视野它们三者之间的关系看起来如下图:
- ARCamera在3D世界的位置看起来是这样的
1.4-ARKit工作完整流程
- 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中最难的部分
- ARSessionConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置
ARKit从入门到精通(2)-ARKit工作原理及流程介绍的更多相关文章
- ARKit从入门到精通(3)-ARKit自定义实现
转载:http://blog.csdn.net/u013263917/article/details/73038566 在上一小节中ARKit从入门到精通(2)-ARKit工作原理及流程介绍,我们完整 ...
- ARKit从入门到精通
ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来 ARKit从入门到精通(9)-ARKit让飞机跟着镜头飞起来 ARKit从入门到精通(8)-ARKit捕捉平地 ARKit从入门到精通(7 ...
- ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来
1.1-ARKit物体围绕相机旋转流程介绍 1.2-完整代码 1.3-代码下载地址 废话不多说,先看效果 其实是会一直围着你转圈的,只不过笔者不好意思暴露家里的场景,所以请读者朋友们见谅~ 由于是晚上 ...
- ARKit从入门到精通(8)-ARKit捕捉平地
转载:http://blog.csdn.net/hdfqq188816190/article/details/73360287 1.1-ARKit捕捉平地实现流程介绍 1.2-完整代码 1.3-代码下 ...
- ARKit从入门到精通(11)-ARKit开发常见问题及解决方案
转载请注明出处:ARKit从入门到精通(11)-ARKit开发常见问题及解决方案 本文主要介绍ARKit开发过程中一些常见问题 1.ARKit框架无法导入问题 2.ARKit运行黑屏或者白屏问题:Un ...
- ARKit从入门到精通(9)-ARKit让飞机跟着镜头飞起来
1.1-ARKit物体跟随相机移动流程介绍 1.2-完整代码 1.3-代码下载地址 废话不多说,先看效果 1001.gif 1.1-ARKit物体跟随相机移动流程介绍 1.点击屏幕添加物体,已经在第三 ...
- ARKit从入门到精通(1)-ARKit初体验
ARKit从入门到精通(1)-ARKit初体验 转载自:http://blog.csdn.net/u013263917/article/details/72903174 该系列文章共十篇,笔者将由易到 ...
- Linux可插拔认证模块(PAM)的配置文件、工作原理与流程
PAM的配置文件: 我们注意到,配置文件也放在了在应用接口层中,他与PAM API配合使用,从而达到了在应用中灵活插入所需鉴别模块的目的.他的作用主要是为应用选定具体的鉴别模块,模块间的组合以及规定模 ...
- Java 详解 JVM 工作原理和流程
Java 详解 JVM 工作原理和流程 作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java ...
随机推荐
- Oracle VM VirtualBox CentOS7桥接设置问题解决
我遇到的问题是不能选择桥接网络选项,处理步骤: 1.重装 VirtualBox(安装DockerToolBox带的VirtualBox). 2.下面是存在的缺少驱动问题和解决方法: 注意 :缺少桥接驱 ...
- Hadoop学习:Map/Reduce初探与小Demo实现
原文地址:https://blog.csdn.net/liyong199012/article/details/25423221 一. 概念知识介绍 Hadoop MapReduce是一个用于处 ...
- SQL中获取排序分组后数据的脚本
废话不多说了,先上一段代码,如下所示: select distinct b.OrgID,b.CompanyID,b.AreaID,b.CustChannelID,b.CustID,b.SaleTo ...
- Android ListView滚动条配置完全解析
滚动条的相关显示效果 先来看下ListView的滚动条有哪些显示效果. 滚动条自身的外观 这点不用说,就是滚动条自身的颜色,形状等. Track的外观 默认的ListView是没有设置Track的.为 ...
- C++模板”>>”编译问题与词法消歧设计
在编译理论中,通常将编译过程抽象为5个主要阶段:词法分析(Lexical Analysis),语法分析(Parsing),语义分析(Semantic Analysis),优化(Optimization ...
- TCP网络编程杂谈
作为一名IT工程师,网络通信编程相信都会接触到,比如Web开发的HTTP库,Java中的Netty,或者C/C++中的Libevent,Libev等第三方通信库,甚至是直接使用Socket API,但 ...
- PHP位运算用途
在实际应用中可以做用户权限的应用 我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参 ...
- java对象内存占用
一.前言想知道java对象在内存中的占用情况吗?感谢这位大神的无私分享. http://yueyemaitian.iteye.com/blog/2033046 二.原文的扩充1. 增加了代理jar包的 ...
- Git实战(二)原理
上次的博文Git实战(一)版本号控制概述中我们简介了一下版本号控制系统的概念,重点对版本号控制的三种类型进行了分析和对照,从本篇博文開始我们进入Git的世界,首先介绍一下Git实现版本号控制的原理. ...
- http 状态码 码表
HTTP状态码详解 - 查询资料 1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义 ...