WWDC 2018: ARKit 2 的新功能

張嘉夫_Joseph發表於2018-06-15

本文是針對 Session 602: What's New in ARKit 2 的解讀

ARKit 2 讓我們用全新的方式與真實世界互動——多臺 iOS 裝置可以同時瀏覽同一個 AR 場景,或是玩多人 AR 遊戲。此外還增加了追蹤 2D 圖片和檢測已知 3D 物件(例如雕塑、玩具、傢俱等等)的能力。


Apple 在去年的 WWDC 上釋出了 iOS 11 與移動 AR 開發框架 ARKit,目前 ARKit 已經部署到了數億臺 iOS 裝置上,讓 iOS 成為了最大的、最先進的 AR 平臺。

WWDC 2018: ARKit 2 的新功能

ARKit 的介面簡單易用,但具備很多強大的功能,開發者也在過去的一年裡開發出了很多神奇的產品:

  • BBC 出品的 Civilisations AR 為你展示歷史上的藝術傑作,你可以從任意角度觀察它們,還可以檢視它們的詳細資料,甚至還可以把它們擺在自家院子裡。

WWDC 2018: ARKit 2 的新功能

  • Boulevard AR 用前所未有的直接的方式帶你欣賞英國國家肖像館裡的著名藝術品,可以把它們擺在地上或是掛在牆上,然後貼近檢視所有的細節,告訴我們藝術品背後的故事。

WWDC 2018: ARKit 2 的新功能

ARKit 也是一種非常有趣的教育方式:

  • WWF Free Rivers 可以在你的面前展現沉浸式的風景,跟隨一條在人和野生動植物的生活中穿流而過的河,瞭解人類家園對河流的依賴,以及通過建設水壩觀察人類活動是如何影響野生動植物的生活的,鼓勵大家保護環境、進行可持續性發展。

WWDC 2018: ARKit 2 的新功能

除了上面舉的幾個例子,App Store 裡還有很多很多神奇的 AR 作品。

ARKit 回顧

追蹤

WWDC 2018: ARKit 2 的新功能

追蹤是 ARKit 的核心功能,可以獲得裝置在物理世界中的方向和位置,此外還可以追蹤物體(例如人臉)。

場景理解

WWDC 2018: ARKit 2 的新功能

場景理解通過學習環境的一些屬性來優化追蹤,檢測水平面(例如地面和桌面)和垂直面以便在場景中放置物體。場景理解還會學習環境中的光照情況,以便在虛擬場景中精確模擬真實的光照,以防物體看起來過亮或過暗。

渲染

WWDC 2018: ARKit 2 的新功能

渲染就是指使用者在裝置上實際看到、並且在 AR 場景中互動的內容。ARKit 可以很方便的與你喜歡的渲染引擎進行整合,還為 SceneKit 和 SpriteKit 提供了內建檢視。此外 Xcode 還提供了可以快速上手的 Metal 模板。

WWDC 2018: ARKit 2 的新功能

此外還為 Unity 和 Unreal 的公開遊戲引擎整合了完整的 ARKit 功能。

所以如果要開始製作 ARKit 專案,以上游戲引擎都可供選擇。

ARKit 2 的新功能

  • 載入和儲存地圖,提供了全新的持久化及多人體驗
  • 環境紋理,可以更真實地渲染 AR 場景
  • 影象追蹤,實時追蹤 2D 圖片
  • 物體檢測,檢測場景中的 3D 物體
  • 面部追蹤提升

載入和儲存地圖

載入和儲存地圖是世界追蹤的一部分,世界追蹤可以給出真實世界中裝置的位置和角度(6自由度),以便在場景中放置物體,如下圖中的桌子椅子所示。

WWDC 2018: ARKit 2 的新功能

世界追蹤還可以給出精確的物理尺度,以便以正確的尺寸放置物體,以防過大或過小。物理尺寸還可以用於精確測量,例如 iOS 12 中提供的 Measure app。

世界追蹤還會給出 3D 特徵點,可以瞭解環境中的一些物理結構,以便執行命中測試(hit testing),從而在場景中放置物體。

iOS 11.3 釋出了重新定位(Relocalization)功能,即使 ARSession 被打斷了(例如 app 進入後臺或使用 iPad 上的畫中畫功能),也可以隨後恢復之前的追蹤狀態。

ARWorldMap

WWDC 2018: ARKit 2 的新功能

