下面是 T 沙龍小編對分享的一些總結:
PPT 和 視訊
分享嘉賓-Roc Zhang
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!
根據應用情報公司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上的遊戲。
這個遊戲體現了ARKit2的什麼特性呢?
- 多使用者體驗。SwiftShot使用MultipeerConnectivity框架與其他本地玩家建立連線,並在裝置之間傳送遊戲資料。
- 當你開始自己的會話時,開始會話的玩家會建立一個ARWorldMap,它包含ARKit對遊戲板周圍區域的空間理解。
- 其他參與的玩家會收到地圖的副本,並看到一張主人遊戲臺的照片。移動他們的裝置,幫助ARKit處理接收到的地圖,並建立多人遊戲的共享參考框架。
How to Create an ARKit App –– Roc`s idea
接下來Roc通過自己的專案想法向大家介紹瞭如何去建立一個ARKit應用。
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
}
複製程式碼
一些手勢
我們可以新增一些手勢,來控制物體的縮放,旋轉和移動。
多使用者操作 Multiuser
-
捕獲AR World Map
-
捕獲併傳送AR World Map ARKit提供了一個worldMappingStatus值:notAvailable,extending,limited,mapped,該值指示當前是否是捕獲世界地圖的好時機
-
接收當前世界地圖
-
通過MultipeerConnectivity連結
-
接收並重新定位到共享地圖
Beat PM
這是Roc正在構思的一個小遊戲,可以在繁忙的工作中放鬆身心。相信不久就會呈現在大家面前,讓我們拭目以待。
MultipeerConnectivity&Peertalk
最後Roc又延伸介紹了下MultipeerConnectivity以及Peertalk(An iOS and Mac Cocoa library for communicating over USB),感興趣的童鞋可以詳細瞭解下。
總結
Roc此次分享主要為大家介紹了ARKit的特性,以及如何使用ARKit。
-
ARKit提供的世界追蹤功能可以提供裝置在物理環境中的相對位置,場景理解可以確定裝置周圍環境的屬性或特徵,更好的在現實世界中放置物體。ARKit可以與SceneKit和SprintKit無縫整合。同時蘋果提供了Metal模板,可以幫助開發者自定製渲染引擎。ARKit還提供多人操作功能,可以讓多個人共同參與到遊戲中來。
-
如何使用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…