ARKit的學(xué)習(xí)

概述

ARKit.png

iOS 11 引入了 ARKit房轿,這是一個全新的框架粤攒,允許開發(fā)者輕松地為 iPhone 和 iPad 創(chuàng)建無與倫比的增強現(xiàn)實體驗所森。通過將虛擬對象和虛擬信息同用戶周圍的環(huán)境相互融合,ARKit 使得應(yīng)用跳出屏幕的限制夯接,讓它們能夠以全新的方式與現(xiàn)實世界進行交互焕济。

視覺慣性測距【全局追蹤】

ARKit 使用視覺慣性測距 (Visual Inertial Odometry, VIO) 來精準追蹤周圍的世界。VIO 將攝像頭的傳感器數(shù)據(jù)同 Core Motion 數(shù)據(jù)進行融合盔几。這兩種數(shù)據(jù)允許設(shè)備能夠高精度地感測設(shè)備在房間內(nèi)的動作晴弃,而且無需額外校準。

場景識別與光亮估量【場景理解】

借助 ARKit逊拍,iPhone 和 iPad 可以分析相機界面中所呈現(xiàn)的場景上鞠,并在房間當中尋找水平面。ARKit 不僅可以檢測諸如桌子和地板之類的水平面芯丧,還可以在較小特征點 (feature points) 上追蹤和放置對象旗国。ARKit 還利用攝像頭傳感器來估算場景當中的可見光總亮度,并為虛擬對象添加符合環(huán)境照明量的光量注整。

高性能硬件與渲染優(yōu)化【渲染】

ARKit 運行在 Apple A9 和 A10 處理器上。這些處理器能夠為 ARKit 提供突破性的性能度硝,從而可以實現(xiàn)快速場景識別肿轨,并且還可以讓您基于現(xiàn)實世界場景,來構(gòu)建詳細并引人注目的虛擬內(nèi)容蕊程。您可以利用 Metal椒袍、ScenekitSpritekit 以及諸如Unity藻茂、UNREAL ENGINE之類的第三方工具驹暑,來對 ARKit 進行優(yōu)化。


ARKit與SceneKit

  • ARKit:相機捕捉真實世界
  • Scenekit:制作3D模型
<ARKit>與<SceneKit>框架關(guān)系圖.jpg
  • 大家可以看到圖中的 ARSession 類辨赐,配置 ARSession优俘,然后使用 SceneKit 或者 SpriteKit 來展示 AR 內(nèi)容。ARSCNViewARSKView 類都是包含在 ARSession 當中的掀序,而 ARSession 對象則用來管理設(shè)備動作追蹤和進行圖像處理的帆焕,也就是創(chuàng)建 AR 場景的必需品。但是不恭,要運行 Session叶雹,您首先必須選擇一種 Session 配置。

    • ARWorldTrackingConfiguration:提供高品質(zhì)的AR體驗换吧,可精確跟蹤設(shè)備的位置和方向折晦,并允許平面檢測和命中測試。
      f76d63a3-7620-40d1-9e52-0d9ad6329678.png
    • AROrientationTrackingConfiguration:提供僅跟蹤設(shè)備方向的基本AR體驗沾瓦。
      ba51d1f9-896b-4b97-a87a-a3db9032eb00.png

      然后满着,我們在這個配置上調(diào)用run()函數(shù)谦炒。該會話還具有同時運行的AVCaptureSession和CMMotionManager對象,以獲取用于跟蹤的圖像和運動數(shù)據(jù)漓滔。最后编饺,會話將當前幀輸出到ARFrame對象。
  • SCNScene:節(jié)點【萬物皆Scene】,每一個Scene都有個根節(jié)點RootNode响驴。如圖所示節(jié)點類似于NSObject,節(jié)點就可以看做是3D物件透且。


跟蹤設(shè)備方向的基本配置

ARFrame:捕獲和位置追蹤、視頻圖像信息豁鲤。
ARFrame
ARAnchor:一個真實的位置和方向,可用于將對象放置在一個基于“增大化現(xiàn)實”技術(shù)的游戲場景秽誊。
ARAnchor
Tracking:如圖x、y琳骡、z三個軸組成锅论,z軸負數(shù)的情況下說明顯示在相機前面的位置,正數(shù)的時候顯示在相機后面的位置楣号。
Tracking

AR應(yīng)用程序

app結(jié)構(gòu).png

