AR概述
AR的意义:让虚拟世界套与现实世界建立联系,并可以进行互动。
AR的技术实现:通过实时地计算摄影机输出影像的位置及角度,并在内部通过算法识别将场景中的事物,然后在内部模拟的三维坐标系中给识别到的事物建立坐标,然后在特定的坐标上添加相应的图像、视频、3D模型,最终通过手机屏幕合成一个AR效果图展示给用户。
建立一个AR场景的基本步骤为:
1.AR相机打开摄像头实时捕捉周围的图像,并传递到AR会话中。
2.AR会话通过算法识别这些图像,再加上设置的ARWorldTrackingSessionConfiguration追踪策略,然后使用周围的环境和识别到的事物建立一个三维坐标。
3.使用传感器持续追踪现实世界动态物体在三维坐标中的变化。如X、Y、Z轴位移及旋转,其中位移三轴决定物体的方位和大小,旋转三周决定物体显示的区域。
4.坐标识别及转换,系统最终需要把三维坐标中的图像转换成二维的图片在手机屏幕上展示:3D模型显示在现实图像中不是单纯的frame坐标点,而是一个三维的矩阵坐标,这里需要用到三维数学,如:向量,欧拉角,四元数等。
4.另外,AR还可以根据三维坐标中事物的动态变化与虚拟物体进行一些交互。
 
ARKit概述及特点
1.ARKit是2017年6月6日,苹果发布iOS11系统所新增框架,它能够帮助我们以最简单快捷的方式实现AR技术功能。
2.ARKit框架提供了两种AR技术,一种是基于3D场景(SceneKit)实现的增强现实,一种是基于2D场景(SpriktKit)实现的增强现实。
3.使用ARKit构建AR场景时,除了ARKit框架还需要依赖于苹果的游戏引擎框架(3D引擎SceneKit,2D引擎SpriktKit),ARKit不是一个独立就能够运行的框架,必须要SceneKit一起用才可以创建AR场景。如果只有ARKit没有SceneKit,那么ARKit只是一个能够输出影像并实时计算摄像机在3D空间中的位置和角度的相机而已。
ARKit框架本身只包含相机追踪,并不能加载3D模型为场景中,这里需要使用游戏引擎的能力进行加载3D模型到三维坐标中。
4.iOS端加载3d模型的方式有:苹果ARKit框架,Unity3D,Mental,OpenGL。
 
ARKit工作原理
在相机捕捉到的现实世界的图像中显示一个虚拟的3D模型的步骤可以分为两步:
一:相机捕捉现实世界图像
由ARKit来实现,通过ARKit中的ARCamera去捕捉摄像头的画面,构建3D场景。
二:在图像中显示虚拟3D模型
由SceneKit来实现,添加3D虚拟物体到由ARKit构建的3D场景中。
 
ARKit框架主要负责将真实世界画面转变为一个3D场景。
这分为两个环节:1.由ARCamera负责捕捉摄像头画面,2.由ARSession通过图像识别算法和ARWorldTrackingSessionConfiguration追踪策略负责搭建3D场景。
SceneKit框架主要负责将虚拟物体显示在3D场景中。每一个虚拟的物体都是一个节点SCNNode,多个节点共同构成了一个场景SCNScene,多个场景构成了3D世界。
 
ARScnView,ARSession,ARCamera的关系
ARKit提供两种虚拟增强现实视图,他们分别是3D效果的ARSCNView和2D效果的ARSKView,无论是使用哪一个视图都是用了相机图像作为背景视图,而这一个相机的图像就是由ARKit框架中的相机类ARCamera来捕捉的。
ARSCNView与ARCamera两者之间并没有直接的关系,它们之间是通过AR会话ARSession来搭建沟通桥梁的。

要想运行一个ARSession会话,你必须要指定一个称之为会话追踪配置的对象:ARSessionConfiguration,它的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类很重要。ARSessionConfiguration是一个父类,在开发中通常使用的是它的子类:ARWorldTrackingSessionConfiguration。
 
ARWorldTrackingSessionConfiguration的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。它的内部调用图像识别算法并调用必要的传感器来检测手机的移动及旋转甚至是翻滚。当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理,计算出的相机位置数据对应的类是ARFrame。
 
ARSession类一个属性叫做currentFrame,维护的就是ARFrame这个对象。
 
ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它决定了我们看物体的视野。

ARKit框架工作流程如下:
1.ARSCNView加载场景SCNScene。
2.SCNScene启动相机ARCamera开始捕捉场景。
3.捕捉场景后ARSCNView开始将场景数据交给Session。
4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame。
5.给ARSCNView的scene添加一个子节点(3D物体模型)。
ARSessionConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置。
 