重新定位功能的實現依賴於一張被世界追蹤不斷繪製的地圖,隨著使用者在環境中不斷移動,這張地圖也會學習更多環境特徵並不斷延展,現在這張地圖在 ARKit API 中以 ARWorldMap 物件提供給開發者使用了。

WWDC 2018: ARKit 2 的新功能

ARWorldMap 對映了物理 3D 空間,如上圖所示。

同時,物理空間中的錨點(anchor)也很重要,以便在相應的位置放置虛擬物體,所以 ARWorldMap 中預設包含所有平面錨點,此外開發者還可以在場景中新增自定義錨點,WorldMap 中的錨點列表也會儲存這些自定義錨點。

為了便於視覺化和 debug,ARWorldMap 還會提供原始特徵點以及範圍(extent),以便理解使用者掃描的物體空間結構。

最關鍵的一點是,ARWorldMap 是一個可序列化(serialization)物件,可以被序列化為任意你想要的資料格式,作為本地磁碟上一個檔案或分享到雲端。

所以,ARWorldMap 為我們帶來了 ARKit 的兩種全新體驗:

持久化

舉個例子,一個使用者開啟了世界追蹤,然後通過 ARKit 命中測試在場景中放了一個物體。

WWDC 2018: ARKit 2 的新功能

在使用者離開之前,他在裝置上儲存了這張 WorldMap。

一段時間之後,這個使用者又回到了這裡,此時他可以載入之前的那張 WorldMap,並獲得與之前完全相同的擴增實境體驗。

WWDC 2018: ARKit 2 的新功能

他還可以不斷重複這個過程,並且以後每次來到這個桌子的時候都能看到他之前擺放的這些物體。

WWDC 2018: ARKit 2 的新功能

以上就是世界追蹤中的持久化體驗。

多人體驗

ARWorldMap 還為我們帶來了多人體驗,現在 AR 體驗可以與其他使用者共享,而不再只侷限於單裝置或單使用者。使用者可以生成地圖,並將其共享給其他使用者。

WWDC 2018: ARKit 2 的新功能

WorldMap 代表了現實世界中的座標系,所以使用者會共享同一個座標系,並且從不同的視角體驗同一個 AR 場景,就像 WWDC 上演示的那個多人遊戲一樣,此外 WorldMap 還可以用於建立多人共享的教育體驗。

由於 ARWorldMap 是開放給開發者的,所以我們可以用任意技術手段來共享它,例如使用支援多人連線的隔空投送(依賴本地藍芽或 WiFi),所以即使沒有網路也可以實現。

獲取和載入 WorldMap 的 API 非常簡單:

WWDC 2018: ARKit 2 的新功能

在任何時間點都可以從 ARSession 物件上獲取當前的 WorldMap,並在 completion handler 裡返回該 ARWorldMap 物件,如果無法獲取 WorldMap 則會返回 error。

取得 WorldMap 之後,只要在初始化 ARWorldTrackingConfiguration 時給 initialWorldMap 屬性賦值並執行即可,或者通過配置 ARSession 的 configuration 並執行即可實現動態改變。

WWDC 2018: ARKit 2 的新功能

ARSession 攜帶 ARWorldMap 啟動之後,會執行 iOS 11.3 引入的重新定位功能。

獲得良好的 World Map

要讓重新定位功能可靠執行,就需要獲取良好的 WorldMap。首先,要從多個視角掃描物理空間,便於追蹤系統學習環境中的物理結構。同時,環境需要是靜態的,並且具有良好的紋理,以便學習更多環境特徵。其次,地圖需要密集的特徵點,這樣才能可靠地進行重新定位。

不過不用擔心,ARKit API 簡化了這一步,ARFrame 上新增了 worldMappingStatus 屬性:

WWDC 2018: ARKit 2 的新功能

每個 ARFrame 都會更新 worldMappingStatus 屬性,使用方法如下:

剛啟動世界追蹤時,WorldMappingStatus 處於 Not Avaiable 狀態,開始掃描物理空間後,狀態就會變為 Limited:

WWDC 2018: ARKit 2 的新功能

隨著在物理世界中的移動,世界追蹤會持續延展 World Map(Extending)。

WWDC 2018: ARKit 2 的新功能

如果對物理世界的掃描充足,WorldMappingStatus 會變成 Mapped:

WWDC 2018: ARKit 2 的新功能

