ARKit介紹
ARKit是iOS11引入的一個全新的框架,使用Visual Inertial Odometry(VIO,視覺慣性里程計)來精確跟蹤現實世界中的真實場景。相比其它設備平台,ARKit中的VIO可以將傳感器數據和CoreMotion的數據融合在一起,從而提供更為精確的信息。ARKit可以讓iOS設備精確感知它如何在房間內移動,而無需外部設備的校准。基於此原理,ARKit可以獲取關於iOS設備位置和運動信息的高精度模型,並在場景中使用。
ARKit的強悍功能都是基於海量的計算,因此目前只支持Apple A9和A10處理器。從硬件設備上來看,目前搭載了Apple A9和A10處理器的只有iPhone 6s, iPhone 6s Plus, iPhone SE,iPhone7,iPhone 7 Plus,兩代iPad Pro和最新的iPad。
ARKit目前已經支持Unity、Unreal Engine和Scenekit,由於目前正在做Unity開發,故下面就簡單介紹一下Unity下的ARKit開發。
工具版本要求
- 開發IDE:Unity 5.6.1p1 或以上版本
- 運行系統:iOS 11 或以上版本
- 編譯工具:XCode 9 beta 或以上版本
- 運行設備:支持ARKit的iOS設備
Unity插件介紹
插件的下載地址:https://oc.unity3d.com/index.php/s/3hfM9T05P9vOpCf
該Unity插件將讓開發者們可以輕松訪問ARKit的功能,例如世界追蹤(World Tracking)、實時視頻渲染(Live Video Rendering)、平面預測與更新(Plane Estimation and Updates)、碰撞檢測API(Hit-testing API)、環境光預測(Ambient Light Estimation)以及原點雲數據(Raw Point Cloud Data)
其基本使用方法可以參考此文,這里不做重復敘述。
將該插件導入到Unity中,有幾個重要文件需要做一下說明:
"/Assets/Plugins/iOS/UnityARKit/NativeInterface/ARSessionNative.mm" - OC文件,ARKit SDK的本地接口文件
"/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs" - C#版本的ARKit SDK接口文件 這兩個文件完成了C#對OC跨語言調用ARKit功能的工作
UnityARSessionNativeInterface 包含下面幾個重要方法:
- public void RunWithConfigAndOptions(ARKitWorldTackingSessionConfiguration config, UnityARSessionRunOption runOptions)
- public void RunWithConfig(ARKitWorldTackingSessionConfiguration config) public void Pause()
- public List HitTest(ARPoint point, ARHitTestResultType types)
- public ARTextureHandles GetARVideoTextureHandles()
- public float GetARAmbientIntensity()
- public int GetARTrackingQuality()
還包含幾個重要事件
- public delegate void ARFrameUpdate(UnityARCamera camera)
- public delegate void ARAnchorAdded(ARPlaneAnchor anchorData)
- public delegate void ARAnchorUpdated(ARPlaneAnchor anchorData)
- public delegate void ARAnchorRemoved(ARPlaneAnchor anchorData)
- public delegate void ARSessionFailed(string error)
"/Assets/Plugins/iOS/UnityARKit/NativeInterface/AR*.cs" - ARKit用到的數據結構腳本
"/Assets/Plugins/iOS/UnityARKit/Utility/UnityARAnchorManager.cs" - 一個實用程序,可以跟蹤ARKit的錨更新,並可以為其創建相應的Unity游戲對象 (具體可以參看在 GeneratePlanes.cs 組件里查看使用方法)
"/Assets/Plugins/iOS/UnityARKit/Editor/UnityARBuildPostprocessor.cs” - 編譯時用到的編輯腳本,對導出工程做一些相應的操作,例如添加ARKit庫文件等
ARKit有用的組件 "/Assets/Plugins/iOS/UnityARKit/UnityARCameraManager.cs" - 這個組件應該放置在通過ARKit引用的攝像機的場景中的一個游戲對象,並且它將定位和旋轉相機,並提供基於ARKit更新的正確投影矩陣。該組件還具有初始化ARKit的功能
"/Assets/Plugins/iOS/UnityARKit/UnityARVideo.cs" - 該組件應放置在相機上,並抓取渲染視頻所需的紋理,並將其設置為對后緩沖區進行拼接所需的材質,並設置命令緩沖區以進行實際布局
ARKit使用說明
- 首先給Camera掛上UnityARCameraNearFar和UnityARVideo這兩個腳本並為UnityARVideo的ClearMaterial設置上YUVMaterial材質,其中UnityARCameraNearFar腳本將Camera的nearClipPlane和farClipPlane提供給ARKit使用,UnityARVideo則將攝像頭拍攝到的真實世界組合到Camera呈現的背景中去。
- 通過UnityARSessionNativeInterface.GetARSessionNativeInterface()拿到ARKit的會話接口,暫且叫它m_session。
- 調用m_session.RunWithConfig(config)或m_session.RunWithConfigAndOption(config,option)可以創建一個ARSession,這也代表着ARKit的啟動。
- 通過m_session.GetCameraPose()可以獲取ARKit所認為的Camera當前姿態,例如位置和旋轉,將其設置給Camera。
- 通過m_session.GetCameraProjection()可以獲取ARKit所認為的Camera當前投影矩陣,將其設置給Camera。(以上2-5步可以參考UnityARCameraManager.cs中的使用)
- 通過以上步驟,一個基本的AR場景就算搭建好了,你可以通過m_session.HitTest(point,resultTypes)來確定攝像頭中的該位置在ARKit理解中是虛擬世界的什么位置和形態。(參考UnityARHitTestExample.cs)
- 也可以通過m_session的配置進行平面檢測,通過設置UnityARSessionNativeInterface.ARAnchorAddedEvent,UnityARSessionNativeInterface.ARAnchorUpdatedEvent和UnityARSessionNativeInterface.ARAnchorRemovedEvent來獲得ARkit對攝像頭中平面的理解。(參考UnityARAnchorManager.cs)
- 同樣的,如果想獲取ARKit理解的特征點數據,可以通過設置UnityARSessionNativeInterface.ARFrameUpdatedEvent來及時獲取。(參考PointCloudParticleExample.cs)
- 還可以通過m_session.GetARAmbientIntensity()來獲取對光線強度的估算(參考UnityARAmbient.cs)
- 最后需要注意的是,ARKit的各種方法的回調速度和Unity的更新速度是不一樣的。
總結
ARKit的功能非常強大,但使用卻如此簡單,使用不難,只能說蘋果牛逼呀!
本文來自網易雲社區,經作者張志明授權發布。
原文地址:ARKit入門
更多網易研發、產品、運營經驗分享請訪問網易雲社區。
