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

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

這一章主要講基礎(chǔ)知識(shí)唠亚,來(lái)實(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來(lái)判斷加載罢维。

//在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 用來(lái)建立虛擬世界。
  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í)世界中有無(wú)特征點(diǎn)、平面等關(guān)鍵信息慰安。
  • 處理與虛擬世界的互動(dòng)腋寨。指的是當(dāng)用戶點(diǎn)擊或拖動(dòng)屏幕時(shí),處理有沒(méi)有點(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語(yǔ)言
  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)來(lái)進(jìn)行立方體的拖動(dòng)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let configuration = ARWorldTrackingConfiguration() //初始化一個(gè)名為AR的配置,進(jìn)行世界跟蹤的配置,用來(lái)跟蹤設(shè)備的方向和位置谜疤。也可以通過(guò)設(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íng)】運(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è)試】土鏡問(wèn)道,847071279@qq.com辫呻;
【數(shù)據(jù)】fox009521清钥,42151960@qq.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末放闺,一起剝皮案震驚了整個(gè)濱河市祟昭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怖侦,老刑警劉巖篡悟,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谜叹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恰力,警方通過(guò)查閱死者的電腦和手機(jī)叉谜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)踩萎,“玉大人停局,你說(shuō)我怎么就攤上這事∠愀” “怎么了董栽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)企孩。 經(jīng)常有香客問(wèn)我锭碳,道長(zhǎng),這世上最難降的妖魔是什么勿璃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任擒抛,我火速辦了婚禮,結(jié)果婚禮上补疑,老公的妹妹穿的比我還像新娘歧沪。我一直安慰自己,他們只是感情好莲组,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布诊胞。 她就那樣靜靜地躺著,像睡著了一般锹杈。 火紅的嫁衣襯著肌膚如雪撵孤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天竭望,我揣著相機(jī)與錄音邪码,去河邊找鬼。 笑死咬清,一個(gè)胖子當(dāng)著我的面吹牛霞扬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枫振,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼喻圃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了粪滤?” 一聲冷哼從身側(cè)響起斧拍,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杖小,沒(méi)想到半個(gè)月后肆汹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體愚墓,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年昂勉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浪册。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岗照,死狀恐怖村象,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攒至,我是刑警寧澤厚者,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站迫吐,受9級(jí)特大地震影響库菲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜志膀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一熙宇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溉浙,春花似錦烫止、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)圆裕。三九已至广鳍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吓妆,已是汗流浹背赊时。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留行拢,地道東北人祖秒。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舟奠,于是被迫代替她去往敵國(guó)和親竭缝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

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