ARKit3.5 框架學習 (一)核心類簡介(上)

@[TOC]html

ARKit3.5 框架學習 (一)核心類簡介(上)

1. ARKit框架簡介

ARKit整合iOS設備攝像頭和運動功能,在你的應用程序或遊戲中產生加強現實體驗。node

加強現實(AR)描述了將2D或3D元素添加到設備攝像頭的實時視圖中的用戶體驗,以使這些元素看起來像是生活在真實世界中。ARKit結合了設備運動跟蹤、攝像機場景捕獲、高級場景處理和顯示功能,簡化了構建AR體驗的任務。使用這些技術,你可使用iOS設備的前置或後置攝像頭建立多種AR體驗。ios

1.1 ARKit 3.5 新增功能

ARKit 3.5添加了一個新的Scene Geometry API,該API使用激光雷達掃描儀建立空間的3D地圖,以區分地板,牆壁,天花板,窗戶,門和座椅。該掃描儀可以在長達五米的距離內快速測量物體的長度,寬度和深度,從而使用戶可以快速建立可用於物體遮擋的數字傳真機-使數字物體看起來像部分混入了場景中在真實物體後面。得益於「即時AR」支持,這些數字對象能夠自動放置在空間中,而無需用戶揮動平板電腦並讓其相機感受到空間。git

蘋果還表示,它在3.5版中改進了ARKit的動做捕捉和人物遮擋,能夠更好地估算人物的深度和動做捕捉的高度。之前,ARKit使用iPhone或iPad的2D相機在長度測量方面作得「足夠好」,可是激光雷達掃描儀能夠進行更精確的3軸測量,從而自動使之前開發的應用程序受益,而無需更改代碼。github

總的說來, ARKit 3.5 增長了如下三個方面的功能:算法

  1. 幾何場景: 經過「幾何場景」,您可使用標識地板、牆壁、天花板、窗戶、門和座椅的標籤來建立空間的立體圖。對現實世界的深刻了解爲虛擬對象解鎖了對象遮擋和現實世界的物理原理,還爲您提供了更多信息來加強您的 AR 工做場景。
  2. 即時AR:iPad Pro 上的 LiDAR 掃描儀可實現難以置信的快速平面檢測,從而無需掃描便可在現實世界中即時放置AR對象。iPad Pro 會自動爲全部使用 ARKit 構建的應用啓用即時AR放置,而無需進行任何代碼更改。
  3. 改進的運動捕捉和人物遮擋: 經過 ARKit 3.5 在 iPad Pro 中應用,「人物遮擋」中的深度預測和「運動捕捉」中的高度估計更加準確了。這兩個功能在 iPad Pro 上使用 ARKit 生成的全部應用中獲得了改進,一樣無需更改任何代碼。

以下圖是一個AR效果圖: 編程

在這裏插入圖片描述

ARKit使用Visual Inertial Odometry(VIO,視覺慣性里程計)來精確跟蹤現實世界中的真實場景。相比其它設備平臺, ARKit中的VIO能夠將傳感器數據和CoreMotion的數據融合在一塊兒,從而提供更爲精確的信息。 ARKit可讓iOS設備精確感知它如何在房間內移動,而無需外部設備的校準。基於此原理, ARKit能夠獲取關於iOS設備位置和運動信息的高精度模型,並在場景中使用。swift

使用 ARKit,iPhone和IPad能夠分析來自攝像頭視圖中的場景,並找到房間的水平平面。 ARKit能夠檢測到例如桌子和地板之類的平面,還能夠檢測和跟蹤物體。更酷的是, ARKit還能夠利用攝像頭傳感器來估算場景中的光線強度,從而在虛擬物體上提供合適的光照。api

在實際的開發中,可使用點擊測試方法(如ARHitTestResult類)來根據攝像頭捕捉的圖像找到真實世界的表面。若是開發者在配置中啓用了planeDetection,ARKit能夠檢測到攝像頭所捕捉圖像中的平面,並記錄其位置和大小信息。數組

1.2 ARKit 工做流程簡介

以下圖,解釋的是 ARKit 的工做流程。其中藍色表示 ARKit 負責的部分,綠色表示 SceneKit 負責的部分:

ARKit工做流程大意圖

從上圖能夠看出,AR工做的大體流程以下:

  • 首先,ARKit 利用攝像頭拍攝現實場景的畫面,而後 SceneKit 用來創建虛擬世界。
  • 創建好了之後,ARKit 負責將現實世界和虛擬世界的信息融合,並渲染出一個 AR 世界。
  • 在渲染的同時,ARKit 要負責如下三件事:
  1. 維持世界追蹤 指的是當你移動攝像頭,要去獲取新的現實世界的信息。
  2. 進行場景解析 指的是解析現實世界中有無特徵點、平面等關鍵信息。
  3. 處理與虛擬世界的互動 指的是當用戶點擊或拖動屏幕時,處理有沒有點擊到虛擬物體或者要不要進行添加/刪除物體的操做。
  • 總的來講,ARKit 主要作的事是:捕捉現實世界信息、將現實和虛擬世界混合渲染、而且時刻處理新的信息或者進行互動。

2. ARKit框架類結構

iOS 平臺的 AR 應用一般由 ARKit 和渲染引擎兩部分構成:

AR 應用一般由 ARKit 和渲染引擎兩部分構成

ARKit 的 ARSession 負責管理每一幀的信息。ARSession 作了兩件事:拍攝圖像並獲取傳感器數據;對數據進行分析處理後逐幀輸出。以下圖:

ARKit 的 ARSession 職責

要作AR相關開發確定首先要熟悉兩個框架:

此外還可使用Unity方案實現跨平臺開發。

ARKit是基於3D場景(SceneKit)實現的加強現實,這是主流方式。 ARKit還基於2D場景(SceneKit)實現的加強現實。因此要學習ARKit框架外還有必要學習這兩個框架:SceneKitSpriteKit。後續博客會詳細講解這兩個框架,盡請期待....

ARKit並非一個獨立就可以運行的框架,而是必需要SceneKit一塊兒用才能夠。:

  1. ARKit 實現相機捕捉現實世界圖像並恢復三維世界
  2. SceneKit 實如今圖像中現實虛擬的3D模型

2.1 SpriteKit框架簡介

  • SpriteKit: 在應用程序中添加具備流暢動畫的高性能2D內容,或使用一組基於2D遊戲的高級工具建立遊戲。 SpriteKit是一個通用框架,用於在二維中繪製形狀、粒子、文本、圖像和視頻。它利用Metal來實現高性能的渲染,同時提供一個簡單的編程接口,使得建立遊戲和其餘圖形密集型應用程序變得容易。使用一組豐富的動畫和物理行爲,您能夠快速地爲您的視覺元素添加生命,並在屏幕之間優雅地轉換。 SpriteKit支持iOS、macOS、tvOS和watchOS,並與GameplayKitSceneKit等框架集成良好。
  • SpriteKit框架結構以下:
    SpriteKit框架結構

2.2 SceneKit框架簡介

  • SceneKit框架:用來建立3D遊戲,並使用高級場景描述將3D內容添加到應用程序中。輕鬆添加動畫,物理模擬,粒子效果,和現實的物理渲染。 SceneKit結合了一個高性能的渲染引擎和一個用於導入、操做和渲染3D資產的描述性API。與底層api(如MetalOpenGL)不一樣,後者須要您精確地實現顯示場景的呈現算法的細節,而SceneKit只須要描述場景的內容以及您但願它執行的操做或動畫。
  • SceneKit框架結構以下:

SceneKit框架結構

ARKit 和 SceneKit 的座標系看起來就像這樣:

ARKit 和 SceneKit 的座標系

ARKit 和 SceneKit 關係圖以下:

ARKit 和 SceneKit 關係圖

2.3 ARKit框架

  • ARKit對開發環境要求:

Xcode版本:Xcode9及以上 iOS系統:iOS11及以上 iOS設備要求:處理器A9及以上(iPhone6s 、iPhone6sPlus、iPhone7 iPhone7Plus、iPhoneSE、iPad Pro(9.七、10.五、12.9)、iPad(2017)) MacOS系統:10.12.4及以上 (安裝Xcode9對Mac系統版本有要求)

  • ARKit框架類結構彙總:

ARKit框架類結構彙總

2.3.1 ARKit框架與其餘框架關聯

ARKit框架與其餘框架關聯
如上圖能夠看出 ARKit並非一個獨立就可以運行的框架,而是必需要 SceneKit一塊兒用才能夠,換一句話說,若是隻有 ARKit,而沒有 SceneKit,那麼 ARKit和通常的相機沒有任何區別。相機捕捉現實世界圖像,由ARKit來實現;在圖像中顯示虛擬3D模型,由 SceneKit來實現。

其中ARKit框架中中顯示3D虛擬加強現實的視圖ARSCNView繼承於SceneKit框架中的SCNView,而SCNView又繼承於UIKit框架中的UIView。

UIView的做用是將視圖顯示在iOS設備的window中,SCNView的做用是顯示一個3D場景,ARSCNView的做用也是顯示一個3D場景,只不過這個3D場景是由攝像頭捕捉到的現實世界圖像構成。

ARSCNView只是一個視圖容器,它的做用是管理一個ARSession

在一個完整的虛擬加強現實體驗中,ARKit框架只負責將真實世界畫面轉變爲一個3D場景,這一個轉變的過程主要分爲兩個環節:由ARCamera負責捕捉攝像頭畫面,由ARSession負責搭建3D場景。

ARKit3D現實場景中添加虛擬物體使用的是父類SCNView的功能,這個功能早在iOS8時就已經添加(SceneKit是iOS8新增),ARSCNView全部跟場景和虛擬物體相關的屬性及方法都是本身父類SCNView的。

2.3.2 ARKit框架工做原理

ARKit提供兩種虛擬加強現實視圖,他們分別是3D效果的ARSCNView2D效果的ARSKView。不管是使用哪個視圖都是用了相機圖像做爲背景視圖,而這一個相機的圖像就是由框架中的相機類ARCamera來捕捉的。

然而 ARSCNViewARCamera二者之間並無直接的關係,它們之間是經過AR會話,也就是ARKit框架中很是重量級的一個類ARSession來搭建溝通橋樑的。

若是咱們要想運行一個ARSession會話,咱們必需要指定一個稱之爲ARSessionConfiguration(會話追蹤配置)的對象,ARSessionConfiguration的主要目的就是負責追蹤相機在3D世界中的位置以及一些特徵場景的捕捉(例如平面捕捉)。

ARSessionConfiguration是一個父類,爲了更好的看到加強現實的效果,蘋果官方建議咱們使用它的子類ARWorldTrackingSessionConfiguration,該類只支持A9芯片以後的機型,也就是iPhone6s以後的機型。

以下圖是ARSession會話扮演的角色:

ARSession的關係

ARSession搭建溝通橋樑的參與者主要有兩個ARWorldTrackingSessionConfiguration與ARFrame。

ARWorldTrackingSessionConfiguration(會話追蹤配置)的做用是跟蹤設備的方向和位置,以及檢測設備攝像頭看到的現實世界的表面。它的內部實現了一系列很是龐大的算法計算以及調用了你的iPhone必要的傳感器來檢測手機的移動及旋轉甚至是翻滾。

當ARWorldTrackingSessionConfiguration計算出相機在3D世界中的位置時,它自己並不持有這個位置數據,而是將其計算出的位置數據交給ARSession去管理,而相機的位置數據對應的類就是ARFrame。

咱們能夠看到ARSession類一個屬性叫作currentFrame,維護的就是ARFrame這個對象。

其中ARCamera只負責捕捉圖像,不參與數據的處理。它屬於3D場景中的一個環節,每個3D Scene都會有一個Camera,它以爲了咱們看物體的視野。

以下圖是ARSession和ARFrame的關係:

ARSession和ARFrame的關係

2.3.3 ARKit框架工做流程

  • ARKit框架工做流程:
  1. ARSCNView加載場景SCNScene
  2. SCNScene啓動相機ARCamera開始捕捉場景
  3. 捕捉場景後ARSCNView開始將場景數據交給Session
  4. Session經過管理ARSessionConfiguration實現場景的追蹤而且返回一個ARFrame
  5. ARSCNView的scene添加一個子節點(3D物體模型)

ARKit框架工做流程圖以下:

ARKit框架工做流程圖

  • ARKit框架中一下類關係說明:
  1. ARKit框架中中顯示3D虛擬加強現實的視圖ARSCNView繼承於SceneKit框架中的SCNView,而SCNView又繼承於UIKit框架中的UIView。
  2. 在一個完整的虛擬加強現實體驗中,ARKit框架只負責將真實世界畫面轉變爲一個3D場景,這一個轉變的過程主要分爲兩個環節:由 ARCamera負責捕捉攝像頭畫面,由ARSession負責搭建3D場景。
  3. ARSCNViewARCamera二者之間並無直接的關係,它們之間是經過AR會話,也就是ARKit框架中很是重量級的一個類ARSession來搭建溝通橋樑的。
  4. 要想運行一個ARSession會話,你必需要指定一個稱之爲會話追蹤配置的對象:ARSessionConfiguration, ARSessionConfiguration的主要目的就是負責追蹤相機在3D世界中的位置以及一些特徵場景的捕捉(例如平面捕捉),這個類自己比較簡單卻做用巨大。

3. ARKit核心類

VRKit核心類頭文件

  • 頭文件定義以下:
#import <ARKit/ARError.h>

#import <ARKit/ARSession.h>
#import <ARKit/ARConfiguration.h>
#import <ARKit/ARFrame.h>
#import <ARKit/ARCamera.h>
#import <ARKit/ARHitTestResult.h>
#import <ARKit/ARLightEstimate.h>
#import <ARKit/ARPointCloud.h>
#import <ARKit/ARReferenceImage.h>
#import <ARKit/ARReferenceObject.h>
#import <ARKit/ARVideoFormat.h>
#import <ARKit/ARCollaborationData.h>
#import <ARKit/ARWorldMap.h>
#import <ARKit/ARRaycastQuery.h>
#import <ARKit/ARTrackedRaycast.h>
#import <ARKit/ARRaycastResult.h>

#import <ARKit/ARAnchor.h>
#import <ARKit/AREnvironmentProbeAnchor.h>
#import <ARKit/ARFaceAnchor.h>
#import <ARKit/ARFaceGeometry.h>
#import <ARKit/ARImageAnchor.h>
#import <ARKit/ARObjectAnchor.h>
#import <ARKit/ARParticipantAnchor.h>
#import <ARKit/ARPlaneAnchor.h>
#import <ARKit/ARPlaneGeometry.h>

#import <ARKit/ARSkeleton.h>
#import <ARKit/ARSkeletonDefinition.h>
#import <ARKit/ARBody2D.h>
#import <ARKit/ARBodyAnchor.h>

#import <ARKit/ARCoachingOverlayView.h>
#import <ARKit/ARSCNView.h>
#import <ARKit/ARSKView.h>
#import <ARKit/ARMatteGenerator.h>

#import <ARKit/ARQuickLookPreviewItem.h>
複製代碼

3.1 ARError

  • ARError: ARKit方法拋出錯誤的類型。 ARError它是一個結構體類型,若是:
struct ARError 複製代碼

ARError 的錯誤碼以下:

  • cameraUnauthorized: 一個錯誤代碼,代表該應用程序沒有使用相機的用戶權限。
  • fileIOFailed: 一個錯誤代碼,代表ARKit沒法讀取或寫入所需的文件。
  • insufficientFeatures: 錯誤代碼代表ARKit沒有完成任務所需的特性。
  • invalidCollaborationData: 一個錯誤代碼,指示ARKit沒法使用特定的協做數據對象更新應用程序的會話。
  • invalidConfiguration: 指示配置包含不明確或錯誤數據的錯誤代碼。
  • invalidReferenceImage: 指示參考圖像不可用的錯誤代碼。
  • invalidReferenceObject: 指示引用對象不可用的錯誤代碼。
  • invalidWorldMap: 表示世界地圖不可用的錯誤代碼。
  • microphoneUnauthorized: 一個錯誤代碼,代表該應用程序沒有使用麥克風的用戶權限。
  • objectMergeFailed: 一個錯誤代碼,代表ARKit沒法合併檢測到的對象。
  • sensorFailed: 指示傳感器未能提供所需輸入的錯誤代碼。
  • sensorUnavailable: 指示運行會話所需傳感器的錯誤代碼不可用。
  • unsupportedConfiguration: 一個錯誤代碼,代表您運行的配置在iOS設備上不受支持。
  • worldTrackingFailed: 一個錯誤代碼,代表世界跟蹤遇到了一個致命的錯誤。

3.2 ARSession

  • ARSession:用於控制加強現實體驗的主要對象。

ARSession對象協調ARKit表明您執行的主要進程,以建立加強現實體驗。這些過程包括從設備的運動感知硬件讀取數據,控制設備的內置攝像頭,並對捕獲的攝像頭圖像進行圖像分析。該會話綜合了全部這些結果,從而在設備所在的真實空間和建模AR內容的虛擬空間之間創建了一種對應關係。

class ARSession : NSObject 複製代碼
ARSession類定義
ARSession屬性方法

3.2.1 ARSessionObserver

protocol ARSessionObserver 複製代碼

該協議定義了ARSessionDelegateARSCNViewDelegateARSKViewDelegate協議通用的可選方法。您能夠在採用這些協議之一時實現此協議的方法。

3.2.2 ARSessionDelegate

  • ARSessionDelegate: 提供方法能夠實現從AR會話接收捕獲的視頻幀圖像和跟蹤狀態。
protocol ARSessionDelegate 複製代碼

若是您須要直接處理會話捕獲的ARFrame對象,或者直接跟蹤會話的已跟蹤ARAnchor對象集的更改,請實現此協議。一般,您在構建用於顯示AR內容的自定義視圖時採用此協議—若是您使用SceneKit或SpriteKit顯示內容,則ARSCNViewDelegateARSKViewDelegate協議提供相似的信息並與這些技術集成。 該協議擴展了ARSessionObserver協議,所以您的會話委託也能夠實現那些方法來響應會話狀態的更改。

3.3 ARConfiguration

  • ARConfiguration:一個對象,它定義在給定時間內在會話中啓用的特定ARKit特性。
class ARConfiguration : NSObject 複製代碼

ARConfiguration爲您能夠在AR體驗中配置的不一樣選項定義了一個基類。你本身不分配配置;而是實例化它的一個子類。

要實現AR體驗的特性,您須要建立如下子類之一,並經過run(with:)在您的會話中運行它。一個會話一次只能運行一種配置,因此選擇一種最能促進所需AR體驗的配置。ARConfiguration提供瞭如下一些配置:

ARConfiguration子類

ARConfiguration 類結構

ARConfiguration類結構

具體定義以下:

/** 一個對象來描述和配置加強現實技術,以在ARSession中使用。 */
API_AVAILABLE(ios(11.0))
@interface ARConfiguration : NSObject <NSCopying>

/** 肯定此設備是否支持ARConfiguration。 */
@property (class, nonatomic, readonly) BOOL isSupported; /** 此配置和設備支持的視頻格式列表。 @discussion 列表中的第一個元素是會話輸出的默認格式。 */ @property (class, nonatomic, readonly) NSArray<ARVideoFormat *> *supportedVideoFormats API_AVAILABLE(ios(11.3)); /** 視頻格式的會話輸出。 */ @property (nonatomic, strong) ARVideoFormat *videoFormat API_AVAILABLE(ios(11.3)); /** 決定了座標系應該如何與世界保持一致。 @discussion 默認是 ARWorldAlignmentGravity. */ @property (nonatomic, assign) ARWorldAlignment worldAlignment; /** 啓用或禁用光估計。 @discussion 默認開啓 */ @property (nonatomic, assign, getter=isLightEstimationEnabled) BOOL lightEstimationEnabled; /** 肯定是否捕獲和提供音頻數據。 @discussion 默認禁止. */ @property (nonatomic, assign) BOOL providesAudioData; /** 爲每一個框架提供的語義理解類型。 @discussion 使用「supportsFrameSemantics」類方法檢查要運行的配置類型是否支持框架語義集。例如,當運行一個會話時 一個ARWorldTrackingConfiguration類型的配置須要使用「+[ARWorldTrackingConfiguration supportsFrameSemantics:]」來執行上述檢查。 若是該選項,則引起異常 不支持。默認爲ARFrameSemanticNone。 @see ARFrameSemantics @see +[ARConfiguration supportsFrameSemantics:] */ @property (nonatomic, assign) ARFrameSemantics frameSemantics API_AVAILABLE(ios(13.0)); /** 肯定設備和ARConfiguration類是否支持幀語義的類型。 @discussion 並不是全部設備都支持語義框架理解。使用「supportsFrameSemantics」類方法檢查要運行的配置類型是否支持 框架語義集。例如,當運行一個配置類型爲ARWorldTrackingConfiguration的會話時,就須要使用它 +[ARWorldTrackingConfiguration supportsFrameSemantics:]來執行上述檢查。 @see ARFrameSemantics */ + (BOOL)supportsFrameSemantics:(ARFrameSemantics)frameSemantics API_AVAILABLE(ios(13.0)); /** Unavailable */ - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @end 複製代碼

3.3.1 ARObjectScanningConfiguration

class ARObjectScanningConfiguration : ARConfiguration 複製代碼

ARObjectScanningConfiguration類結構

ARObjectScanningConfiguration類定義:

/** 掃描對象的配置。 @discussion 對象掃描配置運行世界跟蹤,捕獲額外的細節以建立引用對象。 運行對象掃描將消耗額外的能量,以提供更詳細的功能。 能夠在會話中調用createReferenceObject方法來捕獲世界中對象的掃描。 */
API_AVAILABLE(ios(12.0))
@interface ARObjectScanningConfiguration : ARConfiguration

/** 啓用或禁用連續自動對焦。 @discussion 默認開啓. */
@property (nonatomic, assign, getter=isAutoFocusEnabled) BOOL autoFocusEnabled;

/** 場景中要檢測的飛機類型。 @discussion 若是設置,新的飛機將繼續被檢測和更新的時間。檢測到的平面將被添加到會話中 ARPlaneAnchor對象。若是兩個平面合併,則新平面將被刪除。默認爲ARPlaneDetectionNone。 */
@property (nonatomic, assign) ARPlaneDetection planeDetection;