但如果走出了 map 所對應的物理空間,WorldMappingStatus 就會再次回到 Limited,並繼續學習新看到的環境:

WWDC 2018: ARKit 2 的新功能

所以應該如何在應用裡使用 WorldMappingStatus 呢?假設我們正在開發一個 app,使用者可以與其他人分享他的 World Map,介面下方有一個 “Share Map” 按鈕:

WWDC 2018: ARKit 2 的新功能

WorldMappingStatus 處於 Not Available 或 Limited 狀態時,應該禁用這個按鈕。

WWDC 2018: ARKit 2 的新功能

狀態進入 extending 後,則需要在介面上顯示一個 Activity Indicator:

WWDC 2018: ARKit 2 的新功能

這樣會鼓勵使用者在物理世界中繼續移動,持續掃描並擴充套件 map 以便用於進行重新定位。WorldMappingStatus 變成 mapped 之後,就可以啟用 Share Map 按鈕並隱藏 Activity Indicator 了,以便讓使用者分享地圖:

WWDC 2018: ARKit 2 的新功能

Demo

下面是儲存和載入地圖的 Demo,這個 Demo 由兩個 app 組成,一個用於獲取地圖並儲存為本地檔案,另一個則會載入之前那張地圖並恢復為與之前完全相同的 AR 體驗:

WWDC 2018: ARKit 2 的新功能

剛開啟 app 時,可以看到右上角的 WorldMappingStatus 為 Not Available:

WWDC 2018: ARKit 2 的新功能

然後在環境裡來回移動,狀態就會變為 Extending:

WWDC 2018: ARKit 2 的新功能

然後繼續在環境中移動,WorldMappingStatus 就會變成 Mapped:

WWDC 2018: ARKit 2 的新功能

也就是說目前特徵點已經足夠重新定位使用了,所以此時已經可以獲取並儲存 World Map 了,但為了讓 AR 體驗更有趣一點,我打算通過命中測試來放置一個自定義錨點(一臺老電視):

WWDC 2018: ARKit 2 的新功能

點選儲存 World Map(當然我也可以繼續構建地圖),World Map 儲存後 app 顯示出了它包含的所有特徵點:

WWDC 2018: ARKit 2 的新功能

上面這些小藍點都是 World Map 的一部分,並且該 World Map 已經序列化為檔案了,現在可以在另一個 app 中恢復剛剛的 AR 體驗。我移動到了與剛剛不同的位置,螢幕上顯示出了我目前的世界原點:

WWDC 2018: ARKit 2 的新功能

目前世界追蹤正處於重新定位狀態,也就是 iOS 11.3 引入的重新定位功能。現在把裝置指向剛剛建立 World Map 的物理位置,就在我指向剛剛那的點的瞬間,世界原點恢復到了之前那個位置,同時也恢復了我的自定義錨點,這樣我就擁有了與之前一模一樣的 AR 體驗:

WWDC 2018: ARKit 2 的新功能

後面我可以無數次重啟這個 app,每一次都會展示與之前完全相同的體驗。World Map 當然也可以分享給其他裝置,這就是持久化功能。

以上就是儲存和載入地圖功能的介紹,為 ARKit 帶來了持久化和多人體驗。除了儲存和載入地圖,世界追蹤還在以下方面進行了提升:

  • 更快速的初始化和平面檢測
  • 更健壯的追蹤系統,可以在更復雜的環境中檢測平面
  • 水平面和垂直面都具備了更精確的範圍和邊界,以便更精準地放置物體
  • 持續對焦(iOS 11.3 引入)

除了上面這幾項,iOS 還有很多其他專為 AR 體驗而進行的優化,例如:

  • 4:3 視訊格式,這是一種廣角視訊格式,可以極大地提升 iPad 上的視覺體驗,因為 iPad 的螢幕顯示比例就是 4:3,同時 4:3 的視訊格式也會成為 ARKit 2 的預設格式。

除了 4:3 視訊格式以外的所有優化都會應用到 App Store 目前的 app 上,如果想使用 4:3 視訊格式,則需要用新的 SDK 重新構建 app。

環境紋理

為了提升使用者體驗,我們推出了用於渲染的環境紋理,可以極大地提升使用者體驗。

真實的渲染

假設設計師非常努力地建立了這樣一個虛擬物體,準備用在 AR 場景裡:

WWDC 2018: ARKit 2 的新功能

