iOS增强现实(ARKit)简单介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS增强现实(ARKit)简单介绍相关的知识,希望对你有一定的参考价值。

参考技术A

跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。

场景理解通过学习更多关于环境的属性,以对水平平面进行检测,如地面或桌面;ios 11.3开始还支持检测垂直平面。这些在场景中平面可用于放置虚拟物体。此外,场景理解还会了解当前环境的光照情况,以提供光照信息用于在虚拟场景中反映真实环境,避免过亮或过暗。

通过ARKit可以很容易地集成你所选的渲染引擎。ARKit可通过SceneKit和SpriteKit渲染。Xcode中还提供了Metal模板,方便快速地开始你的增强现实体验(augmented reality experience)项目。此外,Unity和Unreal也已经集成ARKit完整的功能集到他们主流的游戏引擎中,因此你可以通过这些引擎开始使用ARKit。

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

下图是一个ARKit 与 SceneKit 框架的关系图,通过下图可以看出:

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

要想运行一个 ARSession 会话,你必须要指定一个称之为会话追踪配置的对象: ARSessionConfiguration , ARSessionConfiguration 的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大

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

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

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

ARCamera 只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它决定了我们看物体的视野
他们三者之间的关系看起来如下图:

ARCamera 在 3D 世界的位置看起来是这样的:

首先,ARKit 利用摄像头拍摄现实场景的画面,然后 SceneKit 用来建立虚拟世界。
建立好了以后,ARKit 负责将现实世界和虚拟世界的信息融合,并渲染出一个 AR 世界。

在渲染的同时,ARKit 要负责以下三件事:

由此可见,ARKit 主要做的事是:捕捉现实世界信息、将现实和虚拟世界混合渲染、并且时刻处理新的信息或者进行互动。

效果:

ARConfiguration :提供 3DOF 追踪

ARWorldTrackingConfiguration :提供 6DOF 追踪

对于 3DOF 追踪,我们旋转设备时可以看到虚拟的飞机视角有所变化;但当平移时,我们可以看到飞机是随着设备进行移动的。
对于 6DOF 追踪,我们旋转设备时可以看到虚拟的飞机视角有所变化(这点与 3DOF 追踪没有区别);平移时,我们可以看到飞机的不同位置,例如向上平移看到了飞机的上表面,围着飞机平移可以看到飞机的四周,而 3DOF 没有提供这种平移的追踪。

可以通过 [ARWorldTrackingConfiguration isSupported] 判断设备是否支持 ARWorldTrackingConfiguration 。

Hit-testing 是为了获取当前捕捉到的图像中某点击位置有关的信息(包括平面、特征点、ARAnchor 等)。
[图片上传失败...(image-ba8a3e-1554264132836)]
当点击屏幕时,ARKit 会发射一个射线,假设屏幕平面是三维坐标系中的 xy 平面,那么该射线会沿着 z 轴方向射向屏幕里面,这就是一次 Hit-testing 过程。此次过程会将射线遇到的所有有用信息返回,返回结果以离屏幕距离进行排序,离屏幕最近的排在最前面。

ARHitTestResultTypeFeaturePoint :表示此次 Hit-testing 过程希望返回当前图像中 Hit-testing 射线经过的 3D 特征点。
ARHitTestResultTypeEstimatedHorizontalPlane :表示此次 Hit-testing 过程希望返回当前图像中 Hit-testing 射线经过的预估平面。预估平面表示 ARKit 当前检测到一个可能是平面的信息,但当前尚未确定是平面,所以 ARKit 还没有为此预估平面添加 ARPlaneAnchor。
ARHitTestResultTypeEstimatedVerticalPlane :同上,区别仅是预估竖面。
ARHitTestResultTypeExistingPlane :表示此次 Hit-testing 过程希望返回当前图像中 Hit-testing 射线经过的无限大小的平面。
ARHitTestResultTypeExistingPlaneUsingExtent :表示此次 Hit-testing 过程希望返回当前图像中 Hit-testing 射线经过的有大小范围的平面。
ARHitTestResultTypeExistingPlaneUsingGeometry :表示此次 Hit-testing 过程希望返回当前图像中 Hit-testing 射线经过的有大小范围和形状的平面。

ARKit从入门到精通-ARCamera介绍

  • 转自:ARKit从入门到精通(7)-ARCamera介绍

  • ARCamera是一个相机,它是连接虚拟场景与现实场景之间的枢纽。在ARKit中,它是捕捉现实图像的相机,在SceneKit中它又是3D虚拟世界中的相机。(一般第一人称3D游戏,主角其实就是一个3D相机,我们电脑屏幕看到的画面就是这个相机捕捉的画面)

    • 一般我们无需去创建一个相机,因为当我们初始化一个AR试图时,他会为我们默认创建一个相机,而且这个相机就是摄像头的位置,同时也是3D世界中的原点所在(x=0,y=0,z=0)
      • ARCamera的API一般我们无需关心,因为ARKit会默认帮助我们配置好
  • API介绍

    @interface ARCamera : NSObject <NSCopying>
    
    /**
     4x4矩阵表示相机位置,同ARAnchor
     */
    @property (nonatomic, readonly) matrix_float4x4 transform;
    
    /**
    相机方向(旋转)的矢量欧拉角
    分别是x/y/z
     */
    @property (nonatomic, readonly) vector_float3 eulerAngles;
    
    /**
     相机追踪状态(在下方会有枚举值介绍)
     */
    @property (nonatomic, readonly) ARTrackingState trackingState NS_REFINED_FOR_SWIFT;
    
    /**
    追踪运动类型
     */
    @property (nonatomic, readonly) ARTrackingStateReason trackingStateReason NS_REFINED_FOR_SWIFT;
    
    /**
    相机曲率(笔者有点费解,反复揣摩应该是与焦距相关参数)
    3x3矩阵
     fx 0   px
     0  fy  py
     0  0   1
     */
    @property (nonatomic, readonly) matrix_float3x3 intrinsics;
    
    /**
    摄像头分辨率
     */
    @property (nonatomic, readonly) CGSize imageResolution;
    
    /**
    投影矩阵
    */
    @property (nonatomic, readonly) matrix_float4x4 projectionMatrix;
    
    /**
    创建相机投影矩阵
     */
    - (matrix_float4x4)projectionMatrixWithViewportSize:(CGSize)viewportSize orientation:(UIInterfaceOrientation)orientation zNear:(CGFloat)zNear zFar:(CGFloat)zFar;
    
    @end
    
    //相机追踪状态枚举
    typedef NS_ENUM(NSInteger, ARTrackingState) {
    
        /** 不被允许 */
        ARTrackingStateNotAvailable,
    
        /** 最小 */
        ARTrackingStateLimited,
    
        /** 正常. */
        ARTrackingStateNormal,
    } NS_REFINED_FOR_SWIFT;
    
    /**
     追踪运动类型
     */
    API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos)
    typedef NS_ENUM(NSInteger, ARTrackingStateReason) {
        /** 无. */
        ARTrackingStateReasonNone,
    
        /** 运动. */
        ARTrackingStateReasonExcessiveMotion,
    
        /** 脸部捕捉. */
        ARTrackingStateReasonInsufficientFeatures,
    } NS_REFINED_FOR_SWIFT;

     

以上是关于iOS增强现实(ARKit)简单介绍的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11.4 ,可增强人体记忆?

增强现实——用虚拟光照亮现实世界的物体

ARKit-1

ARkit简介

iOS AR开发

AR增强现实开发介绍(续)