iOS11 ARKit技术漫谈(1)-基础

iOS11出来也有一段时间了,其中ARKit框架还是比较有吸引力的。就想用点时间学习一下,来做点好玩的东西。毕竟有难度必有所得嘛。
既然有方向了,那就给自己一个目标吧,这样学习起来才有动力和目的。我的目标就是使用ARKit框架实现类似于汤姆猫说话,在我们公司移动办公平台智能语音聊天的基础上,实现虚拟现实中和一个小人进行聊天。

这一章主要讲基础知识,来实现一个简单的AR中添加一个正方形。

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

设备要求

要运行ARKit,在硬件上需要具备A9及以上的处理器,也就是iPhone6s以上的手机才可以支持AR。

我们在做程序时,最好判断是否支持ARKit,如果你的项目就是基于ARKit的,可以在Required Device capabilities中添加如下UIRequiredDeviceCapabilities:

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

如果设备不支持的话就会显示这个:


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
        }

软件要求

需要运行xcode 9.0 和 IOS 11 SDK

1. AR工作流程

1506653219921683.jpeg

其中蓝色表示 ARKit 负责的部分,绿色表示 SceneKit 负责的部分。当然,建立虚拟世界也可以使用其他的框架,比如 SpriteKit、Metal,本文将以 SceneKit 为例子进行讲解。

  1. 首先,ARKit 利用摄像头拍摄现实场景的画面,然后 SceneKit 用来建立虚拟世界。
  2. 建立好了以后,ARKit 负责将现实世界和虚拟世界的信息融合,并渲染出一个 AR 世界。
  3. 在渲染的同时,ARKit 要负责以下三件事:
  • 维持世界追踪。指的是当你移动摄像头,要去获取新的现实世界的信息。
  • 进行场景解析。指的是解析现实世界中有无特征点、平面等关键信息。
  • 处理与虚拟世界的互动。指的是当用户点击或拖动屏幕时,处理有没有点击到虚拟物体或者要不要进行添加/删除物体的操作。

2. ARKit 和 SceneKit 关系图

1506653305405397.png

这些类可以查看第一个参考文章,我也是记录一下,方便以后查看

3 实现一个简单的demo

  1. 创建一个ARDemo的project, 基于swift语言
  2. 在Info.plist中添加Camera Usage Description的相机权限。
  3. 点击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()  //添加一个立方体
        addTapGestureToSceneView() //添加一个点击手势,可以根据手势的坐标来进行立方体的拖动
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let configuration = ARWorldTrackingConfiguration() //初始化一个名为AR的配置,进行世界跟踪的配置,用来跟踪设备的方向和位置。也可以通过设备的相机检测现实世界的表面。
        sceneView.session.run(configuration)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        sceneView.session.pause()   //停止跟踪视图内容的运动和处理图像
    }
 
    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. 创建一个节点,把box加入到geomety(几何结构)中
        let boxNode = SCNNode()
        boxNode.geometry = box
        boxNode.position = SCNVector3(x, y, z) //正x在右边,负x在左边。正y是向上,负y是向下。正z是向后,负z是向前的。我们是设置的向前0.2米
        
       //2. 初始化SCNScene对象,把上面的节点加入到scene的根节点上
        let scene = SCNScene()
        scene.rootNode.addChildNode(boxNode)
        //3. 把scene对象加入到我们的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代码

就可以实现一个简单的VR程序。



知行办公,专业移动办公平台https://zx.naton.cn/
【总监】十二春秋之,3483099@qq.com
【Master】zelo,616701261@qq.com
【运营】运维艄公,897221533@qq.com;****
【产品设计】流浪猫,364994559@qq.com
【体验设计】兜兜,2435632247@qq.com
【iOS】淘码小工,492395860@qq.comiMcG33K,imcg33k@gmail.com
【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com
【java】首席工程师MR_W,feixue300@qq.com
【测试】土镜问道,847071279@qq.com
【数据】fox009521,42151960@qq.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容