T 沙龍移動實踐日總結 —— From Idea To an AR App

CodeTShanghai發表於2019-03-01

下面是 T 沙龍小編對分享的一些總結:

PPT 和 視訊

視訊地址
PPT地址

分享嘉賓-Roc Zhang

T 沙龍移動實踐日總結 —— From Idea To an AR App
Roc Zhang,本名張鵬,曾在MoreTech實習,現在流利說擔任iOS研發。自己已有多款App上架app store,Adonis、Mr.Weather、Year Timer,去美國參加了這次WWDC2018。經驗豐富,非常優秀。個人部落格:www.roczhang.com/, 微博:@RocZhang。Roc此次詳細的介紹了ARKit的新特性以及他自己正在嘗試的一個專案。

Roc分四部分向大家進行介紹

WWDC 2018

首先Roc帶來了這次WWDC 2018的親身見聞。AR is the future!

T 沙龍移動實踐日總結 —— From Idea To an AR App
根據應用情報公司Sensor Tower提供的新資料,自從2017年9月19日釋出iOS 11以來,已經下載了超過1300萬個使用蘋果ARKit構建的擴增實境應用。

ARKit

  • ARKit 是一個移動端 AR 平臺,用於在 iOS 上開發擴增實境 app。
  • ARKit 提供了介面簡單的高階 API,有一系列強大的功能。
  • 但更重要的是,它也會在目前的數千萬臺 iOS 裝置上推出。為了獲得 ARKit 的完整功能,需要 A9 及以上晶片。其實也就是大部分執行 iOS 11 的裝置,包括 iPhone 6S。

1.功能

追蹤(Tracking)

追蹤是 ARKit 的核心功能,也就是可以實時追蹤裝置。

  • 世界追蹤(world tracking)可以提供裝置在物理環境中的相對位置。
  • 藉助視覺慣性里程計Visual–Inertial Odometry(VIO),可以提供裝置所在位置的精確檢視以及裝置朝向,視覺慣性里程計使用了相機影象和裝置的運動資料。
  • iPhone X獨有的人臉追蹤

場景理解(Scene Understanding)

追蹤上面一層是場景理解,即確定裝置周圍環境的屬性或特徵。

  • 平面檢測(plane detection) 平面檢測能夠確定物理環境中的表面或平面。例如地板或桌子。
  • 命中測試(hit test) 為了放置虛擬物體,Apple 還提供了命中測試功能。此功能可獲得與真實世界拓撲的相交點,以便在物理世界中放置虛擬物體。
  • 光線估算(Lighting Conditions) 光線估算用於正確光照你的虛擬幾何體,使其與物理世界相匹配

渲染(Rendering)

結合使用上述功能,可以將虛擬內容無縫整合進物理環境。所以 ARKit 的最後一層就是渲染。

  • Apple 讓我們可以輕易整合任意渲染程式。他們提供的持續相機影象流、追蹤資訊以及場景理解都可以被匯入任意渲染程式中。
  • 對於使用 SceneKit 或 SpriteKit 的人,Apple 提供了自定義 AR view,替你完成了大部分的渲染。所以真的很容易上手。
  • 同時對於做自定義渲染的人,Apple 通過 Xcode 提供了一個 metal 模板,可以把 ARKit 整合進你的自定義渲染器。
  • Unity 和 UNREAL 會支援 ARKit 的全部功能

2.ARKit歷程

  • 2017年,蘋果在WWDC 2017大會上推出ARKit 1.0版本。
  • 2018年初,伴隨著iOS11.3的釋出,ARKit 1.5版本推出。
    • 支援2D的影象檢測,將真實世界的影象整合到AR體驗中;
    • 支援虛擬物件放置在垂直表面;
    • 支援自動對焦,從而獲得更清晰的檢視
  • WWDC 2018 ARKit 2.0橫空出世,帶來了一些新特性。
    • 載入和儲存地圖,提供了全新的持久化及多人體驗
    • 環境紋理,可以更真實地渲染 AR 場景
    • 影象追蹤,實時追蹤 2D 圖片
    • 物體檢測,檢測場景中的 3D 物體
    • 面部追蹤提升

SwiftShot

