天天看點

到底有多強?蘋果的增強現實架構:ARKit

其實準備ARKit已經很久了,确切地說當WWDC開始介紹時就開始了。其後參加了蘋果的ARKit workShop,加上自己有點事,是以文章一直沒發出來,現在再發一篇上手文章,也沒什麼意義。是以本篇文章重在workShop上蘋果工程師的解惑和我對ARKit的了解, 最後會簡單介紹一下相關技術。

到底有多強?蘋果的增強現實架構:ARKit

AR(Argument Reality)大家都知道,就是将3D模型渲染在攝像頭圖像之上,混合渲染達到虛拟物品就好像是現實的一部分。ARKit解決了模型定位難的問題,結合CoreMotion運動資料與圖像處理資料,來建立一個非常準确的SLAM系統,建構虛拟世界和現實世界之間的映射。同時能夠分析環境自動給模型添加光源,實際效果還是比較驚豔的。

從結構上看,ARKit提供了一套簡單易用的AR架構,但架構之外,需要很多的三維空間、遊戲程式設計、3D模型、GPU渲染的知識來了解AR技術。ARKit最重要的兩個類是ARSession與ARSCNView

到底有多強?蘋果的增強現實架構:ARKit

類似與AVFoudation,ARKit中由ARSesseion類來配置SLAM系統的建立。設定RSession的配置選項為ARWorldTrackingSessionConfiguration來追蹤裝置的方向與位置,并且能夠檢測平面。這個選項隻有A9處理器之上才支援。其他型号處理器(6S以下)隻能追蹤裝置的方向。

ARKit的提供了自帶的兩個渲染類:ARSCNView和ARSKView,後者用來渲染2D模型。之前鮮有問津的SceneKit算是有了用武之地。這兩個類會自動開啟攝像頭并建立虛拟空間與現實空間之間的映射。同時ARKit也支援自定義用OpenGL或Metal實作渲染類,但要自己管理與ARSession之間的通信,同時要遵循iOS GPU指令不能在背景調用的規則。

其他比較重要的類有ARAnchor、ARHitTestResult、ARFrame、ARCamera。

ARAnchor世界中點,可以用來放置虛拟物品,也可以代指現實物品的放置位置。ARAnchor在世界中是唯一的,并包含仿射變換的資訊。

ARHitTestResult

HitTest的傳回,世界中的ARAnchor。

與UIKit中的hitTest不同,ARKit的HitTest以裝置方向配合視圖坐标,建立一條世界中的射線,所有在射 線上的ARAnchor, 會以由近到遠的方式傳回。此外SCeneKit的HitTest傳回虛拟物品。

ARFrame攝像頭視訊幀的包裝類,包含位置追蹤資訊、環境參數、視訊幀。重點是它包含了蘋果檢測的特征點,通過rawFeaturePoints可以擷取,不過隻是特征的位置,具體的特征向量并沒有開放。

ARCamera

場景中的錄影機,用來控制模型視圖變換和投影變換。同時提供6DOF(自由度資訊,方向+位置)與追蹤資訊。

從架構接口來看,ARKit 暴露出來的能力并不多且小心翼翼。

AR的能力,由三部分組成:

3D渲染

空間定位與方向追蹤

場景了解(檢測與識别)

目前看 ARKit 隻提供了3D渲染的入口,其他兩個都被封裝起來了,是以目前來看渲染是差異化的主要途徑,但不唯一。ARKit workShop 上,面對大家提出的苛刻問題,蘋果工程師大量提到特征點。其實計算機視覺是可以在場景了解這一層面做一些自定義的。如果蘋果開放更多的能力,那AR的能力完全可以作為任何一個APP的特性。

此外,ARKit還存在一些問題:

ARKit 是基于慣性-視覺來做空間定位的,需要平穩緩慢的移動+轉向手機,才能建構更加準确的世界,這對使用者來說是一種考驗,需要積極提示。

理論上 ARKit 在雙目攝像頭上的表現應該優于單目,這裡需要具體測試,如何來平衡使用者體驗。

.scn檔案還是知識一個簡單的3維模型編輯器,支援的檔案格式少,對模型、光照的編輯方式不太友好。對骨骼動畫的支援還有隻在能用的階段。