首先,我們需要做下面這些事情:

  • 在正確的位置用正確的角度擺放,就像在真實世界裡那樣
  • 使用正確的尺寸,看起來既不會太大又不會太小,ARKit 中的世界追蹤會提供正確的 transform
  • 使用環境中的真實光照,ARKit 會提供環境光估計(ambient light estimate)用於調整虛擬物體的亮度,這樣看起來既不會太亮又不會太暗,和環境融為一體
  • 如果把物體擺放在物體表面(例如水平面)上,還需要加上陰影,這樣可以極大提升人類的視覺感知,看起來好像真的在表面上一樣
  • 最後,如果是會反光的物體,人們希望能夠從虛擬物體的表面上看到周圍環境的反射,這就是環境紋理髮揮作用的地方。

這是上面那個虛擬物體在擴增實境場景中的顯示效果:

WWDC 2018: ARKit 2 的新功能

可以看到,尺寸恰當,但更重要的是,在物體表面可以看到周圍環境的反射,右面可以看到黃色的香蕉和橙子的反射,左面則可以看到綠葉的反射,中間還能看到板凳表面的反射,這些就是 ARKit 2 的環境紋理的強大功能。

WWDC 2018: ARKit 2 的新功能

環境紋理功能會獲取場景的紋理資訊,通常情況下用 cube map 來表示,但有時候也會用其他格式表示,這個 cube map 還可以用作渲染引擎的 reflection probe,把紋理資訊應用到虛擬物體上,就像上面那盆水果一樣,極大地提升了可反光的物體的視覺效果。

WWDC 2018: ARKit 2 的新功能

ARKit 在執行時通過世界追蹤和場景理解持續學習環境中的資訊:

WWDC 2018: ARKit 2 的新功能

通過計算機視覺提取紋理資訊並填充 cube map,並將 cube map 精確地放置在場景中。注意,上面的 cube map 只被填充了一部分,但要將其設定為 reflection probe 的話,則需要被完全填充。要得到一個完全填充的 cube map,需要徹底掃描身邊的物體空間,例如 360 度轉一圈,就像做一張全景圖一樣。但這樣對於使用者來說太難了,所以 ARKit 會藉助先進的機器學習演算法來自動填充 cube map,讓這一切變得相當容易:

WWDC 2018: ARKit 2 的新功能

補充一句,以上這些計算都是在本地實時進行的。

有了 cube map 後就可以將其設定為 reflection probe,然後把虛擬物體放進場景,它們就會開始反射環境了:

WWDC 2018: ARKit 2 的新功能

以上就是對環境紋理功能的工作原理的簡單介紹,藉助 ARKit API,使用起來也非常簡單,只要在 ARWorldTrackingConfiguration 裡將 environmentTexturing 屬性設定為 automatic 然後執行:

WWDC 2018: ARKit 2 的新功能

就這麼簡單!

然後 ARSession 會在後臺自動處理環境紋理,並將環境紋理提供為 environment probe anchor。

AREnvironmentProbeAnchor

WWDC 2018: ARKit 2 的新功能

AREnvironmentProbeAnchor 是 ARAnchor 的 extension,意味著它有 6 自由度的位置與角度 transform。此外,它還有一個 MTLTexure 格式的 cube map:

WWDC 2018: ARKit 2 的新功能

ARKit 還提供了 cube map 的物理範圍,也就是 reflection probe 的影響範圍,渲染引擎會藉助它來糾正視差,比如物體在場景中移動時會自動適應新的位置,並反射環境中新的紋理。

AREnvironmentProbeAnchor 的生命週期和其它 anchor 相同,例如 ARPlaneAnchor 和 ARImageAnchor。

此外,AREnvironmentProbeAnchor 還被完全整合進了 ARSCNView,如果你的渲染引擎是 SceneKit,那就只要在 WorldTrackingConfiguration 裡啟用這個功能就好了,其餘的工作 ARSCNView 會自動搞定。

對於更復雜的使用場景,可能需要在場景裡手動放置 AREnvironmentProbeAnchor,這時需要把 environmentTexturing 屬性設定為 manual:

WWDC 2018: ARKit 2 的新功能

然後可以按照理想的位置和角度將 AREnvironmentProbeAnchor 新增到 ARSession 物件中,ARSession 獲得更多有關環境的資訊時會更新其紋理。

Demo