ARKit自定义实现主要逻辑
新建ARSCNViewController继承自UIViewController, 添加相关属性。
//AR容器视图:展示3D界面,内部会自动创建screen场景和ARCarmer摄像头
ARSCNView *arSCNView;
//AR会话:AR的开启和关闭
ARSession *arSession;
//AR世界追踪配置
ARConfiguration *arConfiguration;
创建流程
1.创建ARSession
_arSession = [ARSession new];
2.根据ARSession创建ARSCNView (AR容器视图)
_arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];
_arSCNView.session = self.arSession;
_arSCNView.automaticallyUpdatesLighting = YES;
3.创建ARConfiguration
ARWorldTrackingConfiguration *wtConfiguration = [ARWorldTrackingConfiguration new];
//平面追踪
wtConfiguration.planeDetection = ARPlaneDetectionHorizontal;
//灯光自适应
wtConfiguration.lightEstimationEnabled = YES;
_arConfiguration = wtConfiguration;
使用方式
通过调用arSession的run方法启动AR
[self.view addSubview:self.arSCNView];
//启动AR会话,ARCarmer开始启动
[self.arSession runWithConfiguration:self.arConfiguration];
 
ARKit的重要类
ARAnchor
ARAnchor表示一个物体在3D空间的位置和方向。
ARFrame主要是追踪相机当前的状态,表示的是AR相机的位置和方向以及追踪相机的时间,还可以捕捉相机的帧图片。
 
ARFrame
ARWorldTrackingSessionConfiguration通过调用图像识别算法和调用手机传感器,最终计算出相机在3D世界中的位置的某一个时刻的数据,就是一个ARFrame数据。
ARFrame中提供了一个坐标探测方法。
- (NSArray<ARHitTestResult *> *)hitTest:(CGPoint)point types:(ARHitTestResultType)types;
这个方法的回调结果是一个ARHitTestResult类,这个类主要用于虚拟增强现实技术(AR技术)中现实世界与3D场景中虚拟物体的交互。 比如我们在相机中移动。拖拽3D虚拟物体,都可以通过这个类来获取ARKit所捕捉的结果。
 
ARSession
ARSession是一个连接底层与AR视图之间的桥梁,其实ARSCNView内部所有的代理方法都是由ARSession来提供的。
ARSession下面连接了ARCamera和ARWorldTrankingSessionConfiguration。用于从相机采集场景,从设备检测相机的位置和朝向,最终构建出3D场景。
 
ARCamera
ARCamera是一个相机,它是连接虚拟场景与现实场景之间的枢纽。在ARKit中,它是捕捉现实图像的相机,在SceneKit中它又是3D虚拟世界中的相机,它是我们看3D世界的眼睛。
一般我们无需去创建一个相机,因为当我们初始化一个AR视图时,他会为我们默认创建一个相机,而且这个相机就是摄像头的位置,同时也是3D世界中的原点所在(x=0,y=0,z=0)。
 
ARScnView
ARScnView是一个AR视图容器,用于展示AR效果图。
ARSCNView继承于SceneKit框架中的SCNView,而SCNView又继承于UIKit框架中的UIView。
 
SCNScence
SCNScene为游戏中的场景,它是游戏元素(地图,灯光,人物的游戏元素)存在的地方,游戏逻辑也是靠挂载在游戏元素上面的脚本进行执行。
 
SCNNode
SCNNode节点,它是场景中游戏元素的抽象表示,一个大型的游戏场景结构就是由无数个小的节点组成,它有自己的位置和自身坐标系统,我们可以把几何模型,灯光,摄像机的游戏中的真实元素,吸附到SCNNode 节点上。
 
SCNAction
SCNAction 主要负责改变节点的属性,比如我们要让一个地球围绕太阳旋转,一个气球从一个地方移动另外一个地方。
 
SCNGeometry
SCNGeometry 就是呈现三维模型的类,我们模型具体长什么样子,是个正方体还是长方体,都是它说了算。
 
SCNMaterial
SCNMaterial渲染器, 定义模型的外观,好比一个球体,它渲染出来是红色,还是绿色,会不会发光等.
 
 
 
Demo地址:
https://github.com/zhfei/ARBaseKnowledge 
 
参考文章:
https://www.jianshu.com/p/0492c7122d2f
https://toutiao.io/posts/1fxej0/preview
 
 