接下來Roc為大家帶來了一款WWDC18上的遊戲。

T 沙龍移動實踐日總結 —— From Idea To an AR App

T 沙龍移動實踐日總結 —— From Idea To an AR App

這個遊戲體現了ARKit2的什麼特性呢?

  • 多使用者體驗。SwiftShot使用MultipeerConnectivity框架與其他本地玩家建立連線,並在裝置之間傳送遊戲資料。
  • 當你開始自己的會話時,開始會話的玩家會建立一個ARWorldMap,它包含ARKit對遊戲板周圍區域的空間理解。
  • 其他參與的玩家會收到地圖的副本,並看到一張主人遊戲臺的照片。移動他們的裝置,幫助ARKit處理接收到的地圖,並建立多人遊戲的共享參考框架

How to Create an ARKit App –– Roc's idea

接下來Roc通過自己的專案想法向大家介紹瞭如何去建立一個ARKit應用。

T 沙龍移動實踐日總結 —— From Idea To an AR App

T 沙龍移動實踐日總結 —— From Idea To an AR App

ARKit 是基於 session 的 API。所以首先你要做建立一個簡單的 ARSession。ARSession 物件用於控制所有處理流程,這些流程用於建立擴增實境 app。但首先需要確定擴增實境 app 將會做哪種型別的追蹤。所以,還要建立一個 ARSessionConfiguration。ARSessionConfiguration 及其子類用於確定 session 將會執行什麼樣的追蹤。只要設定好對應的屬性,就可以獲得不同型別的場景理解,並讓 ARSession 做不同的處理。

要執行 session,只要對 ARSession 呼叫 run 方法即可,帶上所需的 configuration。 run(_ configuration) 然後處理流程就會立刻開始。同時底層也會開始捕捉資訊。幕後會自動建立 AVCaptureSession 和 CMMotionManager。它們用於獲取影象資料和運動資料,這些資料會被用於追蹤。

處理完成後,ARSession 會輸出 ARFrames。

ARFrame 就是當前時刻的快照,包括 session 的所有狀態,所有渲染擴增實境場景所需的資訊。要訪問 ARFrame,只要獲取 ARSession 的 currentFrame 屬性。或者也可以把自己設定為 delegate,接收新的 ARFrame。

程式碼實現

class ViewController: UIViewController { 
...
@IBOutlet var sceneView: ARSCNView!
overide func viewDidLoad() { 
...
let scene = SCNScene(named: “xxx”)
sceneView.scene = scene }
override func viewWillAppear(_ animated: Bool) { 
...
let configuration = ARWorldTrachingConfiguration() Configuration.planeDetection = .horizontal
sceneView.session.run(configuration) }
}
複製程式碼

場景理解(Scene Understanding)

平面檢測

  • 平面檢測可以提供相對於重力的水平面。包括地面以及類似桌子等平行平面。ARKit 1.5 開始也支援了垂直平面檢測。
  • ARKit會在後臺聚合多個幀的資訊,所以當使用者繞著場景移動裝置時,它會掌握更多有關平面的資訊。
  • 平面檢測還能校準平面的邊緣,即在平面所有檢測到的部分四周套上一個矩形,並將其與主要區域對齊。所以從中也能得知物理平面的主要角度。
  • 如果同一個物理平面檢測到了多個虛擬平面,ARKit會負責合併它們。組合後的平面會擴大至二者範圍,因此後檢測的那些平面就會從session中移除。

程式碼實現

// 建立新的 world tracking configuration
let configuration = ARWorldTrackingSessionConfiguration()

// 啟用平面檢測
configuration.planeDetection = .horizontal

// 改變執行中 session 的 configuration
mySession.run(configuration) 
複製程式碼