下面這個小 Demo 展示了環境紋理是如何真實地渲染 AR 場景的。放上之前那個模型,先來看一下未啟用環境紋理的情況:

WWDC 2018: ARKit 2 的新功能

可以在底部的開關上看到目前採用的是環境光估算,看起來還可以,擺在桌上,有自然的陰影,但缺少的就是對木頭桌子的反射。如果在旁邊再放點東西:

WWDC 2018: ARKit 2 的新功能

虛擬物體並沒有反射出這個水果。下面啟用環境紋理功能:

WWDC 2018: ARKit 2 的新功能

可以看到,啟動環境紋理功能後物體立刻開始反射木頭桌子和香蕉的紋理,極大地提升了 AR 場景的效果,看起來非常理想,就像真的在桌上一樣。

以上就是 ARKit 2 強大的環境紋理功能,讓 AR 場景變得異常真實。

影象追蹤

WWDC 2018: ARKit 2 的新功能

iOS 11.3 引入了影象檢測功能,作為世界追蹤的一部分。影象檢測會搜尋場景中指定的 2D 影象,但這些影象必須是靜止的、不能被移動,例如電影海報或博物館裡的畫作。

ARKit 會估算被檢測到的影象的位置和角度(6自由度),可以用來觸發渲染場景中的內容。由於影象追蹤是被完全整合在世界追蹤裡的,所以只要設定一個屬性就可以用了。

為了載入用於影象檢測的圖片,可以從檔案中載入,也可以使用 Xcode 的 asset catalog,asset catalog 可以提供影象的檢測質量。

影象檢測是一個很棒的功能,但在 iOS 12 裡會因為影象追蹤功能的加入變得更加出色。

影象追蹤是對影象檢測功能的一個補充,最大的好處就是影象不再需要是靜止的,可以移動:

WWDC 2018: ARKit 2 的新功能

ARKit 現在會以每秒 60 幀的速率估算每一幀的位置和方向,可以實際增強 2D 影象,例如雜誌、桌遊等等具有真實圖片的東西。

ARKit 還可以同時追蹤多個影象:

WWDC 2018: ARKit 2 的新功能

預設情況下只追蹤一張影象,例如雜誌封面。但如果是雜誌的內頁,則可以設定為同時追蹤兩張影象。

此外,iOS 12 和 ARKit 2 還帶來了全新的 ARImageTrackingConfiguration,可以用來單獨進行影象追蹤,設定方法如下。

首先從檔案或 asset catalog 中載入一組 Reference Image:

WWDC 2018: ARKit 2 的新功能

然後把這些 Reference Image 設定為 ARWorldTrackingConfiguration 的 detectionImages 屬性:

WWDC 2018: ARKit 2 的新功能

或者設定為 ARImageTrackingConfiguration 的 trackingImages 屬性:

WWDC 2018: ARKit 2 的新功能

然後用剛剛設定好的 configuration 來執行 session:

WWDC 2018: ARKit 2 的新功能

然後和之前一樣,在 ARSession 執行時,每次更新都會提供 ARFrame:

WWDC 2018: ARKit 2 的新功能

如果圖片被檢測到了,ARFrame 則會包含 ARImageAnchor 物件:

WWDC 2018: ARKit 2 的新功能

ARImageAnchor 是一個可被追蹤的物件,因為它符合 ARTrackable 協議,所以有一個布林型的 isTracked 屬性,指出當前影象的追蹤狀態,true 表示正在被追蹤:

WWDC 2018: ARKit 2 的新功能

還有一個屬性指向當前被檢測到的影象,同時用一個 4x4 矩陣來表示位置和角度。

使用良好的影象

獲取 Image Anchor 的第一步就是載入影象,那麼應該選擇怎樣的影象呢?

這是一張來自兒童讀物的影象:

WWDC 2018: ARKit 2 的新功能

這張影象對於圖片追蹤來說非常理想,有清晰的特徵、良好的紋理、鮮明的對比。

下面這張圖片同樣來自於兒童讀物,但並不建議使用:

WWDC 2018: ARKit 2 的新功能

它有多個重複性結構、均勻的色域、狹窄的灰度直方圖。但我們不需要自己辨別這些圖片是否存在問題,Xcode 會幫助我們:

WWDC 2018: ARKit 2 的新功能

如果我把上面的圖片匯入 Xcode,會發現左側那張圖片沒有警告,也就是說它是被建議使用的。然而右面那張 three kids reading 則出現了警告圖示,說明不建議使用它,如果點選該圖示,可以看到不建議用於影象追蹤的詳細原因:

WWDC 2018: ARKit 2 的新功能

可以看到原因和直方圖、色域以及重複結構有關。

配置影象追蹤

圖片載入完之後,有兩種方式配置影象追蹤,第一種是使用 ARWorldTrackingConfiguration。

WWDC 2018: ARKit 2 的新功能

如果使用世界追蹤中的影象追蹤功能,image anchor 會以世界座標系進行表示,也就是說 image anchor、plane anchor 以及世界原點都會處於同一座標系中,它們之間的互動也會變得簡單、直接。

第二種則是使用全新推出的 ARImageTrackingConfiguration,用於單獨執行影象追蹤。

WWDC 2018: ARKit 2 的新功能

也就是說 ARImageTrackingConfiguration 會從世界追蹤中獨立出來,不用依賴運動感測器也可以進行追蹤,識別影象前也不需要初始化,此外還可以用在無法使用世界追蹤的場景下,例如電梯或火車等正在移動的場所。

在這種配置下,ARSession 會以 60 幀一秒的速度估算位置和角度,實現起來也非常簡單:

WWDC 2018: ARKit 2 的新功能

首先建立一個 ARImageTrackingConfiguration 型別的 configuration,然後指定需要追蹤的影象陣列,接下來還可以指定希望追蹤的圖片數量。(需要注意的是,上面設定了三張需要追蹤的影象,但將同時追蹤的影象上限設定為了 2,所以如果已經追蹤到了前兩張影象,此時第三張影象進入畫面的話,仍然能夠收到 detection 的更新,但不會追蹤第三張影象)。最後,用 configuration 執行 session。

如前文所述,還可以通過 World Tracking 實現影象追蹤,只要替換圖中高亮的兩行程式碼即可:

WWDC 2018: ARKit 2 的新功能

影象檢測和影象追蹤之間的唯一區別就在於 maximumNumberOfTrackedImages,所以如果你的 app 正在使用影象檢測功能,只要加上這一行,重新編譯,就可以使用全新的追蹤功能了。

Demo

這個 demo 是一個 AR 相框 app,首先用 Xcode 生成一個 AR app 的模板:

WWDC 2018: ARKit 2 的新功能

接下來需要指定待檢測的影象,一隻叫 daisy 的貓咪:

WWDC 2018: ARKit 2 的新功能

WWDC 2018: ARKit 2 的新功能

在屬性皮膚將此圖片命名為 daisy,同時指定該影象檔案在真實世界的尺寸,也就是相框的尺寸。此外還在 Xcode 中載入了一段 daisy 的視訊:

WWDC 2018: ARKit 2 的新功能

下面,先建立一個 ARImageTrackingConfiguration 型別的 configuration:

WWDC 2018: ARKit 2 的新功能

並且使用 group name “Photos” 從 asset catalog 中載入了影象陣列,陣列中只有一張影象 “daisy”,然後將其設定為 configuration 的 trackingImages 屬性,接下來把 maximumNumberOfTrackingImages 屬性設定為 1。

如果此時執行這個 app,ARSession 已經可以在圖片被檢測到時提供 ARImageAnchor 了,但還需要再增加點內容——建立一個 AVPlayer 來載入 Resource Bundle 中視訊:

WWDC 2018: ARKit 2 的新功能

下面把它覆蓋到現實中的圖片上:

WWDC 2018: ARKit 2 的新功能

首先檢測 imageAnchor 的型別是否是 ARImageAnchor,然後使用與被檢測到的影象相同的物理尺寸建立一個平面,然後把 videoPlayer 設定為平面的紋理,並讓視訊開始播放。接下來用平面幾何體來建立 SCNNode,並旋轉使其與 anchor 的座標系相匹配。

就是這樣,執行!

WWDC 2018: ARKit 2 的新功能

可以看到,就在我把貓咪相框放進螢幕的瞬間視訊就開始播放了,貓咪在裡面動來動去。由於 ARKit 會實時估算位置,所以可以任意移動裝置,每一幀都會相應更新。

以上就是對 ARKit 中影象追蹤功能的介紹,使用起來非常簡單。

物體檢測

影象追蹤適用於 2D 影象,但 ARKit 不只侷限於此,物體檢測功能可以用於檢測場景中給定的 3D 物體。

