iOS11 ARKit技術(shù)漫談(1)-基礎(chǔ)

iOS11出來也有一段時(shí)間了,其中ARKit框架還是比較有吸引力的。就想用點(diǎn)時(shí)間學(xué)習(xí)一下,來做點(diǎn)好玩的東西。畢竟有難度必有所得嘛。
既然有方向了,那就給自己一個(gè)目標(biāo)吧,這樣學(xué)習(xí)起來才有動(dòng)力和目的。我的目標(biāo)就是使用ARKit框架實(shí)現(xiàn)類似于湯姆貓說話,在我們公司移動(dòng)辦公平臺(tái)智能語音聊天的基礎(chǔ)上,實(shí)現(xiàn)虛擬現(xiàn)實(shí)中和一個(gè)小人進(jìn)行聊天。

這一章主要講基礎(chǔ)知識(shí),來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的AR中添加一個(gè)正方形。

參考文章:
跨越屏幕的界限,蘋果 ARKit 初探
良心教程:用戶交互的黑科技ARKit

設(shè)備要求

要運(yùn)行ARKit,在硬件上需要具備A9及以上的處理器,也就是iPhone6s以上的手機(jī)才可以支持AR。

我們?cè)谧龀绦驎r(shí),最好判斷是否支持ARKit,如果你的項(xiàng)目就是基于ARKit的,可以在Required Device capabilities中添加如下UIRequiredDeviceCapabilities:

EE8D3B58-0C37-4E85-B3F4-BC4F90C28A86.png

如果設(shè)備不支持的話就會(huì)顯示這個(gè):


88E35776-D309-4472-8C47-A30A2AFA04D4.png

如果ARKit只是程序的一部分,就要使用isSupport來判斷加載。

//在viewDidAppear中添加
 guard ARWorldTrackingConfiguration.isSupported else {
            fatalError("""
                ARKit is not available on this device. For apps that require ARKit for core functionality, use the `arkit` key in the key in the `UIRequiredDeviceCapabilities` section of the Info.plist to prevent the app from installing. (If the app can't be installed, this error can't be triggered in a production scenario.)  In apps where AR is an additive feature, use `isSupported` to determine whether to show UI for launching AR experiences. """) // For details, see https://developer.apple.com/documentation/arkit
        }

軟件要求

需要運(yùn)行xcode 9.0 和 IOS 11 SDK

1. AR工作流程

1506653219921683.jpeg

其中藍(lán)色表示 ARKit 負(fù)責(zé)的部分,綠色表示 SceneKit 負(fù)責(zé)的部分。當(dāng)然,建立虛擬世界也可以使用其他的框架,比如 SpriteKit、Metal,本文將以 SceneKit 為例子進(jìn)行講解。

  1. 首先,ARKit 利用攝像頭拍攝現(xiàn)實(shí)場(chǎng)景的畫面,然后 SceneKit 用來建立虛擬世界。
  2. 建立好了以后,ARKit 負(fù)責(zé)將現(xiàn)實(shí)世界和虛擬世界的信息融合,并渲染出一個(gè) AR 世界。
  3. 在渲染的同時(shí),ARKit 要負(fù)責(zé)以下三件事:
  • 維持世界追蹤。指的是當(dāng)你移動(dòng)攝像頭,要去獲取新的現(xiàn)實(shí)世界的信息。
  • 進(jìn)行場(chǎng)景解析。指的是解析現(xiàn)實(shí)世界中有無特征點(diǎn)、平面等關(guān)鍵信息。
  • 處理與虛擬世界的互動(dòng)。指的是當(dāng)用戶點(diǎn)擊或拖動(dòng)屏幕時(shí),處理有沒有點(diǎn)擊到虛擬物體或者要不要進(jìn)行添加/刪除物體的操作。

2. ARKit 和 SceneKit 關(guān)系圖

1506653305405397.png

這些類可以查看第一個(gè)參考文章,我也是記錄一下,方便以后查看

3 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的demo

  1. 創(chuàng)建一個(gè)ARDemo的project, 基于swift語言
  2. 在Info.plist中添加Camera Usage Description的相機(jī)權(quán)限。
  3. 點(diǎn)擊main.storyboard 中,在Object Library中選擇ARKit SceneKit View,如下:
71554825-4D5C-4E06-B649-4DE583E29713.png
  1. 把ARKit SceneKit View拖到ViewController中,如下圖:
FB0790CB-87B3-49E3-943A-BE051C45EF93.png
  1. 在ViewController.m中,添加 import ARKit , 代碼如下:
class ViewController: UIViewController {

