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

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

PPT 和 視頻

視頻地址
PPT地址git

分享嘉賓-Roc Zhang

Roc Zhang,本名張鵬,曾在MoreTech實習,如今流利說擔任iOS研發。本身已有多款App上架app store,Adonis、Mr.Weather、Year Timer,去美國參加了此次WWDC2018。經驗豐富,很是優秀。我的博客: www.roczhang.com/, 微博: @RocZhang。Roc這次詳細的介紹了ARKit的新特性以及他本身正在嘗試的一個項目。

Roc分四部分向你們進行介紹github

WWDC 2018

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

根據應用情報公司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)

追蹤上面一層是場景理解,即肯定設備周圍環境的屬性或特徵。bash

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

渲染(Rendering)

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

  • 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的什麼特性呢?app

  • 多用戶體驗。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。

  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…

相關文章
相關標籤/搜索