- (instancetype)init;
+ (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead");

@end
複製代碼

要建立一個識別物理環境中的對象的應用程序,首先要在開發期間使用ARObjectScanningConfiguration 掃描它們。掃描對象以後,調用createReferenceObject(transform:center:extent:completionHandler:) 將其轉換爲一個能夠在運行時再次檢測它的ARReferenceObject。當用戶運行你的應用程序時,你要求ARKit經過運行一個世界跟蹤配置來尋找你掃描的objects,並將引用對象分配給它的detectionObjects屬性。

func createReferenceObject(transform: simd_float4x4, center: simd_float3, extent: simd_float3, completionHandler: @escaping (ARReferenceObject?, Error?) -> Void)
複製代碼

這個函數會返回一個表示世界地圖的指定區域的一個ARReferenceObject。 參數說明:

  1. transform:定義要提取區域的局部座標系統的原點和方向的變換矩陣。
  2. center:相對於transform指定的原點的一個點,它定義要提取的區域的邊界框的中心。
  3. extent:要提取的區域的寬度、高度和深度,以中心點爲中心並指向變換指定的本地座標系統。
  4. completionHandler:在ARKit完成建立引用對象後異步調用的處理程序。處理程序有兩個參數:
  5. referenceObject: 生成的ARReferenceObject,若是不能建立引用對象,則爲nil。 6 error: 若是referenceObject爲nil,則會出現一個ARError來描述失敗。

注意:此方法僅在使用ARObjectScanningConfiguration運行會話時有效,該配置支持掃描引用對象所需的高保真空間數據收集。在具備不一樣配置的會話上調用此方法將當即調用帶有錯誤的completionHandler。

要使用提取的參考對象進行3D對象檢測,請將其分配給世界跟蹤配置的detectionObjects屬性。您能夠將引用對象保存到文件中,並將它們添加到Xcode資產目錄中,從而將它們綁定到應用程序中。

當ARKit檢測到一個引用圖像時,結果ARObjectAnchor的轉換基於引用對象的座標系統的組織——在提取引用對象時指定的轉換。例如,若是引用對象表示位於水平面上的物理項,則虛擬內容應該出如今物理對象所作的任何表面上。要在提取後調整引用對象的原點,請使用applyingTransform()方法。

  • applyingTransform()方法說明: 這個方法返回一個將指定的轉換應用於此引用對象的幾何數據而建立的新引用對象。
func applyingTransform(_ transform: simd_float4x4) -> ARReferenceObject
複製代碼

傳入參數transform: 參考對象的局部座標空間中的變換矩陣。

ARWorldMap中提取引用對象時,要定義它的本地座標空間。若是現有的引用對象具備與對象的預期用途不匹配的局部座標原點,則調用此方法來更改引用對象相對於其所表示的物理對象的原點。

ARKit檢測到一個引用對象時,結果ARObjectAnchor的轉換基於引用對象的座標系統的組織。例如,若是引用對象表示位於水平面上的物理項,則虛擬內容應該出如今物理對象所作的任何表面上。所以,將引用對象的座標原點與物理對象的底部對齊一般頗有用。

3.3.2 ARBodyTrackingConfiguration

class ARBodyTrackingConfiguration : ARConfiguration 複製代碼

當ARKit在後攝像頭提要中識別一我的時,它調用session(_:didAdd:),並向您傳遞一個ARBodyAnchor,您可使用它來跟蹤身體的運動。 啓用了平面檢測和圖像檢測。若是使用body錨來顯示虛擬字符,則能夠在選擇的表面或圖像上設置該字符。 默認狀況下,ARConfiguration.FrameSemantics類型的bodyDetection是啓用的,它容許你訪問一我的的關節位置,ARKit經過幀的detectedBody在攝像頭反饋中檢測到這我的。

3.3.2.1 ARBodyTrackingConfiguration 類定義

ARBodyTrackingConfiguration類結構

/** 用於運行身體跟蹤的配置。 @discussion 身體跟蹤提供了6個自由度的跟蹤被檢測的身體在現場。默認狀況下,ARFrameSemanticBodyDetection是 啓用。 @see ARBodyAnchor @see -[ARFrame detectedBody] */
API_AVAILABLE(ios(13.0))
@interface ARBodyTrackingConfiguration : ARConfiguration

/** 啓用或禁用連續自動對焦。 @discussion 默認開啓. */
@property (nonatomic, assign, getter=isAutoFocusEnabled) BOOL autoFocusEnabled;

/** 世界跟蹤將定位和跟蹤的物理空間的初始地圖。 @discussion 若是設置了,會話將嘗試本地化到提供的映射 在本地化成功或再次運行以前,將調用有限的跟蹤狀態 指定了不一樣的(或沒有)初始映射。一旦本地化,地圖將被擴展 而且能夠在會話中使用' getCurrentWorldMap '方法再次保存。 */
@property (nonatomic, strong, nullable) ARWorldMap *initialWorldMap;

/** 運行環境紋理的模式。 @discussion 若是設置,紋理信息將被積累和更新。向會話添加一個AREnvironmentProbeAnchor 將得到當前環境紋理從探測器的角度能夠用來照明 場景中的虛擬對象。默認爲AREnvironmentTexturingNone。 */
@property (nonatomic, assign) AREnvironmentTexturing environmentTexturing;

/** 肯定環境紋理是否具備高動態範圍。默認啓用。 */
@property (nonatomic, assign) BOOL wantsHDREnvironmentTextures;

/** 場景中要檢測的飛機類型。 @discussion 若是設置,新的飛機將繼續被檢測和更新的時間。檢測到的平面將被添加到會話中 ARPlaneAnchor對象。若是兩個平面合併,則新平面將被刪除。默認爲ARPlaneDetectionNone。 */
@property (nonatomic, assign) ARPlaneDetection planeDetection;

/** 在場景中檢測圖像。 @discussion 若是設置,會話將嘗試檢測指定的圖像。當檢測到一個圖像時,ARImageAnchor將被添加到會話中。 */
@property (nonatomic, copy) NSSet<ARReferenceImage *> *detectionImages;

/** 啓用可用於校訂圖像的物理大小的比例因子的估計。 @discussion 若是設置爲true ARKit,將嘗試使用計算過的攝像機位置來計算給定物理大小所對應的比例 與估計的不一樣。關於估計比例尺的信息能夠在ARImageAnchor上找到estimatedScaleFactor屬性。 @note 當設置爲true時,返回的ARImageAnchor的轉換將使用估計的比例因子來修正轉換。默認值是NO。 */
@property (nonatomic, assign) BOOL automaticImageScaleEstimationEnabled;

/** 容許估計比例因子,該比例因子可用於在3D中糾正骨骼的物理大小。 @discussion 若是設置爲true ARKit,將嘗試使用計算過的攝像機位置來計算給定物理大小所對應的比例 與默認值不一樣。關於估計比例尺的信息能夠在ARBodyAnchor上找到estimatedScaleFactor屬性。 @note 當設置爲true時,返回的ARBodyAnchor的轉換將使用估計的比例因子來修正轉換。默認值是NO。 */
@property (nonatomic, assign) BOOL automaticSkeletonScaleEstimationEnabled;
/** 同時跟蹤的最大圖像數。 @discussion 設置跟蹤圖像的最大數量將限制給定幀中能夠跟蹤的圖像的數量。 若是看到的圖像超過最大值,則只有已經被跟蹤的圖像將繼續跟蹤,直到丟失跟蹤或刪除另外一個圖像爲止。 無論跟蹤的圖像是什麼,圖像都將繼續被檢測到。默認值爲0。 */
@property (nonatomic, assign) NSInteger maximumNumberOfTrackedImages;

- (instancetype)init;
+ (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead");

@end
複製代碼
3.3.2.1 ARBodyTrackingConfiguration 屬性和方法
  • 建立一個配置
//建立一個新的身體跟蹤配置。
init()
//試圖使用此會話配置恢復前一個AR會話的狀態。
var initialWorldMap: ARWorldMap?

複製代碼
  • 估計身體比例
//一個標誌,它決定ARKit是否估計它所跟蹤的物體的高度。
var automaticSkeletonScaleEstimationEnabled: Bool

複製代碼
  • 支持自動對焦
//一個布爾值,用於肯定設備攝像頭是使用固定焦距仍是自動焦距。
var isAutoFocusEnabled: Bool

複製代碼
  • 使飛機檢測
//一個值,指定會話是否以及如未嘗試自動檢測攝像機捕獲的圖像中的平面。
var planeDetection: ARWorldTrackingConfiguration.PlaneDetection

//選擇是否和如何檢測捕獲的圖像平面
struct ARWorldTrackingConfiguration.PlaneDetection 複製代碼
  • 使圖像跟蹤
//一個標誌,指示ARKit估計和設置跟蹤圖像的規模表明您。
var automaticImageScaleEstimationEnabled: Bool

//ARKit試圖在用戶環境中檢測的一組圖像。
var detectionImages: Set<ARReferenceImage>

//檢測圖像的最大數目,爲其同時跟蹤運動。
var maximumNumberOfTrackedImages: Int

複製代碼
  • 增長了現實的反射
//一個標誌,指示ARKit建立HDR格式的環境紋理。
var wantsHDREnvironmentTextures: Bool

//用於生成環境紋理。
var environmentTexturing: ARWorldTrackingConfiguration.EnvironmentTexturing

複製代碼

3.3.3 ARFaceTrackingConfiguration

class ARFaceTrackingConfiguration : ARConfiguration 複製代碼

人臉跟蹤配置檢測能夠在設備的前置攝像頭中看到的人臉。當ARKit檢測到人臉時,它會建立一個ARFaceAnchor對象,該對象提供關於人臉的位置和方向、拓撲結構以及描述面部表情的特徵的信息。

面部跟蹤只能在帶有前置TrueDepth攝像頭的iOS設備上使用(參見iOS設備兼容性參考資料)。在爲用戶提供任何須要面部跟蹤的功能以前,使用ARFaceTrackingConfiguration isSupported屬性來肯定當前設備上是否能夠進行面部跟蹤。

ARFaceTrackingConfiguration類不提供方法或屬性,可是支持從它的超類ARConfiguration繼承的全部屬性。此外,當您啓用isLightEstimationEnabled設置時,面部跟蹤配置將檢測到的面部用做光探測器,並提供定向或環境照明的估計(一個ARDirectionalLightEstimate對象)。

面部跟蹤爲您的應用程序提供我的面部信息。若是你使用ARKit面部跟蹤功能,你的應用程序必須包括一個隱私政策,向用戶描述你打算如何使用面部跟蹤和麪部數據。有關詳細信息,請參見蘋果開發者程序許可協議

3.3.3.1 ARFaceTrackingConfiguration 類定義

ARFaceTrackingConfiguration類定義

/** 運行面部跟蹤的配置. @discussion 面部跟蹤使用前置攝像頭在3D中跟蹤面部,提供關於面部拓撲結構和表情的細節。 檢測到的人臉將做爲ARFaceAnchor對象添加到會話中,該對象包含關於頭部姿態、網格、眼睛姿態和混合形狀的信息 係數。若是光估計是啓用的,被檢測的臉將被視爲一個光探針,用來估計入射光的方向。 */
API_AVAILABLE(ios(11.0))
@interface ARFaceTrackingConfiguration : ARConfiguration

/** 能夠同時跟蹤的最大面數。 */
@property (class, nonatomic, readonly) NSInteger supportedNumberOfTrackedFaces API_AVAILABLE(ios(13.0)); /** 同時跟蹤的最大面數。 @discussion 設置最大跟蹤面數將限制給定幀中能夠跟蹤的面數。 若是超過最大值可見,只有已經被跟蹤的面孔將繼續跟蹤,直到跟蹤丟失或另外一個面孔被刪除。 默認值爲1。 */ @property (nonatomic, assign) NSInteger maximumNumberOfTrackedFaces API_AVAILABLE(ios(13.0)); /** 指示是否能夠在此設備上啓用世界跟蹤。 */ @property (class, nonatomic, readonly) BOOL supportsWorldTracking API_AVAILABLE(ios(13.0)); /** 啓用或禁用世界跟蹤。默認狀況下禁用。 @discussion 啓用後,ARSession使用後置攝像頭來跟蹤設備在世界上的方位和位置。攝像機變換和ARFaceAnchor變換將在世界座標空間中。 */ @property (nonatomic, assign, getter=isWorldTrackingEnabled) BOOL worldTrackingEnabled API_AVAILABLE(ios(13.0)); - (instancetype)init; + (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead"); @end 複製代碼
3.3.3.2 ARFaceTrackingConfiguration 屬性和方法
  • 建立一個配置
//建立一個新的面部跟蹤配置。
init()

複製代碼
  • 開啓世界跟蹤
//iOS設備是否支持世界跟蹤與面部跟蹤。
class var supportsWorldTracking: Bool //使世界跟蹤與臉跟蹤是否開啓。 var isWorldTrackingEnabled: Bool 複製代碼
  • 跟蹤多個面孔
//同時跟蹤的最大面數。
var maximumNumberOfTrackedFaces: Int

//ARKit能夠同時跟蹤的最大面數。
class var supportedNumberOfTrackedFaces: Int 複製代碼

3.3.4 ARWorldTrackingConfiguration

  • ARWorldTrackingConfiguration : 跟蹤設備相對於任何表面,人,或已知的圖像和對象的位置和方向,ARKit可能會發現和跟蹤使用設備的後攝像頭。
class ARWorldTrackingConfiguration : ARConfiguration 複製代碼

全部AR配置都創建了設備所在的真實世界與虛擬3d座標空間之間的對應關係,在虛擬座標空間中,您能夠對內容進行建模。當您的應用程序將虛擬內容與實時攝像機圖像混合時,用戶會產生一種錯覺,認爲您的虛擬內容是真實世界的一部分。

建立和維護空間之間的這種對應關係須要跟蹤設備的移動。ARWorldTrackingConfiguration類使用六個自由度(6DOF)跟蹤設備的移動:三個旋轉軸(滾動、俯仰和偏航)和三個平移軸(xyz中的移動)。

這種跟蹤能夠創造身臨其境的基於「增大化現實」技術的遊戲體驗:虛擬對象能夠呆在同一個地方出現相對於現實世界,即便用戶傾斜設備高於或低於該對象,或移動周圍的設備對象的兩側和背部。

六個自由度跟蹤

ARWorldTrackingConfiguration 提供 6DoF(Six Degree of Freedom)的設備追蹤。包括三個姿態角 Yaw(偏航角)、Pitch(俯仰角)和 Roll(翻滾角),以及沿笛卡爾座標系中 XYZ 三軸的偏移量,以下圖:

在這裏插入圖片描述
不只如此, ARKit 還使用了 VIO(Visual-Inertial Odometry)來提升設備運動追蹤的精度。在使用慣性測量單元( IMU)檢測運動軌跡的同時,對運動過程當中攝像頭拍攝到的圖片進行圖像處理。將圖像中的一些特徵點的變化軌跡與傳感器的結果進行比對後,輸出最終的高精度結果。

3.3.4.1 ARWorldTrackingConfiguration 類定義

ARWorldTrackingConfiguration還提供了幾種方法,讓你的應用程序識別或與相機可見的真實世界場景的元素進行交互:

  1. 使用planeDetection查找真實世界的水平或垂直表面,將它們做爲ARPlaneAnchor對象添加到會話中。
  2. 使用detectionImages識別和跟蹤已知的2D圖像的移動,將它們做爲ARImageAnchor對象添加到場景中。
  3. 使用detectionObjects來識別已知的3D對象,將它們做爲ARObjectAnchor對象添加到場景中。
  4. ARFrameARViewARSCNViewARSKView上使用光線投射函數來查找與攝像機視圖中的2D點相關的真實世界特徵的3D位置。

ARWorldTrackingConfiguration 類結構

ARWorldTrackingConfiguration類定義:

/** 運行世界跟蹤的配置. @discussion 世界跟蹤提供6個自由度的跟蹤設備。 經過在場景中尋找特徵點,世界跟蹤能夠對幀執行命中測試。 一旦會話暫停,跟蹤將不能再繼續。 */
API_AVAILABLE(ios(11.0))
@interface ARWorldTrackingConfiguration : ARConfiguration

/** 啓用或禁用連續自動對焦。 @discussion 默認開啓. */
@property (nonatomic, assign, getter=isAutoFocusEnabled) BOOL autoFocusEnabled API_AVAILABLE(ios(11.3));

/** 運行環境紋理的模式。 @discussion 若是設置,紋理信息將被積累和更新。向會話添加一個AREnvironmentProbeAnchor 將得到當前環境紋理從探測器的角度能夠用來照明 場景中的虛擬對象。默認爲AREnvironmentTexturingNone。 */
@property (nonatomic, assign) AREnvironmentTexturing environmentTexturing API_AVAILABLE(ios(12.0));

/** 肯定環境紋理是否具備高動態範圍。 默認啓用。 */
@property (nonatomic, assign) BOOL wantsHDREnvironmentTextures API_AVAILABLE(ios(13.0));

/** 場景中要檢測的飛機類型。 @discussion 若是設置,新的飛機將繼續被檢測和更新的時間。檢測到的平面將被添加到會話中 ARPlaneAnchor對象。若是兩個平面合併,則新平面將被刪除。默認爲ARPlaneDetectionNone。 */
@property (nonatomic, assign) ARPlaneDetection planeDetection;

/** 世界跟蹤將定位和跟蹤的物理空間的初始地圖。 @discussion 若是設置了,會話將嘗試本地化到提供的映射 在本地化成功或再次運行以前,將調用有限的跟蹤狀態 指定了不一樣的(或沒有)初始映射。一旦本地化,地圖將被擴展 而且能夠在會話中使用' getCurrentWorldMap '方法再次保存。 */
@property (nonatomic, strong, nullable) ARWorldMap *initialWorldMap API_AVAILABLE(ios(12.0));

/** 在場景中檢測圖像。 @discussion 若是設置,會話將嘗試檢測指定的圖像。當檢測到一個圖像時,ARImageAnchor將被添加到會話中。 */
@property (nonatomic, copy, null_resettable) NSSet<ARReferenceImage *> *detectionImages API_AVAILABLE(ios(11.3));

/** 啓用可用於校訂圖像的物理大小的比例因子的估計。 @discussion 若是設置爲true, ARKit將嘗試使用計算過的攝像機位置來計算給定物理大小所對應的比例 與估計的不一樣。關於估計比例尺的信息能夠在ARImageAnchor上找到estimatedScaleFactor屬性。 @note 當設置爲true時,返回的ARImageAnchor的轉換將使用估計的比例因子來修正轉換。默認值是NO。 */
@property (nonatomic, assign) BOOL automaticImageScaleEstimationEnabled API_AVAILABLE(ios(13.0));

/** 同時跟蹤的最大圖像數。 @discussion 設置跟蹤圖像的最大數量將限制給定幀中能夠跟蹤的圖像的數量。 若是看到的圖像超過最大值,則只有已經被跟蹤的圖像將繼續跟蹤,直到丟失跟蹤或刪除另外一個圖像爲止。 無論跟蹤的圖像是什麼,圖像都將繼續被檢測到。默認值爲0。 */
@property (nonatomic, assign) NSInteger maximumNumberOfTrackedImages API_AVAILABLE(ios(12.0));

/** 要在場景中檢測的對象。 @discussion 若是設置,會話將嘗試檢測指定的對象。當檢測到一個對象時,ARObjectAnchor將被添加到會話中。 */
@property (nonatomic, copy) NSSet<ARReferenceObject *> *detectionObjects API_AVAILABLE(ios(12.0));

/** 啓用/禁用協做會話。默認狀況下禁用。 @discussion 當啓用時,ARSession將使用其委託didOutputCollaborationData爲其餘參與者輸出協做數據。 調用者的職責是將數據發送給每一個參與者。當一個參與者接收到數據時,它 應該經過調用updateWithCollaborationData傳遞給ARSession。 */
@property (nonatomic, assign, getter=isCollaborationEnabled) BOOL collaborationEnabled API_AVAILABLE(ios(13.0));

/** 指示是否能夠在此設備上啓用使用前置攝像頭的用戶臉部跟蹤。 */
@property (class, nonatomic, readonly) BOOL supportsUserFaceTracking API_AVAILABLE(ios(13.0)); /** 啓用或禁用運行面部跟蹤使用前置攝像頭。默認狀況下禁用。 當啓用時,ARSession會檢測人臉(若是在前置攝像頭圖像中可見),並將其添加到錨點列表中, 表示每一個面的ARFaceAnchor對象。 @discussion ARFaceAnchor對象的變換將在世界座標空間中進行。 @see ARFaceAnchor */ @property (nonatomic, assign, getter=userFaceTrackingEnabled) BOOL userFaceTrackingEnabled API_AVAILABLE(ios(13.0)); - (instancetype)init; + (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead"); @end 複製代碼
3.3.4.2 ARWorldTrackingConfiguration 屬性, 方法說明
  • 建立一個配置:
  1. init() : 初始化一個新的世界跟蹤配置。
  2. var initialWorldMap: ARWorldMap?: 試圖使用此會話配置恢復前一個AR會話的狀態。
  • 跟蹤表面:
  1. var planeDetection: ARWorldTrackingConfiguration.PlaneDetection :一個值,指定會話是否以及如何自動嘗試檢測攝像機捕獲的圖像中的平面。
  2. struct ARWorldTrackingConfiguration.PlaneDetection: 選擇是否和如何檢測捕獲的圖像平面。
  3. var sceneReconstruction: ARConfiguration.SceneReconstruction: 使場景重建成爲可能的標誌。
  4. class func supportsSceneReconstruction(ARConfiguration.SceneReconstruction) -> Bool: 檢查設備是否支持場景重建。
  • 檢測或跟蹤圖像:
  1. var detectionImages: Set<ARReferenceImage>!: ARKit試圖在用戶環境中檢測的一組圖像。
  2. var maximumNumberOfTrackedImages: Int : 用於同時跟蹤運動的檢測圖像的最大數目。
  3. var automaticImageScaleEstimationEnabled: Bool : 一個標誌,指示ARKit估計和設置一個檢測或跟蹤圖像的規模表明您。
  • 檢測3D對象:
  1. var detectionObjects: Set<ARReferenceObject>: 一組用於ARKit嘗試在用戶環境中檢測的3D對象。
  • 跟蹤用戶的臉:
  1. var userFaceTrackingEnabled: Bool: 一個標誌,它決定ARKit是否在一個世界跟蹤會話中跟蹤用戶的臉。
  2. class var supportsUserFaceTracking: Bool:一個布爾值,告訴你iOS設備是否支持在世界跟蹤會話期間跟蹤用戶的臉。
  • 建立現實反射:
  1. var environmentTexturing: ARWorldTrackingConfiguration.EnvironmentTexturing: 行爲ARKit用於生成環境紋理。
  2. enum ARWorldTrackingConfiguration.EnvironmentTexturing: 在世界跟蹤AR會話中生成環境紋理的選項。
  3. class AREnvironmentProbeAnchor : 在世界跟蹤AR會話中爲特定空間區域提供環境照明信息的對象。
  4. var wantsHDREnvironmentTextures: Bool : 一個標誌,指示ARKit建立HDR格式的環境紋理。
  • 管理設備攝像頭行爲:
  1. var isAutoFocusEnabled: Bool : 一個布爾值,用於肯定設備攝像頭是使用固定焦距仍是自動焦距。
  • 容許多用戶協做:
  1. var isCollaborationEnabled: Bool: 一個標誌,選擇你在一個點對點多用戶加強現實的經驗。

3.3.5 AROrientationTrackingConfiguration

class AROrientationTrackingConfiguration : ARConfiguration 複製代碼

全部AR配置都創建了設備所在的真實世界與虛擬3D座標空間之間的對應關係,在虛擬3D座標空間中能夠對內容進行建模。當你的應用程序將這些內容與實時的攝像頭圖像一塊兒顯示時,用戶會產生一種錯覺,認爲你的虛擬內容是現實世界的一部分。

建立和維護空間之間的這種對應關係須要跟蹤設備的移動。AROrientationTrackingConfiguration類使用三個自由度(3DOF)來跟蹤設備的移動:具體來講,就是三個旋轉軸(滾動、俯仰和偏航)。

三個自由度

這種基本級別的運動跟蹤能夠建立有限的AR體驗:一個虛擬對象能夠看起來是現實世界的一部分,即便用戶旋轉設備查看該對象的上面、下面或旁邊。然而,這種配置不能跟蹤設備的移動:非瑣碎地改變設備的位置會打破AR錯覺,致使虛擬內容相對於真實世界出現漂移。例如,用戶不能四處走動查看虛擬對象的側面和背面。此外,3DOF跟蹤不支持平面檢測或命中測試。

由於3DOF跟蹤建立有限的AR體驗,你一般不該該直接使用AROrientationTrackingConfiguration類。相反,使用ARWorldTrackingConfiguration進行6自由度的平面檢測和命中測試。僅在6DOF跟蹤暫時不可用的狀況下,使用3DOF跟蹤做爲備份。

3.3.5.1 AROrientationTrackingConfiguration 類定義

AROrientationTrackingConfiguration類定義
AROrientationTrackingConfiguration 類定義

/** 用於運行方向跟蹤的配置。 @discussion 定位跟蹤提供了3個自由度的設備跟蹤。 */
API_AVAILABLE(ios(11.0))
@interface AROrientationTrackingConfiguration : ARConfiguration

/** 啓用或禁用連續自動對焦。 @discussion 默認啓用 */
@property (nonatomic, assign, getter=isAutoFocusEnabled) BOOL autoFocusEnabled API_AVAILABLE(ios(11.3));

- (instancetype)init;
+ (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead");

@end
複製代碼
3.3.5.2 AROrientationTrackingConfiguration 屬性方法說明
  • 建立一個配置:
  1. init() : 初始化一個新的方向跟蹤配置。
  • 管理設備攝像頭行爲:
  1. var isAutoFocusEnabled: Bool: 一個布爾值,用於肯定設備攝像頭是使用固定焦距仍是自動焦距。

3.3.6 ARImageTrackingConfiguration

class ARImageTrackingConfiguration : ARConfiguration 複製代碼

全部AR配置都創建了設備所在的真實世界與虛擬3D座標空間之間的對應關係,在虛擬3D座標空間中能夠對內容進行建模。當你的應用程序將這些內容與實時的攝像頭圖像一塊兒顯示時,用戶會產生一種錯覺,認爲你的虛擬內容是現實世界的一部分。

經過ARImageTrackingConfiguration , ARKit不是經過跟蹤設備相對於世界的運動來創建一個3D空間,而是僅僅經過檢測和跟蹤已知的二維圖像在攝像機中的運動。ARWorldTrackingConfiguration也能夠檢測圖像,但每種配置都有本身的優點。ARImageTrackingConfiguration 的特色以下 :

  • 與只跟蹤圖像相比,世界跟蹤具備更高的性能成本,所以您的會話可使用ARImageTrackingConfiguration一次可靠地跟蹤更多的圖像。
  • 只跟蹤圖像,讓您錨虛擬內容到已知的圖像,只有當這些圖像是在相機的視野。世界跟蹤與圖像檢測容許您使用已知的圖像添加虛擬內容到3D世界,並繼續跟蹤該內容在世界空間的位置,即便圖像再也不在視圖中。
  • 世界跟蹤在穩定、靜止的環境中效果最好。您能夠在更多的狀況下使用圖像跟蹤將虛擬內容添加到已知的圖像中——例如,在移動的地鐵車箱內的廣告。

當圖像跟蹤配置檢測到已知的圖像時,它將以6個自由度(6DOF)跟蹤它們的移動:具體來講,就是3個旋轉軸(滾動、俯仰和偏航)和3個平移軸(xyz的移動)。

要使用ARImageTrackingConfiguration,請定義ARReferenceImage對象(在運行時或經過將它們綁定到Xcode資產目錄中),並將它們分配給配置的trackingImages屬性。而後,與任何AR配置同樣,將配置傳遞給會話的run(_:options:)方法。

3.3.6.1 ARImageTrackingConfiguration 類定義

ARImageTrackingConfiguration類結構

ARImageTrackingConfiguration 類定義:

/** 運行圖像跟蹤的配置。 @discussion 圖像跟蹤提供6個自由度的跟蹤已知圖像。能夠同時跟蹤四幅圖像。 */
API_AVAILABLE(ios(12.0))
@interface ARImageTrackingConfiguration : ARConfiguration

/** 啓用或禁用連續自動對焦。 @discussion 默認啓用 */
@property (nonatomic, assign, getter=isAutoFocusEnabled) BOOL autoFocusEnabled;

/** 在場景中跟蹤圖像。 */
@property (nonatomic, copy) NSSet<ARReferenceImage *> *trackingImages;

/** 同時跟蹤的最大圖像數。 @discussion 設置跟蹤圖像的最大數量將限制給定幀中能夠跟蹤的圖像的數量。 若是看到的圖像超過最大值,則只有已經被跟蹤的圖像將繼續跟蹤,直到丟失跟蹤或刪除另外一個圖像爲止。 默認值爲1。 */
@property (nonatomic, assign) NSInteger maximumNumberOfTrackedImages;

- (instancetype)init;
+ (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead");

@end
複製代碼
3.3.6.2 ARImageTrackingConfiguration 屬性說明
  • 建立一個配置:
  1. init(): 初始化一個新的圖像跟蹤配置。
  • 選擇圖像進行跟蹤:
  1. var trackingImages: Set<ARReferenceImage> : ARKit試圖在用戶環境中檢測和跟蹤的一組圖像。
  2. var maximumNumberOfTrackedImages: Int : 要同時跟蹤運動的圖像的最大數目。
  • 管理設備攝像頭行爲:
  1. var isAutoFocusEnabled: Bool: 一個布爾值,用於肯定設備攝像頭是使用固定焦距仍是自動焦距。

3.3.7 ARObjectScanningConfiguration

class ARObjectScanningConfiguration : ARConfiguration 複製代碼

要建立一個識別物理環境中的對象的應用程序:

  1. 首先要在開發期間使用ARObjectScanningConfiguration掃描它們。
  2. 掃描對象以後,調用 createReferenceObject(transform:center:extent:completionHandler:) 其轉換爲一個能夠在運行時再次檢測它的ARReferenceObject
  3. 當用戶運行你的應用程序時,你要求ARKit經過運行一個世界跟蹤配置來尋找你掃描的物體,並將引用對象分配給它的detectionObjects屬性。

ARObjectScanningConfiguration僅用於開發場景。因爲對象掃描所需的高保真空間映射具備較高的性能和能量消耗,所以禁用了許多對象掃描不須要的ARKit特性。

3.3.7.1 ARObjectScanningConfiguration 類定義

ARObjectScanningConfiguration類定義

ARPositionalTrackingConfiguration 類定義:

ARObjectScanningConfiguration

/** 掃描對象的配置。 @discussion 對象掃描配置運行世界跟蹤,捕獲額外的細節以建立引用對象。 運行對象掃描將消耗額外的能量,以提供更詳細的功能。 能夠在會話中調用createReferenceObject方法來捕獲世界中對象的掃描。 */
API_AVAILABLE(ios(12.0))
@interface ARObjectScanningConfiguration : ARConfiguration

/** 啓用或禁用連續自動對焦。 @discussion 默認開啓. */
@property (nonatomic, assign, getter=isAutoFocusEnabled) BOOL autoFocusEnabled;

/** 場景中要檢測的飛機類型。 @discussion 若是設置,新的飛機將繼續被檢測和更新的時間。檢測到的平面將被添加到會話中 ARPlaneAnchor對象。若是兩個平面合併,則新平面將被刪除。默認爲ARPlaneDetectionNone。 */
@property (nonatomic, assign) ARPlaneDetection planeDetection;

- (instancetype)init;
+ (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead");

@end
複製代碼
3.3.7.1 ARObjectScanningConfiguration 屬性說明
  • 建立一個配置:
  1. init() : 初始化一個新的對象掃描配置。
  • 使飛機檢測:
  1. var planeDetection: ARWorldTrackingConfiguration.PlaneDetection : 一個值,指定會話是否以及如未嘗試自動檢測攝像機捕獲的圖像中的平面。
  2. struct ARWorldTrackingConfiguration.PlaneDetection : 選擇是否和如何檢測捕獲的圖像平面。
  • 管理設備攝像頭行爲:
  1. var isAutoFocusEnabled: Bool : 一個布爾值,用於肯定設備攝像頭是使用固定焦距仍是自動焦距。

3.3.8 ARPositionalTrackingConfiguration

class ARPositionalTrackingConfiguration : ARConfiguration 複製代碼

經過以儘量低的分辨率和幀速率運行攝像頭,支持iOS設備的6個自由度跟蹤。當您不須要解析攝像機提要(例如,虛擬現實場景)時,請使用此配置。

3.3.8.1 ARPositionalTrackingConfiguration 類定義

ARPositionalTrackingConfiguration類結構

/** 用於運行位置跟蹤的配置。 @discussion 經過以儘量低的分辨率和幀速率運行攝像機,位置跟蹤提供了6個自由度的設備跟蹤。 */
API_AVAILABLE(ios(13.0))
@interface ARPositionalTrackingConfiguration : ARConfiguration

/** 場景中要檢測的飛機類型。 @discussion 若是設置,新的飛機將繼續被檢測和更新的時間。檢測到的平面將被添加到會話中 ARPlaneAnchor對象。若是兩個平面合併,則新平面將被刪除。默認爲ARPlaneDetectionNone。 */
@property (nonatomic, assign) ARPlaneDetection planeDetection;

/** 世界跟蹤將定位和跟蹤的物理空間的初始地圖。 @discussion 若是設置了,會話將嘗試本地化到提供的映射 在本地化成功或再次運行以前,將調用有限的跟蹤狀態 指定了不一樣的(或沒有)初始映射。一旦本地化,地圖將被擴展 而且能夠在會話中使用' getCurrentWorldMap '方法再次保存。 */
@property (nonatomic, strong, nullable) ARWorldMap *initialWorldMap;

- (instancetype)init;
+ (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead");

@end
複製代碼
3.3.8.2 ARPositionalTrackingConfiguration 屬性
  • 建立一個配置:
  1. init():建立一個新的位置跟蹤配置。
  2. var initialWorldMap: ARWorldMap?: 試圖使用此會話配置恢復前一個AR會話的狀態。
  • 檢測真實的表面:
  1. var planeDetection: ARWorldTrackingConfiguration.PlaneDetection : 一個值,指定會話是否以及如何自動嘗試檢測攝像機捕獲的圖像中的平面。

3.3.9 ARKit 座標系

ARKit 使用笛卡爾座標系度量真實世界。ARSession 開啓時的設備位置便是座標軸的原點。而 ARSessionConfiguration 的 worldAlignment 屬性決定了三個座標軸的方向,該屬性有三個枚舉值:

  • ARWorldAlignmentCamera
  • ARWorldAlignmentGravity
  • ARWorldAlignmentGravityAndHeading

三種枚舉值對應的座標軸以下圖所示:

三種枚舉值對應的座標軸
對於 ARWorldAlignmentCamera 來講,設備的姿態決定了三個座標軸的方向。這種座標設定適用於以設備做爲參考系的座標計算,與真實地理環境無關,好比用 AR 技術丈量真實世界物體的尺寸。

對於 ARWorldAlignmentGravity 來講,Y 軸方向始終與重力方向平行,而其 X、Z 軸方向仍然由設備的姿態肯定。這種座標設定適用於計算擁有重力屬性的物體座標,好比放置一排氫氣球,或者執行一段籃球下落的動畫。

對於 ARWorldAlignmentGravityAndHeading 來講,X、Y、Z 三軸固定朝向正東、正上、正南。在這種模式下 ARKit 內部會根據設備偏航角的朝向與地磁真北(非地磁北)方向的夾角不斷地作出調整,以確保 ARKit 座標系中 -Z 方向與咱們真實世界的正北方向吻合。有了這個前提條件,真實世界位置座標纔可以正確地映射到虛擬世界中。

3.4 ARCamera

  • ARCamera: 關於給定幀的攝像機位置和成像特性的信息。
class ARCamera : NSObject 複製代碼

您能夠從ARFrame ARKit交付的每一個相機屬性中得到相機信息。

3.5 ARHitTestResult

  • ARHitTestResult: 經過檢查屏幕上的一個點發現的關於真實世界表面的信息。

若是你使用SceneKitSpriteKit做爲你的渲染器,你可使用如下命令在屏幕上搜索真實世界的表面: ARSCNView hitTest(_:types:): 在捕獲的攝像機圖像中搜索與SceneKit視圖中某個點對應的真實對象或AR錨點

ARSKView hitTest(_:types:): 在捕獲的相機圖像中搜索與 SpriteKit視圖中某個點相對應的真實對象或AR錨點。

Hit測試經過AR會話對攝像機圖像的處理來搜索現實世界中的物體或表面。在視圖的座標系統中,2D點能夠指從設備攝像機開始並沿着由設備方向和攝像機投影決定的方向延伸的3D線上的任何點。這個方法沿着這條線搜索,返回全部與它相交的物體,按與攝像機的距離排序。

class ARHitTestResult : NSObject 複製代碼

3.6 ARLightEstimate

  • ARLightEstimate:AR會話中與捕獲的視頻幀相關的估計場景照明信息。
class ARLightEstimate : NSObject 複製代碼

3.7 ARPointCloud

  • ARPointCloud: AR會話的世界座標空間中的點的集合。
class ARPointCloud : NSObject 複製代碼

使用ARFrame rawFeaturePoints屬性得到一個點雲,表示ARKit用於執行世界跟蹤的場景分析的中間結果。

3.8 ARReferenceImage

class ARReferenceImage : NSObject 複製代碼

爲了在真實世界中準確地檢測二維圖像的位置和方向,ARKit須要預處理的圖像數據和圖像的真實世界尺寸的知識。ARReferenceImage類封裝了這些信息。要在AR會話中啓用圖像檢測,請將一組參考圖像傳遞到會話配置的detectionImages屬性。

3.9 ARReferenceObject

class ARReferenceObject : NSObject 複製代碼

ARKit中的對象檢測容許您在會話識別已知的3D對象時觸發AR內容。例如,您的應用程序能夠檢測藝術博物館中的雕塑並提供一個虛擬館長,或檢測桌面遊戲人物併爲遊戲建立視覺效果。

要提供一個已知的3D對象檢測,你掃描一個現實世界的對象使用ARKit:

  1. 使用ARObjectScanningConfiguration運行AR會話,以啓用高保真空間映射數據的收集。
  2. 在這個過程當中,將設備攝像頭從不一樣的角度對準真實世界的物體,這樣ARKit就能夠創建物體及其周圍環境的內部地圖。有關引導用戶交互生成良好掃描數據的示例,請參見掃描和檢測3D對象

3.10 ARVideoFormat

  • ARVideoFormat: 一個視頻大小和幀速率規格,用於AR會話。
@interface ARVideoFormat : NSObject
複製代碼

這個類是不可變的;要設置AR會話的幀速率和視頻分辨率,請將配置的videoFormat屬性設置爲supportedVideoFormats數組中的一種格式。

3.11 ARCollaborationData

@interface ARCollaborationData : NSObject
複製代碼

要建立多用戶加強現實體驗,您能夠在世界跟蹤會話上啓用協做。ARKit會按期輸出用戶之間共享的 ARCollaborationData,這使得每一個人均可以從本身的角度查看相同的虛擬內容。有關更多信息,請參見啓用collaborationEnabled

3.12 ARWorldMap

  • ARWorldMap: 空間映射狀態和一組來自世界跟蹤AR會話的錨點。
class ARWorldMap : NSObject 複製代碼

會話狀態的世界地圖包括ARKit意識的物理空間的用戶移動設備(ARKit用於肯定設備的位置和方向),以及任何ARAnchor對象添加到會話(能夠表示檢測到現實世界的特性或虛擬內容的應用程序)。

3.12.2 ARWorldMap序列化和反序列化世界地圖:

當您的應用程序退出時,您能夠保存當前的世界地圖(使用getCurrentWorldMap(completionHandler:)獲取)。由於ARWorldMap符合NSSecureCoding,因此您使用NSKeyedArchiver序列化它。

func writeWorldMap(_ worldMap: ARWorldMap, to url: URL) throws {
    let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap, requiringSecureCoding: true)
    try data.write(to: url)
}
複製代碼

要在應用程序下次啓動時恢復世界地圖,請使用NSKeyedUnarchiver

func loadWorldMap(from url: URL) throws -> ARWorldMap {
    let mapData = try Data(contentsOf: url)
    guard let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: mapData)
        else { throw ARError(.invalidWorldMap) }
    return worldMap
}
複製代碼

若是應用程序在相同的物理環境中啓動,您可使用恢復的世界地圖中的錨來將相同的虛擬內容放在保存的會話中的相同位置。 有關更多信息,請參見保存和加載世界數據

3.12.3 ARWorldMap共享保存的世界地圖

有了兩個跟蹤相同世界地圖的設備,您就能夠構建一個網絡體驗,兩個用戶均可以看到相同的虛擬內容並與之交互。將ARWorldMap發送到另外一個設備,爲多用戶AR體驗建立一個共享的參考框架:

步驟以下:

  1. 在一個設備上,使用NSKeyedArchiver 將世界地圖轉換爲數據對象。(你不須要把數據寫到一個文件中,而後經過網絡發送。)
  2. 使用您選擇的網絡技術將結果數據發送到另外一個設備。(例如,在一個MultipeerConnectivity會話中,調用send(_:toPeers:with:)來發送數據,並在另外一個設備上實現MCSessionDelegate方法來接收數據。)
  3. 在接收設備上,使用NSKeyedUnarchiver 從數據中反序列化一個ARWorldMap

有關更多信息,請參見建立多用戶加強現實體驗

3.12.4 ARWorldMap運行反序列化的世界地圖

要從現有的ARWorldMap開始新會話,請設置一個世界跟蹤配置的initialWorldMap屬性並使用run(_:options:)。這將啓動一個新的會話,使用相同的空間感知和從保存的世界地圖加載的錨。

3.12.4.1 ARWorldMap相關函數介紹
  • run(_:options:): 是ARSession的一個實例方法,用來使用指定的配置和選項啓動會話的AR處理。它的定義以下:
func run(_ configuration: ARConfiguration, options: ARSession.RunOptions = [])
複製代碼

參數說明:

  1. configuration:爲會話定義運動和場景跟蹤行爲的對象。
  2. options: 影響現有會話狀態(若是有的話)如何轉換到新配置的選項。 若是會話是第一次運行,則此參數無效。

會話跟蹤設備運動,捕獲並處理來自設備攝像頭的場景圖像,並僅在運行時與您的委託對象或ARSCNViewARSKView視圖進行協調。

在已經當即開始過渡到新會話配置的會話上調用此方法。options參數肯定現有會話狀態如何轉換到新配置。默認狀況下,會話從最後一個已知狀態恢復設備位置跟蹤,並保留會話中已經包含的全部錨點(那些您使用add(anchor:)手動添加的錨點,以及那些由ARKit特性(如平面檢測或人臉跟蹤)自動添加的錨點)。

3.13 ARRaycastQuery

  • ARRaycastQuery: 一種數學射線,你能夠用它來找到真實世界表面的三維位置。
class ARRaycastQuery : NSObject 複製代碼

您能夠經過提供3D向量和起始位置來建立一個raycast查詢。 要使用2D屏幕位置和用戶向z方向投射的默認向量來建立一個raycast查詢,可使用ARView上的 makeRaycastQuery(from:allowing:alignment:)ARSCNView上的raycastQuery(from:allowing:alignment:)這兩個方便的函數。 光線投射能夠與平面(平面)或網格(不平整的表面)相交。若要與平面相交,請參見ARRaycastQuery.Target。若要與網格相交,請參見ARRaycastQuery.Target.estimatedPlane

3.14 ARTrackedRaycast

  • ARTrackedRaycast:ARKit會連續重複一個raycast查詢,從而隨着時間的推移提供更精確的結果。
class ARTrackedRaycast : NSObject 複製代碼

跟蹤射線投射經過連續地重複3D位置的查詢來改進命中測試技術。ARKit爲您提供了一個更新的位置,隨着時間的推移,它完善了它對世界的理解。 要啓動一個被跟蹤的raycast,你須要在你的應用程序的當前ARSession上調用trackedRaycast(_:updateHandler:)

3.15 ARRaycastResult

  • ARRaycastResult:經過檢查屏幕上的一個點發現的關於真實世界表面的信息。
class ARRaycastResult : NSObject 複製代碼

若是您使用ARViewARSCNView做爲您的渲染器,您能夠分別使用 raycast(from:allowing:alignment:)raycastQuery(from:allowing:alignment:)函數在屏幕上搜索真實世界的表面。 若是你使用自定義渲染器,你能夠找到現實世界的位置使用屏幕點: ARFrame的 raycastQuery(from:allowing:alignment:)函數。 ARSessionraycast(:)函數。 對於被跟蹤的光線投射,你在你的應用程序的當前ARSession上調用trackedRaycast(:updateHandler:)

3.16 ARAnchor

  • ARAnchor: 物理環境中某物的位置和方向。
class ARAnchor : NSObject 複製代碼

要跟蹤真實或虛擬對象相對於攝像機的靜態位置和方向,請建立錨對象並使用add(anchor:)方法將它們添加到AR會話中。

在會話中添加一個錨點能夠幫助ARKit優化該錨點周圍區域的世界跟蹤精度,從而使虛擬對象看起來與真實世界保持一致。若是虛擬對象移動,則從舊位置移除相應的錨,並在新位置添加一個錨。

一些ARKit特性會自動向會話添加特殊的錨。若是啓用了相應的功能,世界跟蹤會話能夠添加ARPlaneAnchorARObjectAnchorARImageAnchor對象;面部跟蹤會話添加ARFaceAnchor對象。

3.16.1 子類簡介

除了建立本身的ARAnchor實例來跟蹤虛擬內容的實際位置以外,還能夠子類化ARAnchor來將自定義數據與建立的錨關聯起來。確保你的錨類在ARKit更新幀或保存並加載ARWorldMap中的錨時行爲正確:

  • 錨子類必須知足ARAnchorCopying協議的要求。ARKit調用init(錨:)(在一個後臺線程上)來將錨類的實例從一個ARFrame複製到下一個ARFrame。此初始化器的實現應複製子類添加的任何自定義屬性的值。
  • 錨子類也必須採用NSSecureCoding協議。重寫encode(with:)和init(coder:)來保存和恢復您的子類自定義屬性的值,當ARKit將它們保存並加載到一個世界地圖中時。
  • 錨點根據其標識符屬性被認爲是相等的。
  • 當您保存世界地圖時,只有不採用可跟蹤的錨點(ARTrackable )纔會被包括在內。

3.16.2 ARTrackable

  • ARTrackable: 一個真實世界的對象,在一個場景中,ARKit跟蹤位置和方向的變化。
protocol ARTrackable 複製代碼

這個協議被ARKit類所採用,好比ARFaceAnchor類,它表示場景中移動的對象。

ARKit在一個活動的AR會話中自動管理這些對象的表示,確保真實世界中對象的位置和方向(錨的transform屬性)的變化反映在相應的ARKit對象中。isTracked屬性指示當前轉換對於實際對象的移動是否有效。

可跟蹤的錨類影響其餘ARKit行爲:

  • getCurrentWorldMap(completionHandler:)方法自動在其建立的ARWorldMap中只包含不可跟蹤的錨點。(建立世界地圖後,能夠選擇添加其餘錨點。)
  • ARSCNViewARSKView自動隱藏isTracked屬性爲false的錨節點。
  • World-tracking會話使用不可跟蹤的錨點來優化每一個錨點周圍區域的跟蹤質量。可跟蹤的錨不影響世界跟蹤。

3.17 AREnvironmentProbeAnchor

class AREnvironmentProbeAnchor : ARAnchor 複製代碼

環境紋理描述了場景中特定點的各個方向的視圖。在三維資產渲染中,環境紋理是基於圖像的照明算法的基礎,其中表面能夠真實地反射來自其周圍環境的光。ARKit能夠在AR會話期間使用攝像機圖像生成環境紋理,容許SceneKit或自定義渲染引擎爲AR體驗中的虛擬對象提供基於真實圖像的照明。 若要爲AR會話啓用紋理映射生成,請設置environmentTexturing屬性:

  1. ARWorldTrackingConfiguration.EnvironmentTexturing。手動環境紋理,你能夠經過建立 AREnvironmentProbeAnchor 對象並將它們添加到會話中來識別場景中你想要的光探測紋理映射點。
  2. ARWorldTrackingConfiguration.EnvironmentTexturing。自動環境紋理,ARKit自動建立,定位,並添加 AREnvironmentProbeAnchor 對象到會話。

在這兩種狀況下,ARKit在會話收集攝像機圖像時自動生成環境紋理。使用諸如session(_:didUpdate:)這樣的委託方法來找出一個紋理什麼時候可用,並從錨的environmentTexture屬性訪問它。 若是您使用ARSCNViewautomaticallyUpdatesLighting選項來顯示AR內容,SceneKit會自動檢索AREnvironmentProbeAnchor紋理映射並使用它們來照亮場景。

3.18 ARFaceAnchor

  • ARFaceAnchor: 關於姿態、拓撲結構和麪部表情的信息,ARKit在前置攝像頭中檢測到。
class ARFaceAnchor : ARAnchor 複製代碼

當會話在前置攝像頭提要中檢測到一個惟一的人臉時,它會自動將一個ARFaceAnchor:對象添加到它的錨點列表中。 當你使用ARFaceTrackingConfiguration跟蹤面時,ARKit能夠同時跟蹤多個面。

  • 跟蹤面部位置和方向

繼承的變換屬性在世界座標中描述人臉當前的位置和方向;也就是說,在與會話配置的worldAlignment屬性指定的座標空間中。使用這個變換矩陣來定位你想要「附加」到AR場景中的虛擬內容。 這個變換矩陣建立了一個面座標系統,用於定位相對於面而言的其餘元素。面座標空間單位以米爲單位,原點在面後居中,以下圖所示。

跟蹤面部位置和方向
座標系是右向的——正的x方向指向觀察者的右邊(也就是臉本身的左邊),正的y方向指向上(相對於臉自己,而不是世界),正的z方向指向外(指向觀察者)。

  • 使用面拓撲: 幾何屬性提供了一個ARFaceGeometry對象,該對象表示面部的詳細拓撲結構,該對象符合一個通用的面部模型,以匹配檢測到的面部的尺寸、形狀和當前表達式。 您可使用這個模型做爲基礎,根據用戶的面部形狀覆蓋內容—例如,應用虛擬化妝或紋身。你也可使用這個模型來建立遮擋幾何——一個不渲染任何可見內容的3D模型(容許攝像機圖像經過),可是它會阻礙攝像機在場景中看到其餘虛擬內容。

  • 跟蹤面部表情: blendShapes屬性提供了當前面部表情的高級模型,該模型經過一系列指定的係數進行描述,這些係數表示特定面部特徵相對於其中性配置的移動。您可使用混合形狀係數使2D或3D內容(如角色或阿凡達)具備動畫效果,並遵循用戶的面部表情。

3.19 ARFaceGeometry

  • ARFaceGeometry:描述人臉拓撲結構的三維網格,用於人臉跟蹤AR會話。
class ARFaceGeometry : NSObject 複製代碼

這個類以3D網格的形式爲面部的詳細拓撲提供了一個通用模型,適合用於各類呈現技術或導出3D資產。(使用SceneKit查看人臉幾何圖形的快速方法,請參見ARSCNFaceGeometry類。)

在人臉跟蹤AR會話中,當您從ARFaceAnchor對象獲取人臉幾何形狀時,該模型將與被檢測到的人臉的尺寸、形狀和當前表達式相匹配。您還可使用一個名爲blend形狀係數的字典來建立一個面部網格,它提供了面部當前表情的詳細但更有效的描述。

在AR會話中,您可使用這個模型做爲基礎,根據用戶的面部形狀覆蓋內容——例如,應用虛擬化妝或紋身。您還可使用這個模型來建立遮擋幾何圖形,它將其餘虛擬內容隱藏在攝像機圖像中檢測到的人臉的3D形狀以後。

  1. 面網格拓撲在ARFaceGeometry實例中是常量。也就是說,vertexCount、textureCoordinateCount和triangleCount屬性的值不會改變,triangleIndices緩衝區老是描述相同的頂點排列,而textureCoordinateCount緩衝區老是將相同的頂點索引映射到相同的紋理座標。
  2. 只有頂點緩衝了AR會話提供的面網格之間的變化,代表頂點位置的變化,由於ARKit使網格適應用戶的臉的形狀和表情。

3.20 ARImageAnchor

  • ARImageAnchor: 在世界跟蹤AR會話中檢測到的圖像的位置和方向的信息。
class ARImageAnchor : ARAnchor 複製代碼

當您運行一個world-tracking AR會話併爲會話配置的detectionImages屬性指定ARReferenceImage對象時,ARKit將在實際環境中搜索這些圖像。當會話識別一個圖像時,它會自動將每一個檢測到的圖像的 ARImageAnchor 添加到它的錨點列表中。 要查找場景中已識別圖像的範圍,可使用繼承的transform屬性和錨點的referenceImage的物理大小。

3.21 ARObjectAnchor

  • ARObjectAnchor:在世界跟蹤AR會話中檢測到的真實三維對象的位置和方向信息。
class ARObjectAnchor : ARAnchor 複製代碼

當您運行一個跟蹤世界的AR會話併爲會話配置的detectionObjects屬性指定ARReferenceObject對象時,ARKit將在實際環境中搜索這些對象。當會話識別一個對象時,它會自動將每一個檢測到的對象的ARObjectAnchor添加到它的錨點列表中。 要放置與被檢測對象的位置或大小匹配的虛擬3D內容,請使用錨點的繼承transform屬性以及錨點的referenceObject的中心和範圍。

var detectionObjects: Set<ARReferenceObject> { get set }
複製代碼

detectionObjects屬性說明:

  1. detectionObjects是一組用於ARKit嘗試在用戶環境中檢測的3D對象。
  2. 使用此屬性可爲ARKit選擇在用戶環境中找到的已知3D對象,並將其呈現爲ARObjectAnchor,以供在加強現實體驗中使用。 要建立用於檢測的引用對象,請在世界跟蹤會話中掃描它們,並使用ARWorldMap來提取ARReferenceObject實例。而後能夠將引用對象保存爲文件,並將它們打包到使用Xcode資產目錄建立的任何ARKit應用程序中。

3.22 ARParticipantAnchor

class ARParticipantAnchor : ARAnchor 複製代碼

當你將isCollaborationEnabled設置爲true時,ARKit會調用session(_:didAdd:),併爲它在物理環境中檢測到的每一個用戶提供一個ARParticipantAnchor,爲你提供他們的世界位置。

3.23 ARPlaneAnchor:

class ARPlaneAnchor : ARAnchor 複製代碼

當你在一個世界追蹤會話中啓用planeDetection時,ARKit會通知你的應用它經過設備的後攝像頭觀察到的全部表面。ARKit調用你的委派的session(_:didAdd:) ,爲每一個獨特的表面使用一個ARPlaneAnchor。每個平面錨都提供了關於表面的細節,好比它在現實世界中的位置和形狀。

session(_:didAdd:) 說明:

  1. 根據會話配置,ARKit能夠自動向會話添加錨。
  2. 若是你使用SceneKit或SpriteKit來顯示AR體驗,你能夠實現如下方法之一來代替跟蹤不只僅是向會話中添加錨點,還能夠跟蹤如何將SceneKit或SpriteKit內容添加到相應的場景中:ARSCNView: renderer(_:nodeFor:) or renderer(_:didAdd:for:) ARSKView: node(for:) or view(_:didAdd:for:)

3.24 ARPlaneGeometry

  • ARPlaneGeometry: 在世界跟蹤AR會話中描述被探測平面形狀的三維網格。
class ARPlaneGeometry : NSObject 複製代碼

在世界跟蹤AR會話中描述被探測平面形狀的三維網格。這個類提供了被檢測平面的大體形狀的估計,其形式是一個詳細的3D網格,適合與各類渲染技術一塊兒使用或用於導出3D資產。(使用SceneKit查看平面幾何圖形的快速方法,請參見ARSCNPlaneGeometry課程。)

ARPlaneAnchor中心和範圍屬性不一樣,後者僅對檢測到的平面的矩形區域進行估計,而平面錨的幾何屬性提供了對該平面覆蓋的二維區域的更詳細的估計。例如,若是ARKit檢測到一個圓形桌面,獲得的ARPlaneGeometry對象大體匹配表的通常形狀。隨着會話的繼續運行,ARKit提供了更新的平面錨點,其相關的幾何形狀改進了飛機的估計形狀。

您可使用此模型更精確地放置3D內容,這些內容應該只出如今檢測到的平面上。例如,確保虛擬對象不會從表的邊緣掉落。您還可使用這個模型來建立遮擋幾何圖形,它將攝像機圖像中檢測到的表面後面隱藏其餘虛擬內容。

平面幾何的形狀老是凸的。也就是說,平面幾何的邊界多邊形是一個最小的凸包,它包圍了ARKit識別或估計的全部點,這些點都是平面的一部分。

3.25 ARSkeleton

class ARSkeleton : NSObject 複製代碼

做爲關節的集合,本協議描述了ARKit能夠跟蹤的人體運動狀態。 ARSkeleton3D子類爲您提供了3D空間中被跟蹤的人體關節的位置,特別是它的jointLocalTransformsjointModelTransforms屬性。 ARSkeleton2D子類經過它的jointLandmarks屬性爲您提供了一個二維空間中被跟蹤物體關節的位置。

3.26 ARSkeletonDefinition

class ARSkeletonDefinition : NSObject 複製代碼

骨架定義創建了構成3D或2D身體骨架的關節之間的關係,其中關節鏈接到其餘關節,在父-子層次結構中構成單個骨架。使用parentIndices來標識給定框架定義的層次結構。 ARKit指定了對身體跟蹤相當重要的特定關節。能夠經過調用index(forJointName:)並傳入一個可用的聯名標識符來訪問指定的聯名。

3.27 ARBody2D

  • ARBody2D: 屏幕空間表示ARKit在攝像機提要中識別的人員。
class ARBody2D : NSObject 複製代碼

當ARKit在攝像頭提示中識別一我的時,它會估計身體關節的屏幕空間位置,並經過當前幀的detectedBody向您提供該位置。

3.28 ARBodyAnchor

  • ARBodyAnchor: 一個物體,它在三維空間中跟蹤一個物體的運動,ARKit能夠在攝像頭中識別它。
class ARBodyAnchor : ARAnchor 複製代碼

這個ARAnchor子類跟蹤單我的的移動。經過使用ARBodyTrackingConfiguration運行會話,您能夠啓用身體跟蹤。 當ARKit在後臺攝像頭feed中識別一我的時,它會用ARBodyAnchor調用你的委託的session(_:didAdd:)函數。身體錨點的變換位置定義了身體髖關節的世界位置。 你也能夠在框架的錨中檢查ARKit正在跟蹤的物體。

  • 把骨架放在表面上

由於身體錨點的原點映射到髖關節,因此您能夠計算腳到髖關節的當前偏移量,從而將身體的骨骼放置在一個表面上。經過將腳關節索引傳遞給jointModelTransforms,您能夠獲得腳與骨骼原點的偏移量。

static var hipToFootOffset: Float {
    // Get an index for a foot. 
    let footIndex = ARSkeletonDefinition.defaultBody3D.index(forJointName: .leftFoot)
    // Get the foot's world-space offset from the hip. 
    let footTransform = ARSkeletonDefinition.defaultBody3D.neutralBodySkeleton3D!.jointModelTransforms[footIndex]
    // Return the height by getting just the y-value. 
    let distanceFromHipOnY = abs(footTransform.columns.3.y) 
    return distanceFromHipOnY
}
複製代碼

3.29 ARCoachingOverlayView

  • ARCoachingOverlayView: 在會話初始化和恢復期間爲用戶提供指導的可視化指令的視圖。
class ARCoachingOverlayView : UIView 複製代碼

此視圖爲您的用戶提供了標準化的登陸例程。您能夠配置此視圖,使其在會話初始化期間和有限的跟蹤狀況下自動顯示,同時爲用戶提供特定的指令,以最方便地跟蹤ARKit的世界。 這些插圖顯示了具備水平和垂直平面目標的疊加視圖,代表用戶應該開始移動設備:

ARCoachingOverlayView 圖1

這些插圖顯示了疊加視圖,代表用戶應該繼續移動手機或改變移動速度:

ARCoachingOverlayView 圖2

當你啓動你的應用程序時,coaching overlay會要求用戶以幫助ARKit創建追蹤的方式移動設備。當你選擇一個特定的目標時,好比找到一架飛機,視圖會相應地調整它的指令。當coaching overlay肯定目標已經達到而且再也不須要coaching以後,它就會從用戶的視圖中隱藏起來。 有關使用coaching overlay的示例應用程序,請參見放置對象和處理3D交互

  • 支持自動輔導:

默認狀況下,activatesautomatic是啓用的,所以您應該覆蓋coachingOverlayViewWillActivate(_:)來肯定教練是否在進行中。協調您的操做以幫助用戶關注這些指令,例如,經過隱藏會話從新初始化時不須要的任何UI。

  • 在中斷後從新定位: 若是啓用了從新本地化(請參閱sessionShouldAttemptRelocalization(_:)),若是任何中斷下降了應用程序的跟蹤狀態,ARKit將嘗試恢復您的會話。在這種狀況下,coaching overlay會自動出現,並向用戶提供幫助ARKit進行從新定位的指令。

在中斷後從新定位1

在此期間,coaching overlay包含一個按鈕,讓用戶指示他們但願從新開始而不是恢復會話。

在中斷後從新定位2

ARKit經過調用你的委託的coachingOverlayViewDidRequestSessionReset(_:)函數在用戶按下Start時通知你。實現這個回調,若是你的應用程序須要任何自定義動做來從新啓動AR體驗。

func coachingOverlayViewDidRequestSessionReset(_ coachingOverlayView: ARCoachingOverlayView) {    

    // Reset the session.
    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = [.horizontal, .vertical]
    session.run(configuration, options: [.resetTracking])

    // Custom actions to restart the AR experience. 
    // ...
}
複製代碼

若是你沒有實現coachingOverlayViewDidRequestSessionReset(_:), coaching overlay會經過重置跟蹤來響應Start Over按鈕,這也會移除任何現有的錨點。 有關從新本地化的更多信息,請參見管理會話生命週期和跟蹤質量

3.30 ARSCNView

class ARSCNView : SCNView 複製代碼

ARSCNView類提供了建立加強現實體驗的最簡單方法,這種體驗將虛擬3D內容與真實世界的設備攝像頭視圖混合在一塊兒。當你運行視圖提供的ARSession對象:

  1. 該視圖自動未來自設備攝像機的實時視頻提要呈現爲場景背景。
  2. 視圖的SceneKit場景的世界座標系統直接響應由會話配置創建的AR世界座標系統。
  3. 視圖會自動移動它的SceneKit攝像頭,以匹配設備在真實世界中的移動。

由於ARKit會自動將SceneKit空間與現實世界相匹配,因此放置一個虛擬對象,使其看起來可以保持一個真實世界的位置,只須要適當地設置該對象的SceneKit位置。(參見使用SceneKit提供3D虛擬內容。)

您不必定須要使用ARAnchor類來跟蹤添加到場景中的對象的位置,可是經過實現ARSCNViewDelegate方法,您能夠將SceneKit內容添加到ARKit自動檢測到的任何錨中。

3.30.1 ARSCNView 類定義

3.30.2 ARSCNViewDelegate

  • ARSCNViewDelegate:代理方法您能夠實現將SpriteKit內容的自動同步與AR會話進行協調。 實現這個協議來提供與視圖的AR會話跟蹤的ARAnchor對象相對應的SpriteKit內容,或者管理視圖對這些內容的自動更新。 該協議擴展了ARSessionObserver協議,所以您的會話委託也能夠實現那些方法來響應會話狀態的更改。

  • 處理內容更新:

//要求委託提供一個與新添加的錨點相對應的SpriteKit節點。
func view(ARSKView, nodeFor: ARAnchor) -> SKNode?

//告訴代理,與一個新的AR錨相對應的SpriteKit節點已經被添加到場景中。
func view(ARSKView, didAdd: SKNode, for: ARAnchor)

//告訴代理,SpriteKit節點的屬性將被更新,以匹配其相應錨點的當前狀態。
func view(ARSKView, willUpdate: SKNode, for: ARAnchor)

//告訴代理,SpriteKit節點的屬性已經更新,以匹配其相應錨的當前狀態。
func view(ARSKView, didUpdate: SKNode, for: ARAnchor)

//告訴代理,與AR錨對應的SpriteKit節點已經從場景中移除。
func view(ARSKView, didRemove: SKNode, for: ARAnchor)

複製代碼

3.30.3 ARSCNView 屬性和方法

//用於管理視圖內容的運動跟蹤和攝像機圖像處理的AR會話。
var session: ARSession

//將在視圖中顯示的SceneKit場景。
var scene: SCNScene

複製代碼
  • 響應AR更新
//一個對象,你提供的中介同步視圖的AR場景信息與SceneKit內容。
var delegate: ARSCNViewDelegate?

//方法能夠實現將SceneKit內容的自動同步與AR會話進行協調。
protocol ARSCNViewDelegate 複製代碼
  • 發現真實的表面
在捕獲的攝像機圖像中搜索與SceneKit視圖中某個點對應的真實對象或AR錨點。
func hitTest(CGPoint, types: ARHitTestResult.ResultType) -> [ARHitTestResult]

//建立一個光線投射查詢,該查詢源於視圖上與攝像機視場中心對齊的一個點。
func raycastQuery(from: CGPoint, allowing: ARRaycastQuery.Target, alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery?

複製代碼
  • 將內容映射到實際位置
//返回與指定SceneKit節點關聯的AR錨點(若是有的話)。
func anchor(for: SCNNode) -> ARAnchor?

//返回與指定AR錨關聯的SceneKit節點(若是有的話)。
func node(for: ARAnchor) -> SCNNode?

//在ARKit檢測到的三維世界空間中,返回從2D視圖到平面上的點的投影。
func unprojectPoint(CGPoint, ontoPlane: simd_float4x4) -> simd_float3?

複製代碼
  • 管理光照
//一個布爾值,指定ARKit是否在視圖的場景中建立和更新SceneKit燈光。
var automaticallyUpdatesLighting: Bool

複製代碼
  • 調試基於「增大化現實」技術的展現
//在SceneKit視圖中繪製覆蓋內容以幫助調試AR跟蹤的選項
typealias ARSCNDebugOptions

複製代碼
  • 管理渲染效果
、、肯定視圖是否呈現運動模糊。
var rendersMotionBlur: Bool
//一個肯定SceneKit是否將圖像噪聲特徵應用於應用程序的虛擬內容的標誌。
var rendersCameraGrain: Bool

複製代碼

3.31 ARSKView

class ARSKView : SKView 複製代碼

使用ARSKView:類來建立加強現實體驗,將2D元素放置在3D空間中的設備攝像機視圖中。當你運行視圖提供的ARSession對象:

  1. 該視圖自動未來自設備攝像機的實時視頻提要呈現爲場景背景。
  2. 當您實現ARSKViewDelegate方法來將 SpriteKit內容與真實世界的位置相關聯時,視圖會自動縮放和旋轉那些 SpriteKit節點,以便它們看起來可以跟蹤攝像機看到的真實世界。

3.31.1 ARSKViewDelegate

  • ARSKViewDelegate: 提供方法您能夠實現將SpriteKit內容的自動同步與AR會話進行協調。
protocol ARSKViewDelegate 複製代碼
  1. 方法您能夠實現將SpriteKit內容的自動同步與AR會話進行協調。
  2. 實現這個協議來提供與視圖的AR會話跟蹤的ARAnchor對象相對應的SpriteKit內容,或者管理視圖對這些內容的自動更新。
  3. 該協議擴展了ARSessionObserver協議,所以您的會話委託也能夠實現那些方法來響應會話狀態的更改。
  • 處理內容更新的回調代理:
//要求委託提供一個與新添加的錨點相對應的SpriteKit節點。
func view(ARSKView, nodeFor: ARAnchor) -> SKNode?

//告訴委派,與一個新的AR錨相對應的SpriteKit節點已經被添加到場景中。
func view(ARSKView, didAdd: SKNode, for: ARAnchor)

//告訴委託,SpriteKit節點的屬性將被更新,以匹配其相應錨點的當前狀態。
func view(ARSKView, willUpdate: SKNode, for: ARAnchor)

//告訴委託,SpriteKit節點的屬性已經更新,以匹配其相應錨的當前狀態。
func view(ARSKView, didUpdate: SKNode, for: ARAnchor)

//告訴委託,與AR錨對應的SpriteKit節點已經從場景中移除。
func view(ARSKView, didRemove: SKNode, for: ARAnchor)

複製代碼

3.32 ARMatteGenerator

  • ARMatteGenerator:一個建立啞光紋理的對象,你能夠用它來遮擋你的應用程序的虛擬內容
class ARMatteGenerator : NSObject 複製代碼

當你想要徹底控制你的應用程序的虛擬內容時,使用這個類,基於ARKit在攝像頭feed中識別的人。

使用標準渲染器(ARViewARSCNView)的應用程序不須要這個類來影響人們的遮擋。有關更多信息,請參見frameSemantics

爲了幫助你的自定義渲染器與人遮擋,matte生成器處理alpha和深度信息在幀的分段緩衝和估計的深度數據,爲你提供matte和深度紋理。你使用這些紋理在你的應用程序的虛擬內容上分層

3.33 ARQuickLookPreviewItem

當您想要控制背景,指定共享表格共享的內容,或者在不容許用戶縮放特定模型的狀況下禁用縮放時,使用這個類。

3.34 ARFrame

  • ARFrame: 位置跟蹤信息做爲會話的一部分而捕獲的視頻圖像

當ARKit分析視頻幀以估計用戶在世界中的位置時,一個正在運行的會話不斷地從設備攝像頭捕獲視頻幀。 ARKit還以ARFrame的形式向您提供這些信息,並以您的應用程序的幀速率的頻率提供這些信息。

你的應用程序有兩種接收ARFrame的方式:

  1. 若是你的應用程序維護了本身的渲染循環,或者你須要在ARSCNViewDelegateARSKViewDelegate回調中獲取幀信息,那麼從ARSession中請求currentFrame
  2. 讓你的一個對象成爲ARSession的委託,當 ARKit捕獲新幀時自動接收它們。

3.34.1 ARFrame 類定義

3.34.2 ARFrame 屬性方法

  • 訪問捕獲的視頻幀
//包含攝像機捕獲的圖像的像素緩衝區。
var capturedImage: CVPixelBuffer

//幀被捕獲的時間。
var timestamp: TimeInterval

//深度圖(若是有的話)與視頻幀一塊兒捕獲。
var capturedDepthData: AVDepthData?

//幀(若是有)的深度數據被捕獲的時間。
var capturedDepthDataTimestamp: TimeInterval

複製代碼
  • 檢查世界地圖狀態
//爲該框架生成或從新定位世界地圖的可行性。
var worldMappingStatus: ARFrame.WorldMappingStatus

//可能的值,描述ARKit如何完全地映射給定幀中可見的區域。
enum ARFrame.WorldMappingStatus 複製代碼
  • 檢查現場參數
//有關用於捕獲幀的攝像機位置、方向和成像參數的信息。
var camera: ARCamera

//基於攝像機圖像的照明條件的估計。
var lightEstimate: ARLightEstimate?

//返回一個仿射變換,用於在規格化圖像座標和用於在屏幕上呈現攝像機圖像的座標空間之間進行轉換。
func displayTransform(for: UIInterfaceOrientation, viewportSize: CGSize) -> CGAffineTransform

複製代碼
  • 跟蹤和查找對象
//表示場景中被跟蹤的位置或檢測到的對象的錨點列表。
var anchors: [ARAnchor]

//在捕獲的攝像機圖像中搜索真實世界的對象或AR錨。
func hitTest(CGPoint, types: ARHitTestResult.ResultType) -> [ARHitTestResult]

複製代碼
  • 調試現場檢測
//目前,場景分析的中間結果ARKit用於執行世界跟蹤。
var rawFeaturePoints: ARPointCloud?

//AR會話的世界座標空間中的點的集合。
class ARPointCloud 複製代碼
  • 發現真實的表面
//獲取一個屏幕點的光線投射查詢。
func raycastQuery(from: CGPoint, allowing: ARRaycastQuery.Target, alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery

複製代碼
  • 2D追蹤人體
//ARKit在相機圖像中識別的身體的屏幕位置信息。
var detectedBody: ARBody2D?

//屏幕空間表示ARKit在攝像機提要中識別的人員。
class ARBody2D 複製代碼
  • detectedBody: ARBody2D類型, 用於ARKit在相機圖像中識別的身體的屏幕位置信息
var detectedBody: ARBody2D? { get }
複製代碼

要啓用2D體檢測,您能夠將體檢測幀語義添加到配置的frameSemantics屬性中,或者使用ARBodyTrackingConfiguration運行會話,在默認狀況下,體檢測是啓用的。

  • class ARBody2D : 屏幕空間表示ARKit在攝像機提要中識別的人員。

當ARKit在攝像頭提示中識別一我的時,它會估計身體關節的屏幕空間位置,並經過當前幀的detectedBody向您提供該位置。

  • 將虛擬內容與人隔離
//一個包含像素信息的緩衝區,該像素信息識別來自用於遮擋虛擬內容的攝像機提要的對象的形狀。
var segmentationBuffer: CVPixelBuffer?

//一個緩衝區,表示用於遮擋虛擬內容的攝像機提要的估計深度值。
var estimatedDepthData: CVPixelBuffer?

//一個像素的分類,它定義了你用來遮擋應用程序虛擬內容的內容類型。
enum ARFrame.SegmentationClass 複製代碼
  • segmentationBuffer : CVPixelBuffer類型,標識一個包含像素信息的緩衝區,該像素信息識別來自用於遮擋虛擬內容的攝像機提要的對象的形狀。

  • estimatedDepthData :CVPixelBuffer類型,深度數據緩衝區,表示用於遮擋虛擬內容的攝像機提要的估計深度值。

  • enum ARFrame.SegmentationClass :枚舉類型,它定義了你用來遮擋應用程序虛擬內容的內容類型

enum SegmentationClass : UInt8 複製代碼

ARKit根據它對攝像機提要像素數據的解釋應用這個類中定義的類別。只有人在攝像機提要中被識別,所以可用的像素分類是ARFrame.SegmentationClass.personARFrame.SegmentationClass.none

  1. ARFrame.SegmentationClass.person: 將分割緩衝區中的像素做爲人的一部分進行分類。
  2. ARFrame.SegmentationClass.none: 將分割緩衝區中的像素分類爲未識別的。
  • 開啓相機紋理
//一個值,用於指定相機紋理紋理中出現的紋理數量。
var cameraGrainIntensity: Float

//由ARKit建立的可平鋪的金屬紋理,以匹配當前視訊流的視覺特性。
var cameraGrainTexture: MTLTexture?

複製代碼
  • cameraGrainIntensity: 用於指定相機紋理紋理中出現的紋理數量。
var cameraGrainIntensity: Float { get }
複製代碼

此屬性在[0..1],其中0表示沒有糧食,1表示糧食的最大數量。 當您將此值應用於cameraGrainTexture的深度組件時,您將從存儲在金屬紋理中的各類視覺圖像噪聲數據中選擇概念上與此強度級別匹配的數據。

  • cameraGrainTexture: 由ARKit建立的可平鋪的金屬紋理,以匹配當前視訊流的視覺特性。
var cameraGrainTexture: MTLTexture? { get }
複製代碼

攝像頭紋理加強了用戶體驗的真實和加強方面的視覺凝聚力,使你的應用程序的虛擬內容具備相似的圖像噪聲特徵,這些特徵天然會出如今攝像頭feed中。

以下圖:

攝像頭紋理
若是ARSCNView是你的渲染器,SceneKit默認會將相機紋理應用到你的應用的虛擬內容中。有關更多信息,請參見 rendersCameraGrain

  • rendersCameraGrain: 一個肯定SceneKit是否將圖像噪聲特徵應用於應用程序的虛擬內容的標誌。rendersCameraGrain是ARSCNView的一個屬性。
var rendersCameraGrain: Bool { get set }
複製代碼

默認啓用。設置好後,SceneKit會在你的應用程序的虛擬內容中添加一個相機紋理效果,該效果與ARKit在相機反饋中觀察到的圖像噪聲特徵相匹配。

參考:

  1. 美團的這篇寫的很好:ARKit:加強現實技術在美團到餐業務的實踐
  2. juejin.im/post/5a308b…
相關文章
相關標籤/搜索