ARKit----学习一
一.ARKit的简介
开始进入正题吧
ARKit在iOS 11上推出的一个AR移动平台,支持A9以上的处理器,不支持模拟器。ARKit使用相机捕捉现实世界,使用SceneKit,SpriteKit或者Metal显示3D模型
ARKit的简单显示流程,而且在任何SCNScene他都有一个RootNode,就是根节点
AR场景中一个模型的3D显示坐标
ARKit中渲染场景的过程如下:
1.ARSCNView加载场景SCNScene
2.SCNScene启动相机ARCamera开始捕捉场景
3.捕捉场景后ARSCNView开始将场景数据交给Session
4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
5.给ARSCNView的scene添加一个子节点(3D物体模型)
二.废话不多说,直接开始撸代码
1.新建项目工程,使用版本 xcode9.0 beta 手机系统 iOS 11 beta 9。在xcode中选择Augmented Reality App创建新的项目
2.创建完成之后在StoryBoard中视图中多出了一个ARSCNView
3.在ViewController中默认创建了ARCSCNView的一个连接,工程默认会加载一个飞机的模型在视图中显示
import UIKit import SceneKit import ARKit class ViewController: UIViewController, ARSCNViewDelegate { @IBOutlet var sceneView: ARSCNView! override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self
//显示帧率和配置信息 sceneView.showsStatistics = true let scene = SCNScene(named: "art.scnassets/ship.scn")! sceneView.scene = scene } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let configuration = ARWorldTrackingSessionConfiguration() sceneView.session.run(configuration) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) sceneView.session.pause() } // MARK: - ARSCNViewDelegate /* // Override to create and configure nodes for anchors added to the view's session. func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { let node = SCNNode() return node } */ func session(_ session: ARSession, didFailWithError error: Error) { // Present an error message to the user } func sessionWasInterrupted(_ session: ARSession) { // Inform the user that the session has been interrupted, for example, by presenting an overlay } func sessionInterruptionEnded(_ session: ARSession) { // Reset tracking and/or remove existing anchors if consistent tracking is required } }
4.添加自己的3D模型
/// 创建视图 func createSceneForView() { //初始化场景 let scene = SCNScene() //创建一个半径为0.1的球 let sphere = SCNSphere(radius: 0.1) //添加纹理 let material = SCNMaterial() //添加的内容可以是图片 颜色 gif 视频等等 material.diffuse.contents = UIImage(named:"earth") sphere.materials = [material] //创建节点 let sphereNode = SCNNode(geometry: sphere) //设置节点位置 sphereNode.position = SCNVector3(0,0,-0.5) //添加到根节点 scene.rootNode.addChildNode(sphereNode) //添加一个箱子 let boxSphere = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0) let boxMaterial = SCNMaterial() boxMaterial.diffuse.contents = UIImage(named:"brick") boxSphere.materials = [boxMaterial] let boxNode = SCNNode(geometry: boxSphere) boxNode.position = SCNVector3(0.4,0,-0.7) scene.rootNode.addChildNode(boxNode) mySCNView.scene = scene }
5.显示的AR效果
握不住的沙,干脆扬了它。