WWDC 2018: ARKit 2 的新功能

和影象檢測一樣,物體檢測只適用於無法移動的靜態物體,例如博物館裡的展品、某些指定的玩具或是家庭物品等等。

此外,與影象檢測不同的是,物體檢測需要先用執行 ARKit 的 iOS app 掃描該物體。幸運的是,Apple 為我們提供了完全開源的、功能齊全的 iOS app 用於掃描自己的 3D 物體,這些物體需要有一些特徵,例如擁有良好的紋理、硬性並且不會反光。

ARKit 可以估算這些物體的位置和角度(6自由度)。

同時,物體追蹤功能被完全整合進了世界追蹤功能中,所以只要設定一個屬性,就可以開始進行物體追蹤了。設定方法如下:

WWDC 2018: ARKit 2 的新功能

從檔案或 Asset Catalog 中載入 ARReferenceObject 陣列,然後將其設定為 ARWorldTrackingConfiguration 的 detectionObjects 屬性:

WWDC 2018: ARKit 2 的新功能

configuration 設定完成之後,執行 session:

WWDC 2018: ARKit 2 的新功能

和影象檢測一樣,每次更新都會獲得 ARFrame:

WWDC 2018: ARKit 2 的新功能

如果檢測到了場景中的物體,ARFrame 就會包含 ARObjectAnchor:

WWDC 2018: ARKit 2 的新功能

ARObjectAnchor 是 ARAnchor 的一個簡單子集:

WWDC 2018: ARKit 2 的新功能

transform 表示 6 自由度的位置和角度,同時還會通過 referenceObject 指出被檢測到的物體。

只要三行程式碼就可以實現:

WWDC 2018: ARKit 2 的新功能

首先建立一個 ARWorldTrackingConfiguration 型別的 configuration,然後指定想要檢測的物體陣列(古代半身雕像以及陶罐),最後用它來執行 session。

上面的程式碼最終構成了一個簡單的 AR 博物館 app:

WWDC 2018: ARKit 2 的新功能

這個半身雕像進入 iOS 的檢視中後,可以得到 6 自由度的 pose,利用它在雕像頭頂浮現一個非常簡單的資訊圖形,包括這位埃及女王的姓名(Nefertiti)以及她的出生日期,當然還可以新增任意渲染引擎支援的內容。

物體掃描

WWDC 2018: ARKit 2 的新功能

為了構建這個 app,我需要先掃描這個物體。物體掃描會收集場景中的資訊,和平面檢測類似,通過收集場景中的資訊來估算水平面或垂直面的位置,這裡則是獲取有關 3D 物件的資訊。

為了指定物體檢測的區域,會生成 transform、extent 和 center,這樣可以在物體周圍形成一個立體邊框,定義了它在場景中的位置。

Xcode asset catalog 完美支援提取出的物件,便於匯出到其它 app 並進行復用。

Apple 還針對掃描功能推出了全新的 ARObjectScanningConfiguration,但我們並不需要自己寫掃描 app,因為 Apple 開源了一個功能齊全的掃描 app,叫做 Scanning and detecting 3D objects。下面是這個 app 的工作方式:

WWDC 2018: ARKit 2 的新功能

現在我們要為上面的 Nefertiti 雕像建立立體邊框,外邊框並不需要很精確,因為真正重要的是邊框內部那些特徵點。

對外邊框感到滿意之後,就可以點選 Scan 按鈕開始掃描物體了,可以看到進度在不斷增加,表示物體被掃描的程度:

WWDC 2018: ARKit 2 的新功能

WWDC 2018: ARKit 2 的新功能

需要注意的是,並不一定要把物體的每一面都掃描下來,例如博物館裡的某些靠著牆壁的雕塑,無法從背後進行掃描,那一面就可以不掃。

對掃描感到滿意之後,可以調整 extent 的 center(與物體的原點相對應),唯一的要求就是 center 要留在 extent 內部。

最後,掃描 app 還可以執行檢測測試:

WWDC 2018: ARKit 2 的新功能

上圖中的檢測測試在多個視角下都通過了,說明掃描很成功。我還建議把物體移動到其它位置進行檢測測試,看看在不同的材質和光照情況下能否成功:

WWDC 2018: ARKit 2 的新功能

掃描完成後會獲得一個 ARReferenceObject 型別的物件(在之前的圖表裡提到過):

WWDC 2018: ARKit 2 的新功能

