ARKit 初體驗


  ARKIT是蘋果公司在今年發布的一個AR開發包,用於現有的IOS設備,是的,就是用在手機或者平板上,類似於pokemon go的效果。看了下演示視屏,嗯,看起來很厲害。

 

  對於一個資深軟粉,居然被要求研究它,盡管不情願,還是得去看看。

 

  先花半天時間熟悉下swift,再去蘋果開發者中心看看arkit的文檔。接着MacBook和ipad pro也到了(請注意! ARKIT 理論上支持現有的所有IOS設備,但是,要進行平面解析以及位置追蹤的話,處理器必須是A9及更快)。將它們的系統都升級到最新(MacOS10.12.6和IOS 11 beta),安裝xcode 9beta,安裝Unity 2017,開發環境就弄好了。你問我為什么要安裝Unity2017 ? 因為Unity 也可以用於ARKit的開發。

 

  廢話說完了,下面正是進入開發階段。

 

  首先打開Xcode,新建一個項目(不知道IOS Developer 們是不是叫新建項目) , 選擇IOS項目,選擇Augmented Reality APP 模版,next,輸入你的項目名稱 next,create。一個基本的AR應用就建好了,可以先用真機調試下,看能不能運行,如果不能運行的話,那我也沒辦法。

  

  下面轉到ARKit開發文檔頁面,看看它到底是個什么情況。在First Steps 有兩項:

建議不知道或者不太知道AR的朋友戳進去Understanding下。

  ARSession在ARKIT中是一個非常重要的API,它搭建了整個AR世界以及攝像頭管理。我們點進去可以看到一個run方法,它的作用可以理解為調用了該方法就開始加載ar世界了。它的參數是一個ARSessionConfiguration,從名字可以看出這是一個決定ARKit如何運行的類,它還有一個子類ARWorldTrackingSessionConfiguration,以后我們要用到的也大多是它的子類。出了run方法外,它還有一個pause方法,顧名思義就是暫停的意思。它還有add和remove方法,用於添加和移除描點,關於描點后面會講到。屬性currentFrame獲取當前幀,類型是ARFrame。

 

  接下來看看ARWorldTrackingSessionConfiguration,它的作用就是能讓你的AR應用擁有6個自由度(不知道什么是自由度的請使用搜索引擎),它有一個PlaneDetection屬性,如果要檢測真實世界中的平面的話,請將它設為horizontal,isLightEstimationEnabled屬性為自動光照,建議true。

 

  接下來看看另外一個非常重要的東西:ARSCNView,它繼承自SCNView,SCNView則是用於SceneKit的顯示,SceneKit是蘋果公司收購的一個游戲引擎。簡而言之,AR程序中真實世界部分由ARSession提供,虛擬部分由ARSCNViwe提供(如果在Unity下開發,虛擬部分則由Unity提供,其它游戲引擎同理)。  ARSCNView有一個Session屬性,就是上面講的ARSession,還有一個scene屬性,scene屬性是一個場景,可以理解為整個虛擬世界就是一個scene,scene由無數node組成,關於scene的詳細理解請閱讀SceneKit文檔。

 

  下面講講比較重要的平面檢測以及Node添加,前面說過要實現平面檢測必須將planedetection設置為水平,然后通過 

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) 事件(這是叫事件么?)來獲取到識別的平面,這里由一個ARAnchor類型的參數,它就是獲取到的平面的錨點,它包含了獲取平面的坐標,可以通過這樣來添加一個物體到這個平面上:

     let plane=SCNBox(width: CGFloat(arPlaneAnchor.extent.x), height: 0.0, length: CGFloat(arPlaneAnchor.extent.z), chamferRadius: 0);
        plane.firstMaterial?.diffuse.contents=UIColor.red;
        let pnode=SCNNode(geometry: plane);
        pnode.position=SCNVector3Make(arPlaneAnchor.center.x, 0, arPlaneAnchor.center.z);
        node.addChildNode(pnode);

以上代碼添加了一個和檢測到的平面等大,高度為0,顏色為紅色的平面,因為檢測到的平面是看不到的,需要我們添加一個東西來標示。請仔細閱讀以上代碼。

除了添加一個物體到平面上,還可以進行和平面的碰撞檢測,相信做游戲的朋友不會陌生。ARSCNVi 額外提供了一個hittest方法,傳入參數是一個CGPoint和hittesttype,CGPoint也就是一個二維世界的點,也就是屏幕上的一個點;type有單點(也就是相機中的任何一個地方,遺憾的是返回的結果沒有什么參考價值,都是錯的),有邊界平面和無邊界的平面(二者的區別應該很好理解)。返回值是一個ARHittestResult,它有distance,worldtransform,localtransform,分別對應距離,世界坐標和本地坐標,關於世界坐標和本地坐標請自行了解。

 

  一個最簡單的AR應用基本就完成了 , 不過現在看來也沒有其它更復雜的操作了。總體而言,ARKIt的開發難度是很低的,畢竟我這種渣渣接觸幾天就弄懂了。效果來說,位置追蹤做得相當不錯,幾乎沒有抖動和漂移的現象,平面解析還是能用的,不過也就是能用的水平,速度慢,邊界不准,有時候根本檢測不出。不過鑒於只有一個攝像頭,能作出這樣的效果還是很不錯了,遺憾的是只能檢測水平平面,並不能檢測垂直平面。

 

  期待更好的技術出現。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM