美文网首页iOSARKit专题
玩转ARKit_01初体验

玩转ARKit_01初体验

作者: cmfish | 来源:发表于2017-09-03 16:24 被阅读318次

    ARKit介绍

    是什么?

    • ARKit是2017年6月6日,苹果发布iOS11系统所新增框架,它能够帮助我们以最简单快捷的方式实现AR技术功能。

    • ARKit框架提供了两种AR技术,一种是基于3D场景(SceneKit)实现的增强现实,一种是基于2D场景(SpriktKit)实现的增强现实

    对ARKit不是很了解的伙伴可以移步这里。传送门

    ARKit官方文档翻译 http://www.jianshu.com/p/e373f7f96b5c

    做什么?

    • 通过摄像头和虚拟世界进行联通,改变人机的交互方式。

    怎么做?

    开发环境介绍
    • Xcode9(最新版的是Xcode9 beta6 如果是最新Xcode 要macOS High Sierra 10.12.6版本)
    • A9硬件iOS手机设备从6s开始使用
    • ios 11 下载地址 https://developer.apple.com/download/ 升级iOS11时可用手机Safari打开下载安装较为方便
    废话不多说,先来几张效果图
    • 系统提供的飞机模型
    IMG_1937.PNG
    • 立方体
    IMG_1942.PNG
    • 球体
    IMG_1944.PNG

    猝不及防 - 实战开始

    • Xcode9 新建AR项目 如图两步就OK了


      屏幕快照 2017-09-03 15.42.51.png
    屏幕快照 2017-09-03 15.43.16.png
    此刻只需要运行你的Xcode就ok了 ,没意外你就能看到图一的场景了 ,这么简单就没了,当然不是,我们要做的是在虚拟现实中多创建几个节点,细心的同学就会看到第一张图的左下角有个不明物体

    首先来熟悉一下即将出现的陌生类

    • ARSCNView 用来显示3D模型的视图视图容器
    • SCNScene 3D的场景
    • ARSessionConfiguration 增强现实的配置会话
    • ARWorldTrackingSessionConfiguration全球配置追踪 比较重要 ARKit常用类
    • SCNPlane 平面
    • SCNNode 节点 在虚拟世界里面 万物皆节点
    屏幕快照 2017-09-03 16.18.20.png 屏幕快照 2017-09-03 14.50.08.png

    3D世界的坐标系

    屏幕快照 2017-09-03 14.49.12.png

    代码如下

    实现 : 对飞机模型的AR场景 进行截图 在增强现实的场景中创建多个节点(模型)

    Tip - 在虚拟世界中万物皆模型

    步骤
    • 1.判断能不能获取到当前的Frame
    • 2.创建一张截图
    • 3.对创建的图片进行截图
    • 4.通过截图创建一个节点并加到AR场景的根节点上
    • 5.追踪相机的位置
    //
    //  ViewController.swift
    //  ARKit初体验
    //
    //  Created by cwb on 2017/9/1.
    //  Copyright © 2017年 cwb. All rights reserved.
    //
    
    import UIKit
    import SceneKit
    import ARKit
    
    class ViewController: UIViewController, ARSCNViewDelegate {
       
       //用来展示3D模型的视图
       @IBOutlet var sceneView: ARSCNView!
       
       override func viewDidLoad() {
           super.viewDidLoad()
           
           // Set the view's delegate
           //设置3D场景视图的的代理
           sceneView.delegate = self
           
           // Show statistics such as fps and timing information
           //显示统计数据 如fps
           sceneView.showsStatistics = true
           
           // Create a new scene
           //创建一个场景 named: "art.scnassets/ship.scn" 读取一个模型
           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)
           
           
           //创建一个手势
           
          let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.creatImageNode(tapGesture:)))
           view.addGestureRecognizer(tapGesture)
       }
       
       @objc func creatImageNodeWithTap(tapGesture:UITapGestureRecognizer) -> () {
           /*
            实现 : 对飞机模型的AR场景 进行截图 在增强现实的场景中创建多个节点(模型) 在虚拟世界中万物皆模型
            1.判断能不能获取到当前的Frame
            2.创建一张截图
            3.对创建的图片进行截图
            4.通过截图创建一个节点并加到AR场景的根节点上
            4.追踪相机的位置
            
            */
           //守护  如果满足条件就往下执行 否则执行 return语句
           guard let currentFrame = sceneView.session.currentFrame else {
               return
           }
           
           //  创建一张图片
           //SCNPlane
           //  A rectangular, one-sided plane geometry of specified width and height.   API
           //翻译 SCNPlane创建的对象是一个有指定宽高的平面矩形
           let imagePlane = SCNPlane(width: sceneView.bounds.width / 8000, height: sceneView.bounds.height / 8000)
           //  渲染图片
           /*
            SCNMaterial 渲染器
            API  A set of shading attributes that define the appearance of a geometry's surface when rendered.
            翻译  用来定义 几何表面被渲染时候的阴影属性
            firstMaterial 获取几何上的第一个渲染物
            diffuse
            Specifies the receiver's diffuse property
            diffuse 接收特定的属性
            */
       /*
        lightingModel  环境的光感变量 (以下来自百度翻译和自己的理解 不足及错误之处请指正)
    
        blinn:
        Shading that incorporates ambient, diffuse, and specular properties, where specular highlights are calculated using the Blinn-Phong formula.
    
        阴影包含三个要素 : 环境 漫射 和 镜面 blinn属性是用Blinn-Phong公式计算的高光效果
        constant:
        Uniform shading that incorporates ambient lighting only.
        均匀的环境  只包含了光线
    
        lambert:
        Shading that incorporates ambient and diffuse properties only.
        仅包含环境属性和漫射属性
    
        phong:
    
        Shading that incorporates ambient, diffuse, and specular properties, where specular highlights are calculated using the Phong formula.
        明暗结合环境,扩散,和镜面反射特性,在高光使用Phong公式计算
        physicallyBased:
        Shading based on a realistic abstraction of physical lights and materials.
        基于物理光线和材质的真实抽象的阴影。
        */
           // 在创建的图片平面上截屏
           imagePlane.firstMaterial?.diffuse.contents = sceneView.snapshot()
           imagePlane.firstMaterial?.lightingModel = .constant  
           //   在图片的几何平面上創建一個節點
           let planNode = SCNNode(geometry: imagePlane)
           //把该节点添加到AR场景的根节点上
           sceneView.scene.rootNode.addChildNode(planNode)
           //      追蹤相機的位置 (参考z轴)
           /*
            4X4的矩阵
            matrix_identity_float4x4
            columns.3.z  3代表3轴 xyz
            */
           var translate = matrix_identity_float4x4
           //在z轴的-0.1米的方向  在面前能显示  正数的话显示在后脑勺
           translate.columns.3.z = -0.1
           //      追蹤相機的位置
           //把截图显示在相机的前方10公分处
           planNode.simdTransform = matrix_multiply(currentFrame.camera.transform, translate)
       }
     
       override func viewWillDisappear(_ animated: Bool) {
           super.viewWillDisappear(animated)
    
           // Pause the view's session
    
           //暂停追踪
           sceneView.session.pause()
       }
    
    实现效果
    IMG_1935.PNG

    总结

    • 简单粗暴的实现了对系统的飞机模型的增强现实世界的截屏,并把得到的平面几何作为一个新的节点现实在场景中。

    • 效果图中的正方体和球体由于篇幅问题代码未贴出,用到了SCNBox(正方体),和SCNSphere(球体)

    • 代码下载地址 https://github.com/ichenwanbing/ARKit-

    联系我

    需要资料的可以私信我或直接邮箱/QQ

    欢迎点赞/拍砖

    邮箱 ichenwanbing@163.com
    QQ 351795515

    相关文章

      网友评论

        本文标题:玩转ARKit_01初体验

        本文链接:https://www.haomeiwen.com/subject/wwcjjxtx.html