玩转ARKit_01初体验
2017-09-03 本文已影响318人
cmfish
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打开下载安装较为方便
废话不多说,先来几张效果图
-
系统提供的飞机模型
-
立方体
-
球体
猝不及防 - 实战开始
-
Xcode9 新建AR项目 如图两步就OK了
屏幕快照 2017-09-03 15.42.51.png
此刻只需要运行你的Xcode就ok了 ,没意外你就能看到图一的场景了 ,这么简单就没了,当然不是,我们要做的是在虚拟现实中多创建几个节点,细心的同学就会看到第一张图的左下角有个不明物体
首先来熟悉一下即将出现的陌生类
-
ARSCNView 用来显示3D模型的视图视图容器
-
SCNScene 3D的场景
-
ARSessionConfiguration 增强现实的配置会话
-
ARWorldTrackingSessionConfiguration全球配置追踪 比较重要 ARKit常用类
-
SCNPlane 平面
-
SCNNode 节点 在虚拟世界里面 万物皆节点
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-