ARKit&SceneKit
首先看一下官方描述(学习ios开发真的要多看原文档,帮助很大)
ARKit:整合iOS设备相机和运动功能,在您的应用程序或游戏中产生增强现实体验。
SceneKit:使用高级场景描述创建3D游戏并将3D内容添加到应用程序中。轻松添加动画、物理模拟、粒子效果和逼真的物理渲染。
简单来说,就是ARKit通过相机捕捉真实世界的信息,而SceneKit来在真实世界中加载物体模型。
图片来源https://blog.csdn.net/aa841538513/article/details/78196601
实现过程:通过相机获取真实世界情况,以用户相机为起点,检测水平面和锚点,这个锚点就是用来放置虚拟物品的位置,再由SceneKit来生成对象。
AR实现模版
知识点比较分散,所以我想结合实际操作来理清AR实现的步骤。
首先创造一个AR项目,选择Augmented Reality App
Content Technology选择SceneKit
可以看到这些项目文件
其他的文件就不多说了,这个art.scnassets文件中存的就是你的3d模型,textur里存的是3d模型的贴图,也就是皮肤,而ship.scn中存的是3d模型的节点,可以通过给节点附加位置,灯光等其他可以显示出的内容,呈现出来的效果也会不同
接下来回到代码,这是模型中给的全部代码和运行后的情况
//
// ViewController.swift
// ARKit study
//
// Created by mac on 2022/10/14.
//
import UIKit
import SceneKit
import ARKit
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneView.delegate = self
/// 显示视频统计信息-用于调试
sceneView.showsStatistics = true
// 创建一个写死的3d模型
let scene = SCNScene(named: "art.scnassets/ship.scn")!
// 把写死的3D模型放到场景view(现实环境)中去
sceneView.scene = scene
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Create a session configuration
let configuration = ARWorldTrackingConfiguration()
// 运行session
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// 暂停session
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
}
}
1.showsStatistics属性就是设置显示图片左下角的fps
2.
ARSession
对象协调ARKit代表您执行的主要进程,以创建增强现实体验,简而言之就是控制AR的进程。3.Anchor-一个包含真实世界位置,方向,大小等信息的东西,可用来放3D模型以便和真实世界无缝衔接。
当设定了configuration里面的平面检测之后,session会自动添加Anchor(也就是说系统会自动帮我们检测平面并把检测到的平面的位置,大小,方向等信息放在Anchor这个参数里)
4.ARSCNViewDelegate里的方法就是可以实现将对象放到ARSession跟踪的ARANchor锚点上
5.configuration设置为ARWorldTrackingConfiguration世界追踪,配置决定了session以什么方式运行。世界追踪用于跟踪设备相对于环境中对象的位置,这种跟踪可以创造身临其境的AR体验:虚拟对象似乎相对于现实世界保持在同一位置,即使用户倾斜设备以查看物体的上方或下方,或移动设备以查看对象的侧面和背面。在代码中,我们把它配置在willappear或者didappear中提前配置好,再run运行。