ARkit连载一之初识ARkit

AR技术

增强现实(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。

一个最简单地AR场景实现所需要的技术以及步骤包含如下
1.多媒体捕捉现实图像:如摄像头
2.三维建模:3D立体模型
3.传感器追踪:主要追踪现实世界动态物体的六轴变化,这六轴分别是X、Y、Z轴位移及旋转。其中位移三轴决定物体的方位和大小,旋转三周决定物体显示的区域。
4.坐标识别及转换:3D模型显示在现实图像中不是单纯的frame坐标点,而是一个三维的矩阵坐标。这基本上也是学习AR最难的部分,好在ARKit帮助我们大大简化了这一过程。
5.除此之外,AR还可以与虚拟物体进行一些交互。

ARKit概述

1.ARKit是2017年6月6日,苹果发布iOS11系统所新增框架,它能够帮助我们以最简单快捷的方式实现AR技术功能。
2.ARKit框架提供了两种AR技术,一种是基于3D场景(SceneKit)实现的增强现实,一种是基于2D场景(SpriktKit)实现的增强现实
3.要想显示AR效果,必须要依赖于苹果的游戏引擎框架(3D引擎SceneKit,2D引擎SpriktKit),主要原因是游戏引擎才可以加载物体模型。
目前ARKit框架本身只包含相机追踪,不能直接加载物体模型
4.ARKit虽然是iOS11新出的框架,但并不是所有的iOS11系统都可以使用,而是必须要是处理器A9及以上才能够使用,苹果从iPhone6s开始使用A9处理器,也就是iPhone6及以前的机型无法使用ARKit

ARKit-app.png

ARKit-capture.png
ARKit-session.png

初识ARKit

1, 我们先创建一个AR3D项目

CreateApp1.png
CreateApp2.png

2, 项目中的代码

    @IBOutlet var sceneView: ARSCNView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true
        
        // Create a new scene
        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 the view's session
        sceneView.session.run(configuration)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        // Pause the view's session
        sceneView.session.pause()
    }

3, 代码中用到了哪些类

// 该视图可以绘制相机背景,提供和更新相机,管理锚点的节点,并更新照明
ARSCNView

// 该类用于描述3d场景。 它封装了一个节点层次结构
SCNScene

/* 
继承自ARConfiguration。ARConfiguration用于描述和配置在ARSession中使用的增强现实技术。
不过苹果建议使用ARWorldTrackingConfiguration。
世界跟踪提供设备的6个自由度跟踪(X、Y、Z轴位移及旋转)
通过在场景中查找特征点,世界跟踪可以对框架执行命中测试(hitTest)。
会话暂停后,无法继续追踪。
*/
ARWorldTrackingConfiguration

/*
在设备上配置并运行不同的增强现实技术。在视图中用于更新场景。
*/
ARSession

这些类都非常重要,需要特别指出的是SCNScene并不是ARKit中的类,而是SceneKit中的类。

4, 归类总结与实战
ARKit主要跟设备有关,主要作用是跟踪摄像头,【获取现实中的图像与3D建模应该也是该框架完成的】。而整个3D场景由SceneKit解决。
下面给出两张图,再做一个demo应该就差不多能达到初识程度了。


ARKit-api.png

ARKit & SceneKit-api.png

demo:在现实中添加一个星球。通过手指点击,可切换星球,通过手指移动能移动星球。代码详情:https://github.com/taoGod/ARKit1.git

demo.gif
    override func viewDidLoad() {
        super.viewDidLoad()

        // 1、创建scene
        let scene = SCNScene()
        
        // 4、创建几何形
        let sphere = SCNSphere(radius: 0.1)
        
        // 5、制作几何形的材料
        let material = SCNMaterial()
        material.diffuse.contents = UIImage(named: "earth")
        sphere.materials = [material]
        
        // 3、创建节点,设置节点位置,添加进scene
        node = SCNNode(geometry: sphere)
        node.position = SCNVector3(0, -0.05, -0.5)
        scene.rootNode.addChildNode(node)
        
        // 2、将scene设置为sceneView的scene
        sceneView.scene = scene

        // 添加手势
        let tapGes = UITapGestureRecognizer(target: self, action: #selector(tapGesAction(_:)))
        sceneView.addGestureRecognizer(tapGes)
    }

    @objc fileprivate func tapGesAction(_ tapGes: UITapGestureRecognizer) {
        let sceneView = tapGes.view as! ARSCNView
        let touchLocation = tapGes.location(in: sceneView)
        let hitResults = sceneView.hitTest(touchLocation, options: [:])
        
        if !hitResults.isEmpty {
            if currentIndex == imageNames.count {
                currentIndex = 0
            }
            
            guard let hitResult = hitResults.first else {return}
            
            let node = hitResult.node
            node.geometry?.firstMaterial?.diffuse.contents = UIImage(named: imageNames[currentIndex])
            
            currentIndex += 1
        }      
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        // 平面移动
        guard let touch = touches.first else {
            return
        }
        let preLocation = touch.previousLocation(in: sceneView)
        let location = touch.location(in: sceneView)

        let x = Float(location.x - preLocation.x)
        let y = Float(location.y - preLocation.y)

        let position = node.position
        node.position = SCNVector3(position.x + x/1000, position.y - y/1000, -0.5) // 垂直方向是反的
    }

ARSCNView.hitTest:可通过获取屏幕的一个点所在一条线上的所有节点
SCNVector3:三分量矢量的表示。在这里描述节点的3D位置。
SceneKit使用三分量向量用于各种目的,例如描述节点或顶点位置,表面法线,缩放或平移变换。 应该根据使用向量的上下文来解释不同的向量组件。

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

推荐阅读更多精彩内容

  • ARKit ARKit框架通过集成iOS设备摄像头和运动功能,在您的应用程序或游戏中产生增强现实体验。 概述 增强...
    暗夜夜夜行路阅读 5,777评论 0 17
  • 一、AR简介: 增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及...
    rectinajh阅读 2,060评论 0 6
  • 一、AR简介: 多媒体捕捉现实图像:如摄像头 三维建模:3D立体模型 传感器追踪:主要追踪现实世界动态物体的六轴变...
    DeerRun阅读 1,409评论 0 2
  • <!DOCTYPE html> Document #myDiv{width:200px;height:2...
    wanjunjie阅读 157评论 0 0
  • 作者:克里斯·安德森 读后感:内容很新的一本书,给人启发的一本书。 在那供给不足的年代,我们只能在有限的货架上找到...
    小开心的一家阅读 3,594评论 1 2