簡介
增強現實技術(Augmented Reality,簡稱 AR),是一種實時地計算攝影機影像的位置及角度並加上相應圖像、視頻、3D模型的技術,這種技術的目標是在屏幕上把虛擬世界套在現實世界並進行互動。
ARKit是基於AVFoundation框架和CoreMotion框架的
所需
- A9以上設備 (不支持模擬器)se 6s 6sp 7 7p
- xcode9 bates,iOS11,xcode9
特性
- 追蹤:追蹤現實和虛擬場景
- 全局追蹤:追蹤現實場景和虛擬場景,就像真實的存在現實中
- 視覺慣性測距VIO:肉眼看到效果,遠離所需,拉近放大
- 沒有外部設置:不需要外部設備(投影儀等)
- 場景理解:
- 平面監測:現實世界都是有細小的平面構成
- 命中測試:兩個物件發生接觸,產生一些反應
- 光估計:用光照的方法,讓物體更逼真。比如影子
- 渲染
- 簡單集合:用xcode自帶的可以實現渲染。SceneKit(iOS8出現、3d場景)、SpriteKit(iOS7出現,2d場景)2D、Metal(iOS7出現,不支持模擬器)
- AR視圖:ARview,物件以arView的形式出現
- 自定義渲染:可以使用其他引擎渲染,支持(Unity、Unreal)
運行原理
相機捕捉顯示世界->arkit
顯示3D模型->SceneKit
通過AR回話->ARSession使兩者交互
座標
x,y,z
是以相機的位置爲中心,所以軸的負值標識我們正前方,正值表示我們的後方(後腦勺)
單位是米
ARSession
- 使用之前設置一個追蹤ARSessionConfiguration(來追蹤設備方向的基本配置)
- 通過run方法啓用
- 來處理是用來管理設備相機的共享對象(AVCaptureSession)和增強現實所需的處理(CMMotionmanager)
- 最終生成一個一個的frame展示
基本步驟
- ARSCNView加載場景SCNScene
- SCNScene啓動相機ARCamera開始捕捉場景
- 捕捉場景後ARSCNView開始將場景數據交給Session
- Session通過管理ARSessionConfiguration實現場景的追蹤並且返回一個ARFrame
- 給ARSCNView的scene添加一個子節點(3D物體模型)
入門掌握四大基礎點
- 幾何
- 節點
- 渲染
- 手勢
demo
- 用到的關鍵類:
- 場景視圖(ARSCNView)
- 場景(SCNScene)
- 幾何(SCNGeometry)
- 節點(SCNNode)
- 渲染器(SCNMaterial)
- 如何在空間中放一個平面
- 創建場景視圖 ARSCNView,設置代理
- 創建一個場景 SCNScene,給場景視圖綁定場景
- 創建一個平面幾何形狀 (box,plane)
- 基於幾何形狀創建一個節點SCNNode
- 創建一個渲染器SCNMaterial,用其對平面幾何進行渲染
- 添加節點到場景的根節點中
demo1
打開Xcode9bete版本,新建一個工程,選擇Augmented Reality APP(Xcode9新增),點擊next
選擇SceneKit
此時,Xcode會自動爲我們生成一段極其簡潔的AR代碼
效果圖後面補上
demo2
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
//1.設置場景代理
sceneView.delegate = self
// Show statistics such as fps and timing information
sceneView.showsStatistics = true
//2.創建場景
let scene = SCNScene()
//3.創建幾何
let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
//4. 渲染 渲染器可以決定怎樣渲染,這個 contents屬性可以設置很多東西,UILabel, UIImage,甚至 AVPlayer都可以
let material = SCNMaterial() //
material.diffuse.contents = UIColor.red
// material.diffuse.contents = UIImage(named: "brick.png")
//5.對幾何進行渲染
box.materials = [material]
// 6. 創建節點
let boxNode = SCNNode(geometry: box)
// 7.設置節點位置
boxNode.position = SCNVector3(0,0,-0.2)
// 8. 把節點放到根節點上
scene.rootNode.addChildNode(boxNode)
sceneView.scene = scene
}
這樣就能我們面前就有一個紅色的長寬高都是0.1m的正方體盒子