如圖:

  • ARKit負責采集場景最易;
  • SceneKit、SpriteKit炫狱、Metal負責渲染藻懒;
    • SpriteKit:在很久以前做平面、立體大家都要依靠OpenCV视译、OpenGL嬉荆,由于比較難用,后來有人封裝成cocos2d酷含。蘋果后來在cocos2d基礎(chǔ)上又封裝一層鄙早,也就是現(xiàn)在的SpriteKit。效果不錯后iOS8又推出了SceneKit椅亚;
    • Metal:用來操作GPU限番;【GPU處理事情的時候是同步處理】

開發(fā)環(huán)境和適配設(shè)備

  • Xcode:Xcode9以上版本,最新已更新到到 【Xcode9-beta 6】什往。
  • 設(shè)備:需要具有A9或更高版本處理器的iOS設(shè)備扳缕。
  • 系統(tǒng):當然是iOS11嘍,最新已更新到 【iOS 11 beta 9】,然后下載描述文件。安裝描述文件别威,重新啟動躯舔。檢查軟件更新就可以了。

項目創(chuàng)建

項目創(chuàng)建

選擇SceneKit3D模型

選擇SceneKit

工程創(chuàng)建后初始代碼

   override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true
        
        // SCNScene:場景里面包含一個模型省古,然后把場景放到ARSCNView上粥庄,然后就可以展示。
        let scene = SCNScene(named: "art.scnassets/ship.scn")!
        
        // Set the scene to the view
        sceneView.scene = scene
   }

   override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // Create a session configuration
        let configuration = ARWorldTrackingConfiguration()

        // 通過`run()`啟動追蹤
        sceneView.session.run(configuration)
        
    }
    
   override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        //通過`pause()`暫停
        sceneView.session.pause()
    }

真機直接運行

真機運行第一次會提示相機權(quán)限豺妓,開啟后顯示出一個3D飛機在相機前惜互。

運行.gif

下面我們創(chuàng)建一張相機截圖顯示在手機屏幕前

通過添加手勢布讹,點擊后生成截屏圖片顯示在手機前。

 @objc func handtap(gestureRecognizer:UITapGestureRecognizer){
        
        guard let currentFrame = sceneView.session.currentFrame else {
            return
        }
        /// 創(chuàng)建圖片
        let imagePlane = SCNPlane(width: sceneView.bounds.width / 6000, height: sceneView.bounds.height / 6000)
        /// 渲染圖片
        imagePlane.firstMaterial?.diffuse.contents = sceneView.snapshot() //截屏
        imagePlane.firstMaterial?.lightingModel = .constant
        /// 創(chuàng)建節(jié)點并添加到sceneView上
        let planNode = SCNNode(geometry: imagePlane)
        sceneView.scene.rootNode.addChildNode(planNode)
        /// 追蹤相機位置
        var translate = matrix_identity_float4x4
        translate.columns.3.z = -0.1
        ///取相機里面的數(shù)據(jù)训堆,放到simdTransform
        planNode.simdTransform = matrix_multiply(currentFrame.camera.transform, translate)
    }

firstMaterial:渲染
sceneView.snapshot():sceneView全部內(nèi)容展示出來【截屏】
matrix_identity_float4x4:【4x4矩陣描验,x、y坑鱼、z膘流、高度的部分】
translate.columns.3.z = -0.1:追蹤的位置是在3軸的z軸-0.1的位置

運行結(jié)果

下面我們不用程序默認的模型,我們來創(chuàng)建自己的模型鲁沥,直接代碼走起

1. 創(chuàng)建一個盒子模型呼股,并進行渲染。

        let scene = SCNScene()
        /// 我們創(chuàng)建幾何模型:盒子
        /// chamferRadius:圓角画恰,等于0時彭谁,說明是沒有圓角
        let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
        /// 創(chuàng)建節(jié)點,傳入幾何
        let boxNode = SCNNode(geometry: box)
        /// 對盒子進行渲染
        /// 創(chuàng)建渲染器
        /// material 渲染器
        let material = SCNMaterial()
        /// 渲染成紅色
        //material.diffuse.contents = UIColor.red
        /// 渲染一張照片
        material.diffuse.contents = UIImage(named: "brick.png")
        /// 渲染盒子
        box.materials = [material]
        /// 設(shè)置節(jié)點位置
        /// SCNVector3:三維【x,y.z]
        boxNode.position = SCNVector3(0,0,-0.2)
        /// 把結(jié)點放到根節(jié)點上
        scene.rootNode.addChildNode(boxNode)

        sceneView.scene = scene

運行效果


2. 創(chuàng)建球體模型允扇,再點擊球體后缠局,進行不同圖片的渲染。