一旦剛開始檢測平面失敗,出現時間久,飄逸的現象,後期很難再正确檢測,要強制重新開機。

如果是使用.dae 轉 .scn 檔案,資源中包含骨骼動畫時,加載.scn檔案到 scene 中會丢失動畫,需要在加載時手動恢複一下(方法)。

設計骨骼動畫是,要求設計師把動畫放在根節點上,不要分散地放在每個bone上,這樣可以友善地讀取出動畫到CAAnimation。

最好不要将太遠的光照加載模型檔案中,這樣會導緻加載檔案到SCNNdoe時,你的 node 真實尺寸特别大,而你期望的尺寸可能隻是模型對象的大小。

模型的SCNMaterial 是用 physically based lighting model 會有更好的表現,設定比較好的環境光也比較重要。

合理的陰影會大大提高AR的效果,貼一張紋理當然可以,但動态陰影更讓人沉浸,我們還是要有追求的。

使用Bake ambient occlusion(ABO)效果,模型會更逼真。

光照node加載到 SCNScene的rootNode上,這對做碰撞檢測尤其重要

彙總了一下workShop上,比較感興趣的問題和蘋果工程師的回答,摻雜自己的了解。

1 . ARFrame提供的YUV特征,如何擷取RGB特征?

答:使用Metal去擷取特征點的RGB值。

(這個我一般是用OpenGL的shader去做,我想蘋果工程師是說将圖像用Metal轉成位圖後,根據坐标去擷取RGB值。但特征點不多的話,直接在CPU中利用公式計算一下不就行了嗎?不過也許Metal有更強大的方法。)

2 . ARKit中怎麼做虛拟環境?

答:利用Cube背景。

(這個在VR中用的比較多,就是用一個貼滿背景的立方體包裹住錄影機所在的空間,網上的資料較多。)

3 . ARKit的如何模拟光源的?為什麼不産生陰影。

答:ARKit通過圖像的環境來設定模型的環境光強度,而環境光是不産生陰影的。

(我猜蘋果應該是通過像素值來确定環境光的,如果用進階一點的方法完全可以添加直射光。光照有許多模型,隻有帶方向的光才會産生陰影,如果想用ARKit做出陰影,可以看我的回答。)

4 . AVFoudation與ARSession之間的切換會有問題嗎?

答: ARSession底層也是用AVFoudation的,如果重新打開ARKit,隻需要重新 run 一下 ARSession 可以了,但切換時會有卡頓。

(我自己試了一下,切換時确實有輕微的卡頓,切換後ARSession就停止攝像頭采集了,但3D渲染會繼續,隻是喪失了空間定位與檢測識别的能力。)

5 . ARKit是否支援前置攝像頭?

答:不支援。ARKit并不是一個用于前置攝像頭環境的技術,因為空間有限,能提供的資訊也非常有限。

(這個問題是很多參會者關心的問題,但 ARKit 團隊似乎不是很 care ,說到底還是因為前置攝像頭的場景中,使用者很少會移動,畫面中一般大部分都是人臉,這樣 ARKit 的定位與檢測能力無法很好使用。建議由類似需求的同學好好梳理,是不是想要的是3D渲染而不是AR。)

6 . ARKit的最大應用範圍是多少?

答:100米是 ARKit 在保持較好使用者體驗的最大測量距離。

(這個其實我有點沒太聽清,實際數字應該是100米以上)

7 . ARKit如何做marker?

答:ARKit不會提供這樣的能力,如果想實作的,可以用 ARKit 提供的特征點來跑自己的計算機視覺。

(熟悉計算機視覺的同學應該都明白,其實marker就是一種簡單的圖像識别,如果 ARKit 提供的特征點可靠的話,完全可以自己做特征比對。現場問了蘋果工程師,他們的特征點是什麼特征,他們不願回答,不過看使用場景的話,應該是一種邊緣敏感的低維特征,應該類似 PCA + SURF)。

8 . ARKit合适支援A8?性能如何?