ARKit的理解与使用的更多相关文章

  1. ARKit 初体验

    ARKIT是苹果公司在今年发布的一个AR开发包,用于现有的IOS设备,是的,就是用在手机或者平板上,类似于pokemon go的效果.看了下演示视屏,嗯,看起来很厉害. 对于一个资深软粉,居然被要求研 ...

  2. ARKit从入门到精通(5)-ARScnView介绍

    转载:http://blog.csdn.net/u013263917/article/details/73156918 AR视图,在第一小节笔者介绍过,ARKit支持3D的AR场景和2D的AR场景,A ...

  3. ARKit从入门到精通(4)-ARKit全框架API大全

    转载:http://blog.csdn.net/u013263917/article/details/73156679 1.1-ARKit框架简介 1.2-ARAnchor 1.3-ARCamera ...

  4. ARKit从入门到精通(3)-ARKit自定义实现

    转载:http://blog.csdn.net/u013263917/article/details/73038566 在上一小节中ARKit从入门到精通(2)-ARKit工作原理及流程介绍,我们完整 ...

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

    转载:http://blog.csdn.net/u013263917/article/details/73038519 1.1-写在前面的话 1.2-ARKit与SceneKit的关系 1.3-ARK ...

  6. ARKit从入门到精通(1)-ARKit初体验

    ARKit从入门到精通(1)-ARKit初体验 转载自:http://blog.csdn.net/u013263917/article/details/72903174 该系列文章共十篇,笔者将由易到 ...

  7. ARKit入门

    ARKit介绍 ARKit是iOS11引入的一个全新的框架,使用Visual Inertial Odometry(VIO,视觉惯性里程计)来精确跟踪现实世界中的真实场景.相比其它设备平台,ARKit中 ...

  8. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  9. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  10. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

随机推荐

  1. 奶瓶KeyBoard | N68键盘使用说明

    1.旋钮功能及操作说明 旋钮功能向下长按5秒按为音量调节/灯光亮度调节互换,顺时针方向为音量+/亮度加,逆时针方向为音量-/亮度减 2. 无线连接及操作说明 Tab按键右侧和Q按键中间为通道连接指示灯 ...

  2. 【每天一个不会秃头的前端案例】CSS + JS 实现早安,晚安动画

    从橘子学姐那边学来的 早安,晚安动画(CSS + js) 成果展示 先看成果. 通过点击太阳实现日夜的动画平滑交替 Movie 这里就不多说什么了,直接贴一下代码 HTML部分 <!DOCTYP ...

  3. 供应链安全情报 | 恶意py包伪装代理SDK进行后门攻击,目标锁定python开发者

    概述 2023年11月28号,悬镜供应链安全实验室在Pypi官方仓库(https://pypi.org)监测到两起伪装成http和socks5代理SDK的开源组件投毒事件.python开发者一旦下载安 ...

  4. vue 状态管理 三、Mutations和Getters用法

    系列导航 vue 状态管理 一.状态管理概念和基本结构 vue 状态管理 二.状态管理的基本使用 vue 状态管理 三.Mutations和Getters用法 vue 状态管理 四.Action用法 ...

  5. freeswitch的gateway实现出中继的主备方案

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 某些呼叫场景中,我们有2条出中继线路可选,2条出中继需要按照主备模式来配置,优先使用主中继呼叫,当主中继出现问题时,呼叫自动转移到备 ...

  6. maven总结二: 常用标签及属性

    本文为博主原创,未经允许不得转载  目录: 1. maven 依赖属性:groupId.artifactId.version 2.插件执行: execution,id ,phase,goals,con ...

  7. CDC设计实例-01

    CDC设计实例 Clock Gating Cell & Glitch Free Clock Switch(门控单元和动态切换时钟) 一个电路有多个时钟输入进来,希望在工作当中能够动态切换时钟; ...

  8. 【面试题精讲】你知道MySQL中有哪些隔离级别吗

    有时博客内容会有变动,首发博客是最新的,其他博客地址可能未同步,请认准https://blog.zysicyj.top 首发博客地址 系列文章地址 脏读(Dirty Read)是指一个事务读取到了另一 ...

  9. [转帖]【教程】如何在不同架构打包Docker镜像

    https://docs.qsnctf.com/qsnctf/37674.html 前言 大家在使用Docker的时候经常会遇到一个问题,就是受用机和本级不是同一架构.就比如小编使用的就是新版本的Ma ...

  10. [转帖]解决Java/MySQL性能问题的思路

    https://plantegg.github.io/2023/08/28/%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98%E6%80%9D%E8%B7%AF/ 10年前写的 ...