ARKit初体验

第一:什么是AR

  • 增强现实AR, 将2D或者3D的元素添加到相机的实时视图中, 就好像 这些元素居住在现实世界中;
  • ARKit结合了设备运动跟踪,相机场景拍摄,高级场景处理和显示,简化了AR体验的任务,这是官方的解释: 就是让虚拟内容是真实世界的一部分的错觉。

第二:开发AR

  • 首先要开发AR, 需要具备A9以上的芯片设备,iPhone6S以上。
    如果app是以AR开发为主的:请使用应用程序Info.plist中ARKit的UIRequiredDeviceCapabilities部分中的键。
    如果增强现实是应用程序的辅助功能,使用isSupported 来判断是否支持设备。
  • 其次要理解一个概念: 在所有AR体验中,ARKit使用坐标系,遵循:y轴向上,z轴指向观察者,x轴指向观看者的右侧。右手系坐标原则:
    vy6F7b.jpg

    这里有篇文章写的很好 关于MAC, IOS的坐标系。

创建工程

选择AR.png
点击Next
WX20171018-180443@2x.png
Content Technology中,有三个选项:

  • SceneKit: SceneKit底层实现使用Metal和OpenGL, 苹果这个封装狂魔封装起来的一套高性能3D图形框架;

  • SpeiteKit: SpeiteKit是Ios7引入的一套主要开发2D游戏的框架, 通过支持自定义OpenGL ES着色器和照明,可以与SceneKit集成;

  • Metal: Metal是一套直接访问图形处理单元(GPU)编程的高效框架, 非常底层, 接近Metal(金属板了);

最后点击next创建好工程:

运行后会通过摄像机看到有一个3D的立体模型出现在眼前, 再看代码:

class ViewController: UIViewController, ARSCNViewDelegate {//VC遵循ARSCNView代理
    @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()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
    }
}
通过代码了解一些基本概念。
  • SCNView: 主要是显示SceneKit的3D模型, 显示3D场景,继承自UIView; showsStatistics 是否显示统计数据, 场景中最下面的绿条
  • ARSCNView:将相机捕捉到的界面作为3D场景,继承自SCNView
  • ARSession:管理相机设备和AR体验所需要的处理的对象,包括从设备的运动感测硬件读取数据,控制设备的内置相机,以及对捕获的相机图像执行图像分析。会话综合了所有这些结果,以建立设备居住的真实世界空间与模拟AR内容的虚拟空间之间的对应关系。简单来说调动现实硬件, 结合虚拟软件,建立关系。通过ARSCNView管理这个会话。
  • ARCamera:被称为照相机,通过照相机捕捉真实世界的图像。被ARSession调用。
  • SCNScene:就是在是视图上所需要放置的场景, 万物皆场景。是SCNView的属性;
  • SCNNode:称为节点,场景是由无数个节点组成, 他有自己的位置和坐标系统,我们会把几何模型, 灯光效果等添加到节点上, 又称万物皆节点。每一个Scene都有一个跟节点rootNode。
  • ARConfiguration:AR会话配置的的抽象基类:它可以增加AR体验,设置了配置对象的属性,并将配置传递给会话的方法。
    要运行ARSession,首先创建一个具体的ARConfiguration子类的实例:
    ARKit包括以下具体配置类:
    ARWorldTrackingConfiguration
    提供高品质的AR体验,使用后置摄像头精确跟踪设备的位置和方向,并允许平面检测和打击测试。
    AROrientationTrackingConfiguration
    提供使用后置摄像头并仅跟踪设备方向的基本AR体验。
    ARFaceTrackingConfiguration
    提供使用前置摄像头并跟踪用户脸部的移动和表情的AR体验。
    总结如下图:
    A548B070-4849-43C4-9756-39CB182B8469.png
通过代码和概念:可以总结启动AR的步骤:
  1. 通过ARSCNView加载SCNScene场景;
  2. SCNScene启动相机ARCamera捕捉现实场景;
  3. 捕捉场景后ARSCNView将场景数据传递给ARSession;
  4. ARSession通过管理ARSessionConfiguration实现场景追踪;
  5. 给ARSCNView的scene添加一个子节点(3D物体模型);

写一个简单Demo, AR播放视频

  1. 给一个本地的视频url:
override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        sceneView.showsStatistics = false;
        
        //本地视频URL
        let bundlePath = Bundle.main.url(forResource: "驯龙记.mp4", withExtension: nil)
        
        //首先创建一个创景:
        let scene = SCNScene()

        //创建一个平面的几何
        let plane = SCNPlane.init(width: 0.664, height: 0.375);
        
        //初始一个渲染器
        let materials = SCNMaterial()
        
        //创建player
        let player = AVPlayer.init(url: bundlePath!)
        
        //渲染器扩散接受内容
        materials.diffuse.contents = player
        
        //设置渲染器
        plane.materials = [materials]
        
        //设置节点
        let node = SCNNode(geometry: plane)
        
        //节点位置
        node.position = SCNVector3(0, 0, -1.0)
        
        //设置根节点
        scene.rootNode.addChildNode(node);
        
        //播放
        player.play()
        
        sceneView.scene = scene
        
    }
完成

其中

node.position = SCNVector3(0, 0, -1.0)

坐标z轴, 正值朝向观察者, 负值是正面可以观察到的;

渲染器接受到的内容:

materials.diffuse.contents  = ?
//可以是一种颜色(NSColor,UIColor,CGcolorRef)
//可以是图像(NSImage, UIImage, CGImageRef)
//可以是CALayer
//可以是路径 (NSString or NSURL)
//可以是场景SKScene  SKTexture
 //可以是二维码: AVCaptureDevice;( iOS 11以上)
//可以是AVPlayer;
//设置颜色的动画

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

推荐阅读更多精彩内容

  • 前言 苹果于9月20日推出了iOS 11,带来了AR(虚拟增强现实)功能。更新到Xcode 9之后就可以进行开发,...
    小毛纯一郎阅读 570评论 0 0
  • 转载请标注出处:http://blog.csdn.net/u013263917/article/details/7...
    Jonath阅读 458评论 0 1
  • 之前连续三年办欢乐谷年卡,那时计划着周末没事就带着依宝去玩,可以当做儿童游乐场来玩。事实是,三年,我们总共也没超过...
    景景相依阅读 158评论 0 0
  • 奶奶拿着一个袋子,我贼笑地跟在后面,奶奶说你帮我看着,没人我赶紧摘,有人我就不摘了,他家的枇杷都是长在路边的。到...
    阿肥想阿胖阅读 212评论 0 0
  • 其实这篇文章是专为大学生写的,社会上很多直销,之前我们都叫它传销,后来因为队伍的庞大,也无法一下子遏制,国家给...
    没有鸡汤阅读 6,206评论 23 18