    @IBOutlet weak var sceneView: ARSCNView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        addBox()  //添加一個(gè)立方體
        addTapGestureToSceneView() //添加一個(gè)點(diǎn)擊手勢(shì),可以根據(jù)手勢(shì)的坐標(biāo)來進(jìn)行立方體的拖動(dòng)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let configuration = ARWorldTrackingConfiguration() //初始化一個(gè)名為AR的配置,進(jìn)行世界跟蹤的配置,用來跟蹤設(shè)備的方向和位置。也可以通過設(shè)備的相機(jī)檢測(cè)現(xiàn)實(shí)世界的表面。
        sceneView.session.run(configuration)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        sceneView.session.pause()   //停止跟蹤視圖內(nèi)容的運(yùn)動(dòng)和處理圖像
    }
 
    func addBox(x: Float = 0, y: Float = 0, z: Float = -0.2){   // 這里x,y,z中1就代表1米
        let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
        
        //1. 創(chuàng)建一個(gè)節(jié)點(diǎn),把box加入到geomety(幾何結(jié)構(gòu))中
        let boxNode = SCNNode()
        boxNode.geometry = box
        boxNode.position = SCNVector3(x, y, z) //正x在右邊,負(fù)x在左邊。正y是向上,負(fù)y是向下。正z是向后,負(fù)z是向前的。我們是設(shè)置的向前0.2米
        
       //2. 初始化SCNScene對(duì)象,把上面的節(jié)點(diǎn)加入到scene的根節(jié)點(diǎn)上
        let scene = SCNScene()
        scene.rootNode.addChildNode(boxNode)
        //3. 把scene對(duì)象加入到我們的sceneView的scene上
        sceneView.scene = scene
    }
    
    func addTapGestureToSceneView() {
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.didTap(withGestureRecognizer:)))
        sceneView.addGestureRecognizer(tapGestureRecognizer)
    }
    
    @objc func didTap(withGestureRecognizer recognizer: UITapGestureRecognizer) {
        let tapLocation = recognizer.location(in: sceneView)
        let hitTestResults = sceneView.hitTest(tapLocation)
        
        guard let node = hitTestResults.first?.node else {
            let hitTestResultsWithFeaturePoints = sceneView.hitTest(tapLocation, types: .featurePoint)
            if let hitTestResultWithFeaturePoints = hitTestResultsWithFeaturePoints.first {
                let translation = hitTestResultWithFeaturePoints.worldTransform.translation
                addBox(x: translation.x, y:translation.y, z:translation.z)
            }
            return
        }
        node.removeFromParentNode()
    }
}

extension float4x4 {
    var translation: float3  {
        let translation = self.columns.3
        return float3(translation.x, translation.y, translation.z)
    }
    
}

GitHub代碼

就可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的VR程序。



知行辦公,專業(yè)移動(dòng)辦公平臺(tái)https://zx.naton.cn/
【總監(jiān)】十二春秋之,3483099@qq.com
【Master】zelo,616701261@qq.com
【運(yùn)營】運(yùn)維艄公,897221533@qq.com;****
【產(chǎn)品設(shè)計(jì)】流浪貓,364994559@qq.com
【體驗(yàn)設(shè)計(jì)】兜兜,2435632247@qq.com
【iOS】淘碼小工,492395860@qq.comiMcG33K,imcg33k@gmail.com
【Android】人猿居士,1059604515@qq.com;思路的頓悟,1217022114@qq.com
【java】首席工程師MR_W,feixue300@qq.com
【測(cè)試】土鏡問道,847071279@qq.com
【數(shù)據(jù)】fox009521,42151960@qq.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • ARKit ARKit框架通過集成iOS設(shè)備攝像頭和運(yùn)動(dòng)功能,在您的應(yīng)用程序或游戲中產(chǎn)生增強(qiáng)現(xiàn)實(shí)體驗(yàn)。 概述 增強(qiáng)...
    暗夜夜夜行路閱讀 5,842評(píng)論 0 17
  • 0. 前言 作為一名剛?cè)腴T的 iOS 開發(fā)者,前陣子稍稍研究了一下最新發(fā)布的 ARKit,然后結(jié)合幾個(gè)其他開源項(xiàng)目...
    滑滑雞閱讀 4,416評(píng)論 5 31
  • Introducing ARKit iOS 11 引入 ARKit,這是 個(gè)全新的框架,允許開發(fā)者輕松地為 iP...
    沒八阿哥的程序閱讀 2,483評(píng)論 1 9
  • 15年,我們畢業(yè)。 我是在高三的時(shí)候遇到她的,她擅長文科,我理科比較好,但由于我們的學(xué)校更注重理科培養(yǎng),很多人都選...
    d1300d0f38ae閱讀 287評(píng)論 1 0
  • 今天我們分享的營銷秘訣是好奇。也叫好奇心!我不知道大家,尤其是你們做營銷的有沒有這種情況?經(jīng)常跟客戶打電話,客戶就...
    95e8249ee418閱讀 421評(píng)論 0 0