ARKit从入门到精通-ARKit工作原理及流程介绍
转载请注明出处:http://www.jianshu.com/p/0492c7122d2f
1.1-写在前面的话
1.2-ARKit与SceneKit的关系
1.3-ARKit工作原理
1.3.1-ARSCNView与ARSession
1.3.2-ARWorldTrackingSessionConfiguration与ARFrame
1.4-ARKit工作完整流程
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的流程大概如下
笔者没有单独的3D模型,这里主要以苹果官方给出的参考3D模型(飞机)来实现
1.介绍ARKit的工作原理及流程(本篇)
2.通过对ARKit的原理及流程的了解,我们自定义实现ARKit
3.介绍ARKit框架中的所有API,PS:是翻译官方整个ARKit框架中所有的API………………~
4.介绍ARKit框架中几个重量级的类
ARScnView
,ARSession
,ARCamera
5.ARKit实现捕捉现实世界中的平地,并将虚拟物体添加到平地中
6.ARKit实现让虚拟物体跟随相机移动
7.ARKit实现让虚拟物体围绕摄像机(拿着iPhone的人)旋转
1.2-ARKit与SceneKit的关系
1.在上一小节中介绍过,AR技术叫做虚拟增强现实,也就是在相机捕捉到的现实世界的图像中显示一个虚拟的3D模型。这一过程可以分为两个步骤:
由
SceneKit
来实现由
ARKit
来实现一:相机捕捉现实世界图像
二:在图像中显示虚拟3D模型
2.下图是一个
<ARKit>
与<SceneKit>
框架关系图,通过下图可以看出今后在介绍使用
ARSCNView
时将不再累述这一关系,可以简单的理解为:ARSCNView
所有跟场景和虚拟物体相关的属性及方法都是自己父类SCNView
的ARSession的作用及原理将在本篇下一小节介绍
UIView的作用是将视图显示在iOS设备的window中,SCNView的作用是显示一个3D场景,ARScnView的作用也是显示一个3D场景,只不过这个3D场景是由摄像头捕捉到的现实世界图像构成的
继承:子类拥有父类所有的属性及方法
1.
<ARKit>
框架中中显示3D虚拟增强现实的视图ARSCNView
继承于<SceneKit>
框架中的SCNView
,而SCNView
又继承于<UIKit>
框架中的UIView
2.
ARSCNView
只是一个视图容器,它的作用是管理一个ARSession
,笔者称之为AR会话。3.在一个完整的虚拟增强现实体验中,
<ARKit>
框架只负责将真实世界画面转变为一个3D场景,这一个转变的过程主要分为两个环节:由ARCamera
负责捕捉摄像头画面,由ARSession
负责搭建3D场景。4.在一个完整的虚拟增强现实体验中,将虚拟物体现实在3D场景中是由
<SceneKit>
框架来完成中:每一个虚拟的物体都是一个节点SCNNode
,每一个节点构成了一个场景SCNScene
,无数个场景构成了3D世界5.综上所述,ARKit捕捉3D现实世界使用的是自身的功能,这个功能是在iOS11新增的。而ARKit在3D现实场景中添加虚拟物体使用的是父类
SCNView
的功能,这个功能早在iOS8时就已经添加(SceneKit是iOS8新增)
0301.png
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
来搭建沟通桥梁的context与session不同之处是:一般与硬件打交道,例如摄像头捕捉ARSession,网卡的调用NSURLSession等使用的都是session后缀。没有硬件参与,一般用context,如绘图上下文,自定义转场上下文等
在iOS框架中,凡是带session或者context后缀的,这种类一般自己不干活,作用一般都是两个:1.管理其他类,帮助他们搭建沟通桥梁,好处就是解耦 2.负责帮助我们管理复杂环境下的内存
3.要想运行一个
ARSession
会话,你必须要指定一个称之为会话追踪配置
的对象:ARSessionConfiguration
,ARSessionConfiguration
的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大ARSessionConfiguration
是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类ARWorldTrackingSessionConfiguration
,该类只支持A9
芯片之后的机型,也就是iPhone6s之后的机型
0302.png
1.3.2-ARWorldTrackingSessionConfiguration与ARFrame
1.ARSession搭建沟通桥梁的参与者主要有两个
ARWorldTrackingSessionConfiguration
与ARFrame
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
1.4-ARKit工作完整流程
ARKit框架工作流程可以参考下图:
ARSessionConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置
在3D坐标系统中,有一个世界坐标系和一个本地坐标系。类似于UIView的Frame和Bounds的区别,这种坐标之间的转换可以说是ARKit中最难的部分
1.ARSCNView加载场景SCNScene
2.SCNScene启动相机ARCamera开始捕捉场景
3.捕捉场景后ARSCNView开始将场景数据交给Session
4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
5.给ARSCNView的scene添加一个子节点(3D物体模型)
0305.png
相关文章:

