玩转ARKit_01初体验

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打开下载安装较为方便

废话不多说,先来几张效果图
  • 系统提供的飞机模型
玩转ARKit_01初体验_第1张图片
IMG_1937.PNG
  • 立方体
玩转ARKit_01初体验_第2张图片
IMG_1942.PNG
  • 球体
玩转ARKit_01初体验_第3张图片
IMG_1944.PNG

猝不及防 - 实战开始

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


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

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

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

3D世界的坐标系

玩转ARKit_01初体验_第8张图片
屏幕快照 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()
   }
实现效果
玩转ARKit_01初体验_第9张图片
IMG_1935.PNG

总结

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

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

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

联系我

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

欢迎点赞/拍砖

邮箱 [email protected]
QQ 351795515

你可能感兴趣的:(玩转ARKit_01初体验)