ARKit和SceneKit

ARKit&SceneKit

首先看一下官方描述(学习ios开发真的要多看原文档,帮助很大)

ARKit:整合iOS设备相机和运动功能,在您的应用程序或游戏中产生增强现实体验。

SceneKit:使用高级场景描述创建3D游戏并将3D内容添加到应用程序中。轻松添加动画、物理模拟、粒子效果和逼真的物理渲染。

简单来说,就是ARKit通过相机捕捉真实世界的信息,而SceneKit来在真实世界中加载物体模型。

img1

图片来源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运行。 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值