【C语言也能干大事】第五讲 组合框控件,下拉列表
获得组合框控件的句柄HWND hwndCombo1 GetDlgItem(hwnd, IDC_COMBO1); 确定目前选项的索引 int curSel ComboBox_GetCurSel(hwndCombo1); 删除项 ComboBox_DeleteString(hwndCombo1, 2); 取得有多少项int getCount ComboBox_GetCount(hwndCombo1);TCHAR getcount[256];itoa(…

Spring Cloud应用开发(六:使用本地存储方式实现分布式配置管理 )
1、搭建Config Server; 1.1、创建配置中心工程microservice-config-server,并在其pom.xml中引入Config Server的依赖; 1.2、编写配置文件application.yml,添加服务端口号和存储属性等信息; 1.3、在scr/main/resources…

PL SQL笔记(三)
loopif credit_rating < 3 then..exit;end if; end loop; select to_char(sysdate, YYYY-MM-DD HH24:MI:SS) from dual; select cast(sysdate as timestamp) from dual; 复合类型数据 1.记录: declaretypeemp_record_typeis record(r_name emp.ename%type,r_job emp.job%typ…
iOS-仿膜拜贴纸滚动(物理仿真)
导读 简单用OC写了一个小球滚动效果; 类似平衡球. GitHub地址:https://github.com/wangliujiayou/WLBallView 欢迎Star. 膜拜滚动进入正题-(传感器) 传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上,用于感应\检测设备周边的信息,不…

Redhat、centos安装配置postgresql
一.安装postgresql 本文仅以 redhat,postgresql9.4为例,使用yum方式进行介绍。 官网:http://www.postgresql.org/download/linux/redhat/ 1.下载postgresql的yum源 yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-red…

Spring Cloud应用开发(七:使用Git存储方式实现分布式配置管理 )
1、使用Git存储实现管理; 1.1、配置Git。在Git上创建microservice-study-config目录,并在目录中添加开发,预发布和测试的配置文件; 1.2、修改服务端配置文件。将microservice-config-server工程的配置文件中本地文件存储方式的配…

IOS 自定义相机, 使用 AVFoundation(附实现部分腾讯水印相机功能 demo)
原文链接:http://www.jianshu.com/p/c64bf543f16a这是一款使用 AVFoundation 自定义的相机,与系统原生相机有一样的外观但比系统的相机更好、更符合实际的开发需要、可以自己修改 UI、实现拍照、取消、闪光灯控制、前后摄像头控制、聚焦、放大缩小、拍照…

如何成为一个好的测试工程师(转载,大意)
对于测试功能是的两个不同观点:软实力和技术能力。 个人觉得技术能力80%可以被大众掌握,但是软实力是需要花费很多时间去培养和塑造的。一下几点也是能够衡量个人技能的一些标准: 1,沟通技能-口头和书面能力 与人的第一印象&#…

ubuntu下7z文件的解压方法
apt-get install p7zip-full 控制台会打出以下信息: 正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 建议安装的软件包: p7zip-rar下列【新】软件包将被安装: p7zip-full升级了 0 个软件包&…

Docker的使用(一:Docker入门程序)
1、编写Dockerfile文件; 注:创建一个空的Docker工作目录dockerspace,进而进入该目录,并创建编写dockerfile文件; 2、编写外部文件。 注:在当前目录(dockerspace)下分别创建require…
iOS OpenCV 图像灰度处理
2017-06-21 小溪彼岸 Cocoa开发者社区推荐人:wo709128079 有时候开发过程中,切图满足不了我们的需求,此时我们需要对图像进行灰度处理,例如QQ头像在线、离线等不同状态等。 可以尝试的解决方案: 第一种:让U…

【VS开发】【电子电路技术】RJ45以太网传输线研究
RJ45以太网传输线研究 最近研究远距离差分视频传输方案,理所当然想到了LVDS协议。至于选用cameralink传输线,还是选用其他方案,本人更倾向于廉价的RJ45以太网线来实现LVDS差分信号的传输。 由于RJ45网线内部为4对双绞线,至于以太网…

Wiz开发 定时器的使用与处理
这只是一些代码片段,由于Wiz开发的资料实在不多,而且内容都不够新。这里的代码主要参考Tools.Timer这个插件,但是由于内部实现的很多变化,Tools.Timer这个插件基本上已经无法使用了。定时器的注册与删除 使用定时器,是…

Docker的使用(二:Docker客户端常用指令练习)
1、列出镜像; 2、搜索镜像; 3、拉取镜像; 4、构建镜像; 4.1、在Dockerfile文件所在目录构建镜像; 4.2、在其他目录构建镜像; 4.3、查看镜像是否构建成功; 5、删除镜像; 6、创建并启…
实现简书个人中心UI效果
这两天比较闲,简单实现了一下个人中心页面scrollView嵌套的效果,也就是下边这个页面,大家感受一下先: JSDemo2.gif 首先讲下实现思路,很多人看到这个界面觉得是多个scrollView嵌套实现的,其实苹果不推荐scrollView的嵌…

PHPCMSv9首页显示分页点击下一页跳转链接出现错误,跳转到后台的解决方案
1 引用页写为 {pc:content action"lists" catid"10" order"updatetime DESC" thumb"0" num"1" page"$_GET[page]"}{loop $data $v}....{/loop}{$pages} {/pc}2 phpcms/libs/functions/global.func.php文件 get_…

顺序查找和二分查找
{线性的顺序查找}function seqSearch(sArr: array of Integer;aCount: Integer;const index: Integer):Integer;var i: Integer;begin Result : -1; for i : 0 to aCount do if sArr[i]index then begin Result : i; Break; end;end;{对数性的二分查找}f…

Docker的使用(三:Docker Hub远程镜像管理)
1、登录 Docker Hub; 2、修改镜像名称; 3、登录认证; 4、推送镜像; 5、查看验证;

啊里大鱼短信发送API
https://api.alidayu.com/doc2/apiDetail?spm0.0.0.0.SEe3dm&apiId25450 转载于:https://www.cnblogs.com/shiningrise/p/5626708.html

GCD API
(可直接复制到Xcode中查看) /***********************************************************************************************************************************##目录##知识点:GCD中有2个核心概念:任务和队列任务&#…

查看Linux系统中某目录的大小
命令:du -sh 目录名来查看,如下 du -sh /root 命令显示结果为:1.2M /root 检查是否有分区使用率use%过高,如发现某个分区空间接近用完,可以进入该分区的挂载点,用以下命令找出占用空间最多的文件…

Docker的使用(四:Docker Registry本地私有仓库搭建知识点总结)
任务一: Docker Registry本地私有仓库搭建 1、启动Docker Registry; 2、重命名镜像; 3、推送镜像; 4、浏览器查看验证; 5、文件查看验证; 任务二:Docker Registry本地私有仓库配置;…
iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)
2017-07-08 remember17 Cocoa开发者社区目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述。 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThreadÿ…
C基础知识小总结(十)
"如有不正确之处,请指出,谢谢" --Mood <指针和函数> 指针函数 函数指针 <最基本的使用函数指针> < 函数指针做为形参 > <字符指针> <字符数组> < 返回局部变量指针 > < 结构体指针> 指向结构体变…

支付方式(2)——支付宝集成及使用
每一个支付平台都有自己的加密、解密的原理;还有各种签名的原理;通过各种内容发送数据,防止恶意攻击等功能的原理。 接下来对于部署支付方式,首先要分清几个名词: 集成接入:支付宝已经集成好各种原理和函数…

Kali Linux攻防系统(一:攻防系统Kali Linux下载安装与更新)
任务一:攻防系统Kali Linux下载安装与更新 1.1、安装Kali Linux虚拟机 1.1.1、电脑硬件配置至少达到 CPU 内存 存储 >四核 >4G >20G 1.1.2、VMware Workstations版本为14及以上; 1.1.3、虚拟机系统版本选择Debian 8.X或者Ubuntu&#x…

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(下)
2017-07-08 remember17 Cocoa开发者社区7NSOperation的理解与使用 No.1:NSOperation简介 NSOperation是基于GCD之上的更高一层封装,NSOperation需要配合NSOperationQueue来实现多线程。 NSOperation实现多线程的步骤如下: 1. 创建任务&#x…

linux网卡绑定脚本
2013-08-20 15:30:51 此脚本适用于CentOS5.x和CentOS6.x。 #!/bin/bash #******************************************** # Copyright (c) Beijing DaoWoo Times Technology Co., Ltd. 2011 # # Author : Wu XuLei (wuxuleidaowoo.com) # FILE : bonding.sh …

EBS 抓trace 文件
如果要对FORM的操作做TRACE操作,可以使用 帮助->诊断->跟踪 中启用跟踪功能来实现。 但是如果要实现对并发请求的trace,需要在 系统管理员->并发->方案->定义 里找到对应的并发请求,并勾选”启用跟踪”项。然后提交这个并发请…

Kali Linux攻防系统(三:在Kali Linux系统中配置安全测试浏览器及系统清理备份)
任务三:配置安全测试浏览器及系统清理备份 3.1、汉化Firefox并安装安全插件 3.1.1、汉化Firefox浏览器,安装中文插件,并更改设置; 3.1.2、在浏览器附加组件管理器中查找“Web Developr”插件 3.1.3、安装添加附件组件 3.2、手动…