本文将演示ARKit增强现实框架的使用。
创建一个新的项目:【Create a new Xcode project】
->在打开的模板选择中,选择增强现实应用模板【Augmented Reality App】
->【Next】->【Product Name】:ARDemo 。保持其他参数不变
->【Next】->选择项目存放目录->【Create】
在左侧的文档框架区,点击查看模板自带的场景资源【art.scnassets】
在右侧的属性面板,可以看出场景的Y轴朝上,X轴朝右,Z轴向内。
并且三维模型优先使用同名的、压缩后的贴图。
在资源【art.scnassets】文件夹下,包含一个三维场景【ship.scn】,和一个贴图文件【texture.png】
点击打开三维场景【ship.scn】。
当前的三维场景拥有一驾喷气式飞机的三维模型,场景在默认情况下处于转盘模式。
点击右下角第一个图标,弹出操作列表,选择【Fly】
鼠标按下并向下方拖动,观察飞机模型的位置变化。
点击右下角第一个图标,弹出操作列表,选择【Arcball】轨迹球选项
鼠标按下并向下方拖动,观察飞机模型的位置变化。
点击右下角第一个图标,弹出操作列表,选择【Pan】平移选项
鼠标按下并向下方拖动,观察飞机模型的位置变化。
点击右下角第一个图标,弹出操作列表,选择【Truck】转向选项
鼠标按下并向右侧拖动,观察飞机模型的位置变化。
接着修改三维场景的【显示模式列表】,点击右下角第四个图标,
勾选列表中的【Wireframe】线框选项:使三维模型处于线框的显示状态。
勾选列表中的【Grid】网格选项:可以在三维场景中显示辅助的网格线。
在列表外部点击,关闭【显示模式列表】
接着修改三维场景的【视图类型】,点击左下角第四个图标,弹出【视图类型】列表
【Top】:顶视图,模拟摄像机从顶部向下看的效果。
【Bottom】:底视图
【Left】:左视图
【Right】:右视图
【Front】:前视图
【Back】:后视图
接着点击三维物体的贴图文件【texture.png】
在贴图文件中,包含了三维飞机模型在多个视图中的投影所对应的贴图。
接着点击故事版文件【Main.storyboard】
在故事版中包含了一个三维场景视图,点击选择该视图对象
打开右侧的属性设置面板。
三维场景视图同样拥有一些属性,可以设置它的名称、行为、渲染参数和动画参数等。
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
在视图加载完成的方法中,分别设置了:
1.三维场景视图的代理对象
2.统计状态
3.需要加载的三维场景
在视图即将显示或消失的方法中,对三维场景视图的会话周期,进行了不同方式的调用。
接着打开模拟器列表【ARDDemo>Generic iOS Device】
在列表里选择一款真机设备,将在真机设备上运行该应用程序。
运行程序后,点击允许应用程序访问设备。
此时在屏幕上显示了一个三维的飞机模型。
可以移动手机,在各个角度查看飞机的状态。
点击手机屏幕左下角打开状态面板。
在状态面板中显示了刷新率、面数等信息。
使用【Command】+【Tab】切换并打开浏览器软件
输入苹果提供的三维场景包的下载地址:
https://developer.apple.com/documentation/arkit/building_your_first_ar_experience
压缩包下载后,将自动解压并打开解压后的文件夹。
找到三维场景模型的资源文件Resources->Models.scnassets
将三维场景模型的资源文件夹拖动到自己的项目中
点击【Finish】确认文件夹的导入
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
重新修改一下三维场景的代码
1 import UIKit 2 import SceneKit 3 import ARKit 4 5 class ViewController: UIViewController, ARSCNViewDelegate { 6 7 @IBOutlet var sceneView: ARSCNView! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 // Set the view's delegate 13 //三维场景视图的代理对象 14 sceneView.delegate = self 15 16 // Show statistics such as fps and timing information 17 //统计状态 18 sceneView.showsStatistics = true 19 20 // Create a new scene 21 //需要加载的三维场景 22 //加载三维场景的代码,修改为已添加的三维场景模型的资源文件 23 let scene = SCNScene(named: "Models.scnassets/chair/chair.scn")! 24 25 // Set the scene to the view 26 sceneView.scene = scene 27 } 28 29 override func viewWillAppear(_ animated: Bool) { 30 super.viewWillAppear(animated) 31 32 // Create a session configuration 33 let configuration = ARWorldTrackingConfiguration() 34 // Run the view's session 35 sceneView.session.run(configuration) 36 } 37 38 override func viewWillDisappear(_ animated: Bool) { 39 super.viewWillDisappear(animated) 40 41 // Pause the view's session 42 sceneView.session.pause() 43 } 44 45 override func didReceiveMemoryWarning() { 46 super.didReceiveMemoryWarning() 47 // Release any cached data, images, etc that aren't in use. 48 } 49 50 //在视图即将显示或消失的方法中,对三维场景视图的会话周期,进行了不同方式的调用。 51 52 func session(_ session: ARSession, didFailWithError error: Error) { 53 // Present an error message to the user 54 55 } 56 57 func sessionWasInterrupted(_ session: ARSession) { 58 // Inform the user that the session has been interrupted, for example, by presenting an overlay 59 60 } 61 62 func sessionInterruptionEnded(_ session: ARSession) { 63 // Reset tracking and/or remove existing anchors if consistent tracking is required 64 65 } 66 }