答:支援A8處理器并不在計劃中(這裡指的是空間定位能力,A8隻支援空間方向追蹤),ARKit 的大部分計算都是在CPU上處理的,在A8處理器上的性能損耗在 15% ~ 25%, 在A9處理器上的性能損耗在 10% ~ 15%。

(看他們的意思,大量的計算,在A8上應該是比較低效的,解釋了為什麼A8上的追蹤能力是閹割版的。性能應該說還不錯,與遊戲類似)

9 . 如何追蹤實際的物體?

答:可以在已識别的物體位置上,添加一個node, 這樣就能在之後的進行中一直保持這個物體的追蹤。

(這次的wrokShop,蘋果大量提到他們的特征點,如果他們真的足夠重視的話,應該開放特征檢測的過程與特征向量,希望後期能夠開放吧)

10 . 如何連接配接兩個不同 ARKit 世界?

答:ARKit沒有計劃支援這些,比較 tricky 的做法是将兩個手機緊挨着啟動ARKit。

(這個也是很多參會者關注的問題,相信不少人已經有了自己的解決方案,這裡我後期會出一篇文章講解。)

AR說到底還是一種遊戲技術,AR提供了定位、檢測平面的功能,這些功能并沒有暴露出來供我們自定義,那麼隻能在渲染方面做出差異。

目前ARKit支援的3D渲染引擎,有sceneKit,Unity3D,UE。後兩者都是成熟的遊戲引擎,能夠提供完整的遊戲功能,但沒有我們沒有使用,主要因為:

上手較慢,iOS11 9月中旬就要釋出了,時間緊促。

接入Unity3D會給安裝包造成很大壓力,成本大約10M。

最終決定還是用sceneKit,主要出于一下考慮:

ARKit目前對Unity3D,UE的支援沒有sceneKit好。

sceneKit用OC寫,可以OCS。

sceneKit是系統動态庫,對安裝包壓力不大。

sceneKit雖然能力弱,但是對于AR來說足夠了,AR畢竟打造不了複雜的遊戲。

ARKit和OpenGL一樣,使用右手坐标系

到底有多強?蘋果的增強現實架構:ARKit

将模型加載到空間中,需要6個自由度(6DOF)的資訊來指定模型的表現:

到底有多強?蘋果的增強現實架構:ARKit

分别是沿三個坐标軸的平移與旋轉。

可以使用旋轉矩陣、歐拉角、四元數來定義空間旋轉,ARKit的這三種方式均有運用。

旋轉矩陣

這個好了解,使用旋轉的變換矩陣即可,次元4*4,定義一次旋轉需要16個數。

歐拉角

把空間旋轉分解成繞三個局部坐标軸的平面旋轉,分别是pitch(俯仰角,繞x軸),yaw(偏航角,繞y軸),roll(翻滾角,繞z軸),然後以一定順序做旋轉(sceneKit中是 roll -> yew -> pitch),歐拉角是使用三個 3*3 矩陣連乘實作,而且存在萬向鎖的問題。

到底有多強?蘋果的增強現實架構:ARKit

當pitch為90°時,pitch與yew的旋轉軸重合了,這時飛機喪失了一個旋轉的次元。

到底有多強?蘋果的增強現實架構:ARKit
到底有多強?蘋果的增強現實架構:ARKit

四元數

将三維空間的旋轉表示成四維空間的超球面上位移, 概念有點複雜。簡單來說,我們隻需要旋轉軸 u→=(x,y,z) ,和角度 emoji 來構造一個機關四元數 q:

到底有多強?蘋果的增強現實架構:ARKit

那麼旋轉可以定位為:

到底有多強?蘋果的增強現實架構:ARKit

對任何需要旋轉的點

到底有多強?蘋果的增強現實架構:ARKit

,将它擴充成一個純四元數

到底有多強?蘋果的增強現實架構:ARKit

,代入上面的公式,就可以得到旋轉後的點。

visual-inertial odometry :基于視覺和慣性的測量方法,慣性資料是指角速度和加速度,這些都由Core Motion提供,加上圖像特征,能夠更準确地建立SLAM系統。ARKit會将提取到的特征點映射的空間中,也就是說特征點是由三維坐标的,我們可以利用特征點來确定圖像中物體的遠近。實測效果不錯,誤差在分米級别。