這個物件可以被序列化為檔案,字尾名一般是 .arobject,name、center 和 extent 屬性可以在 asset catalog 裡檢視。此外還可以得到之前掃描區域的所有原始特徵點。

以上就對物體檢測功能的介紹,記住在檢測之前要先掃描一遍物體,掃描 app 所有的原始碼都是開源的,現在就可以下載

面部追蹤

去年釋出 iPhone X 的同時,ARKit 也推出了健壯的面部識別和追蹤功能,每一幀都會估算面部的角度和位置(速度為每秒60幀),得到的 pose 可以用於增強使用者面部,例如增加面具、帽子甚至是替換臉部材質。ARKit 還會以 ARFaceGeometry 格式提供面部三角網格:

WWDC 2018: ARKit 2 的新功能

面部追蹤的主要錨點型別是 ARFaceAnchor,包含了面部追蹤所需的所有資訊。為了更真實地渲染,ARKit 還會提供方向性光線估算,將面部用作光線探測器(light probe),估算光線強度、方向以及色溫:

WWDC 2018: ARKit 2 的新功能

光線估算對於大部分 app 來說非常夠用了,但對於有更復雜業務需求的 app,ARKit 會收集整個場景的光線情況並提供球面諧波係數(spherical harmonics coefficient),可以進一步提升視覺效果。

blendshapes

WWDC 2018: ARKit 2 的新功能

ARKit 還可以實時追蹤表情,支援超過 50 種特定的 blendshape (面部特徵點),blenshape 會假設一個介於 0 和 1 之間的值來表示對應面部特徵點的活躍程度,1 表示極度活躍,0 表示不活躍。例如張開嘴時 jawOpen 係數會接近 1,閉嘴時則接近 0。blendshapes 對於創造虛擬角色動畫來說非常有用,例如結合使用 jawOpen、eyeBlinkLeft 和 eyeBlinkRight 係數就可以讓下面這個小方盒角色動起來:

WWDC 2018: ARKit 2 的新功能

但還可以更進一步:

WWDC 2018: ARKit 2 的新功能

建立 Animoji 的時候會使用很多其它 blendshapes,通過右邊的藍色柱狀圖獲得頭部 pose,然後對映到那隻熊貓上,ARKit 為你提供了建立虛擬卡通角色動畫所需的一切資訊,和 Animoji 一樣。

面部追蹤的新功能

ARKit 2 增加了凝視追蹤(gaze tracking)功能,會以 6 自由度追蹤左右眼球:

WWDC 2018: ARKit 2 的新功能

兩個 6 自由度的 transform 是 ARFaceAnchor 的屬性,還有一個屬性叫做 lookAtPoint,估算了兩個眼球的凝視方向在面部座標空間中的交匯點:

WWDC 2018: ARKit 2 的新功能

可以用這些資訊給虛擬角色生成動畫,或者作為 app 資訊輸入的全新互動方式。

此外 ARKit 2 還支援了舌頭檢測:

WWDC 2018: ARKit 2 的新功能

舌頭是一種全新的 blendshape,1 表示舌頭伸出,0 表示沒有伸出:

WWDC 2018: ARKit 2 的新功能

tongueOut 係數可以用在虛擬角色的動畫中,當然,也可以用作 app 的互動方式(笑

總結

強大的儲存和載入地圖功能可以讓我們獲得持久化體驗以及多人體驗,世界追蹤功能的提升可以讓平面檢測變得更快、更精確,同時還提供了全新的視訊格式。環境紋理功能可以收集場景的材質並應用到物體上,讓物體看起來更加真實,與場景融為一體。此外還有全新的 2D 影象追蹤功能,以及 3D 物體檢測功能。面部追蹤功能則推出了全新的“凝視追蹤”以及“舌頭追蹤”。

WWDC 2018: ARKit 2 的新功能

兩個新增的 session configuration,ARImageTrackingConfiguration 用於獨立影象追蹤,ARObjectScanningConfiguration 則用於物體掃描。此外還有一些用於與 ARSession 互動的補充型別:

WWDC 2018: ARKit 2 的新功能

ARAnchor 用於表示現實世界中的某個具體位置,新增了兩個全新型別:

WWDC 2018: ARKit 2 的新功能

相關 Session

檢視更多 WWDC 18 相關文章請前往 老司機x知識小集xSwiftGG WWDC 18 專題目錄

相關文章