@IBOutlet var sceneView: ARSCNView!
    
    let textures = ["earth.jpg","jupiter.jpg","mars.jpg","venus.jpg","IMG_0008.jpg"]
    private var index = 1
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true
        
        let scene = SCNScene()
        /// 我們創(chuàng)建幾何模型:球體
        let sphere = SCNSphere(radius: 0.1)
        /// 渲染
        let material = SCNMaterial()
        material.diffuse.contents = UIImage(named: "earth.jpg")
        sphere.materials = [material]
        /// 創(chuàng)建節(jié)點
        let sphereNode = SCNNode(geometry: sphere)
        sphereNode.position = SCNVector3(0,0,-0.5)
        scene.rootNode.addChildNode(sphereNode)
        
        sceneView.scene = scene
         /// 創(chuàng)建手勢
        registerGestureRecognizers()
    }
    
    func registerGestureRecognizers(){
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped))
        self.sceneView.addGestureRecognizer(tapGestureRecognizer)
    }
    
    @objc func tapped (recognizer: UIGestureRecognizer){
        /// 獲取ARSCNView
        let sceneView = recognizer.view as! ARSCNView
       /// 手勢點擊的位置
        let touchLoaction = recognizer.location(in: sceneView)
       /// 獲取點擊之后的結(jié)果
        let hitRersults = sceneView.hitTest(touchLoaction, options: [:])

        if  !hitRersults.isEmpty {
            if index == self.textures.count {
                index = 0
            }
            guard let hitRersult = hitRersults.first else {
                return
            }
          /// 更改渲染的圖片
            let node = hitRersult.node
            node.geometry?.firstMaterial?.diffuse.contents = UIImage(named: textures[index])
            
            index += 1
        }
    }

運行效果


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末考润,一起剝皮案震驚了整個濱河市甩鳄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌额划,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件档泽,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機鉴象,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門梨撞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渐北,你說我怎么就攤上這事阿逃。” “怎么了赃蛛?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵恃锉,是天一觀的道長。 經(jīng)常有香客問我呕臂,道長破托,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任歧蒋,我火速辦了婚禮土砂,結(jié)果婚禮上州既,老公的妹妹穿的比我還像新娘。我一直安慰自己萝映,他們只是感情好吴叶,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著序臂,像睡著了一般蚌卤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贸宏,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天造寝,我揣著相機與錄音,去河邊找鬼吭练。 笑死诫龙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鲫咽。 我是一名探鬼主播签赃,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼分尸!你這毒婦竟也來了锦聊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤箩绍,失蹤者是張志新(化名)和其女友劉穎孔庭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體材蛛,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡圆到,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卑吭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芽淡。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖豆赏,靈堂內(nèi)的尸體忽然破棺而出挣菲,到底是詐尸還是另有隱情,我是刑警寧澤掷邦,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布白胀,位于F島的核電站,受9級特大地震影響抚岗,放射性物質(zhì)發(fā)生泄漏纹笼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一苟跪、第九天 我趴在偏房一處隱蔽的房頂上張望廷痘。 院中可真熱鬧蔓涧,春花似錦、人聲如沸笋额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兄猩。三九已至茉盏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枢冤,已是汗流浹背鸠姨。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淹真,地道東北人讶迁。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像核蘸,于是被迫代替她去往敵國和親巍糯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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

  • Introducing ARKit iOS 11 引入 ARKit客扎,這是 個全新的框架祟峦,允許開發(fā)者輕松地為 iP...
    沒八阿哥的程序閱讀 2,404評論 1 9
  • ARkit Introducing ARKit iOS 11引入ARKit,這是 個全新的框架徙鱼,允許開發(fā)者輕松地為...
    坤哥愛卿閱讀 1,325評論 0 1
  • ARKit ARKit框架通過集成iOS設(shè)備攝像頭和運動功能宅楞,在您的應(yīng)用程序或游戲中產(chǎn)生增強現(xiàn)實體驗。 概述 增強...
    暗夜夜夜行路閱讀 5,784評論 0 17
  • 從小喜愛繪畫袱吆,之前家里有多余的彩色鉛筆咱筛,本著不浪費的原則開始了手繪彩鉛,順手書店活動價買了本手繪書杆故,不過也就是過程...
    鯉迷心竅閱讀 999評論 1 1
  • ——讀《追風箏的人》有感 我其實很反感讀國外的小說处铛,那拗口的名字和不一樣的文化背景,很難讓人有入境感拐揭。不過撤蟆,《偷影...
    愛君如初閱讀 287評論 0 0