命中測試(hit test)

  • 命中測試就是從裝置傳送一條光線,並與真實世界相交併找到相交點。
  • ARKit 會使用所有能用的場景資訊,包括所有檢測到的平面以及3D特徵點,這些資訊都被 ARWorldTracking 用於確定位置。
  • ARKit 然後發射光與所有能用的場景資訊相交,然後用陣列返回所有相交點,以距離升序排序。所以該陣列的第一個元素就是離攝像頭最近的相交點。
  • 有不同的相交方式。可以通過 hit-test type 來定義。一共有四種方式。
    • Existing plane using extent: 如果在執行平面檢測,並且 ARKit 已在環境中檢測到了某個平面,就可以利用此平面。但你可以選擇使用平面的範圍或忽視它的範圍。也就是說,例如你想讓使用者在某個平面上移動物件,就應該考慮範圍,所以若光在範圍內相交,就會產生一個相交點。如果這束光打到了範圍的外面,就不會產生相交點。
    • Existing plane: 但如果你只檢測到了地面的一小部分,但希望來回移動傢俱,就可以選擇忽略範圍,把當前平面當做無限平面。在這種情況下,你總是會獲得相交點。
    • Estimated plane: 如果沒有在執行平面檢測或者還沒有檢測到某個平面,也可以根據目前的 3D 特徵點來估算平面。在這種情況下,ARKit 會尋找環境中的處於共同平面的點併為它們安裝一個平面。隨後也返回與此平面的相交點。
    • Feature point: 如果你想在某個很小的表面上放東西,但此表面無法生成平面,或者是某個非常不規則的環境,也可以選擇直接和特徵點相交。也就是說光線會與特徵點產生相交點,並將距離最近的特徵點其作為結果返回。

程式碼實現

if let point = sceneView.hitTest(screenCenter, type: [.estimatedHorizontalPlane]).first {

// Creat ARAnchor using result 

}
複製程式碼

一些手勢

我們可以新增一些手勢,來控制物體的縮放,旋轉和移動。

T 沙龍移動實踐日總結 —— From Idea To an AR App

多使用者操作 Multiuser

  • 捕獲AR World Map

    T 沙龍移動實踐日總結 —— From Idea To an AR App

  • 捕獲併傳送AR World Map ARKit提供了一個worldMappingStatus值:notAvailable,extending,limited,mapped,該值指示當前是否是捕獲世界地圖的好時機

    T 沙龍移動實踐日總結 —— From Idea To an AR App

  • 接收當前世界地圖

    T 沙龍移動實踐日總結 —— From Idea To an AR App

  • 通過MultipeerConnectivity連結

    T 沙龍移動實踐日總結 —— From Idea To an AR App

  • 接收並重新定位到共享地圖

    T 沙龍移動實踐日總結 —— From Idea To an AR App

Beat PM

T 沙龍移動實踐日總結 —— From Idea To an AR App
這是Roc正在構思的一個小遊戲,可以在繁忙的工作中放鬆身心。相信不久就會呈現在大家面前,讓我們拭目以待。

MultipeerConnectivity&Peertalk

最後Roc又延伸介紹了下MultipeerConnectivity以及Peertalk(An iOS and Mac Cocoa library for communicating over USB),感興趣的童鞋可以詳細瞭解下。

T 沙龍移動實踐日總結 —— From Idea To an AR App

T 沙龍移動實踐日總結 —— From Idea To an AR App

總結

Roc此次分享主要為大家介紹了ARKit的特性,以及如何使用ARKit。

  1. ARKit提供的世界追蹤功能可以提供裝置在物理環境中的相對位置,場景理解可以確定裝置周圍環境的屬性或特徵,更好的在現實世界中放置物體。ARKit可以與SceneKit和SprintKit無縫整合。同時蘋果提供了Metal模板,可以幫助開發者自定製渲染引擎。ARKit還提供多人操作功能,可以讓多個人共同參與到遊戲中來。

  2. 如何使用ARKit,概括起來就是,ARSCNView 結合 SCNScene 中的虛擬世界資訊和 ARsession 捕捉到的現實世界資訊,渲染出 AR 世界。ARSessionConfiguration 及其子類指導 ARSession 如何追蹤世界,追蹤的結果以 ARFrame 返回。ARFrame 中的 ANAnchor 資訊為 SceneKit 中的 SCNNode 提供了一些放置的點,以便將虛擬節點和現實錨點繫結。

參考

xiaozhuanlan.com/topic/90614… developer.apple.com/videos/play… juejin.im/post/5a308b… developer.apple.com/documentati… toutiao.io/posts/g54ix… developer.apple.com/documentati…

相關文章