iOS AR 学习第3天 将虚拟内容集成到您的增强现实体验中

ARSCNView

将SceneKit的虚拟3D内容集成到您的增强现实体验中的视图。

Declaration

class ARSCNView : SCNView
复制代码

概述

“ARSCNView”类提供了创建增强现实体验的最简单方法,将虚拟3D内容与现实世界的设备相机视图相结合。当您运行视图提供的ARSession对象时:

-视图会自动将设备相机的实时视频提要渲染为场景背景。

-视图场景场景的世界坐标系统直接响应会话配置建立的AR世界坐标系统。

-视图会自动移动其SceneKit相机,以匹配设备的真实移动。

由于ARKit会自动将SceneKit空间与现实世界匹配,因此放置虚拟对象以使其似乎保持现实世界的位置只需要适当设置该对象的SceneKit位置。(请参阅使用SceneKit提供3D虚拟内容。)

您不一定需要使用ARAnchor类来跟踪您添加到场景的对象的位置,但通过实现ARSCNViewDelegate方法,您可以将SceneKit内容添加到ARKit自动检测到的任何锚点。

基础知识

提供带有场景套件的3D虚拟内容

使用SceneKit为您的AR体验添加逼真的三维对象。

var session: ARSession

管理视图内容的运动跟踪和相机图像处理的AR会话。

var scene: SCNScene

要在视图中显示的SceneKit场景。

响应 AR 更新

var delegate: ARSCNViewDelegate?

您提供的对象,用于调解视图的AR场景信息与SceneKit内容的同步。

protocol ARSCNViewDelegate

您可以实现的方法来调解SceneKit内容与AR会话的自动同步。

将内容映射到现实世界的位置

func anchor(for: SCNNode) -> ARAnchor?

返回与指定的SceneKit节点关联的AR锚(如果有的话)。

func node(for: ARAnchor) -> SCNNode?

返回与指定的AR锚关联的SceneKit节点(如果有的话)。

func unprojectPoint(CGPoint, onPlane: simd_float4x4) -> simd_float3?

将点从2D视图投影返回到ARKit检测到的3D世界空间中的平面上。

使用SceneKit提供3D虚拟内容

使用SceneKit为您的AR体验添加逼真的三维对象。

Overview

由于ARKit会自动将SceneKit空间与现实世界匹配,因此放置虚拟对象以使其看起来保持现实世界的位置需要您适当设置对象的SceneKit位置。例如,在默认配置中,以下代码在相机初始位置前放置一个10厘米的立方体20厘米:

let cubeNode = SCNNode(geometry: SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0))cubeNode.position = SCNVector3(0, 0, -0.2) // SceneKit/AR coordinates are in meterssceneView.scene.rootNode.addChildNode(cubeNode)
复制代码

上面的代码将对象直接放置在视图的SceneKit场景中。该对象会自动显示跟踪现实世界的位置,因为ARKit将SceneKit空间与现实世界空间匹配。

或者,您可以使用ARAnchor类跟踪现实世界的位置,方法是自己创建锚并将其添加到会话中,或者观察ARKit自动创建的锚点。例如,当启用平面检测时,ARKit会为每个检测到的平面添加和更新锚点。要为这些锚添加视觉内容,请实现ARSCNViewDelegate方法,

ARWorldTrackingConfiguration

跟踪设备相对于环境中对象的位置的配置。

Declaration

class ARWorldTrackingConfiguration : ARConfiguration
复制代码

概述

“ARWorldTrackingConfiguration”类以六自由度(6DOF)跟踪设备的运动:三个旋转轴(滚动、俯仰和偏航)和三个翻译轴(以x、y和z为单位的移动)。

这种跟踪可以创造身临其境的增强现实体验:虚拟对象可能看起来相对于现实世界停留在同一个地方,即使用户倾斜设备查看对象的上方或下方,或移动设备以查看对象的侧面和背面。

图1无论设备旋转或移动如何,6DOF跟踪都会保持AR错觉

image.png

世界跟踪会话还为您的应用程序提供了几种识别相机可见的真实世界场景元素或交互的方式:

-使用planeDetection查找现实世界的水平或垂直表面。将表面作为ARPlaneAnchor对象添加到会话中。

-使用detectionImages识别和跟踪2D图像的移动。将2D图像作为ARImageAnchor对象添加到场景中。

-使用detectionObjects识别3D对象。将3D对象作为ARObjectAnchor对象添加到场景中。

-通过光线投射找到与设备屏幕上的接触点对应的现实功能的3D位置。

ARSession

管理与每次增强现实体验相关的主要任务的对象,如运动跟踪、相机直通和图像分析。

Declaration

class ARSession : NSObject
复制代码

概述

“ARSession”对象协调ARKit代表您执行的主要进程,以创建增强现实体验。这些过程包括从设备的运动感应硬件读取数据,控制设备的内置相机,并对捕获的相机图像进行图像分析。会话综合了所有这些结果,以便在设备居住的现实世界空间与您建模AR内容的虚拟空间之间建立对应关系。

创建会话

每个AR体验都需要一个“ARSession”。如果您实现自定义渲染器,则自行实例化会话。

let session = ARSession()
session.delegate = self
复制代码

如果您使用标准渲染器之一(如ARViewARSCNViewARSKView)),渲染器将为您创建一个会话对象。当您想与应用程序的会话交互时,您可以在应用程序的渲染器上访问它。

let session = myView.session
复制代码

运行会话

运行会话需要配置。ARConfiguration的子类决定了ARKit如何跟踪设备相对于现实世界的位置和运动,从而决定了您创建的AR体验类型。例如,ARWorldTrackingConfiguration允许您通过设备的后置摄像头增强用户对周围世界的视图。

配置和运行会话

func run(ARConfiguration, options: ARSession.RunOptions)

使用指定的配置和选项开始会话的AR处理。

var identifier: UUID

正在运行会话的唯一标识符。

struct ARSession.RunOptions

更改配置时转换AR会话当前状态的选项。

var configuration: ARConfiguration?

定义会话运动和场景跟踪行为的对象。

func pause()

在会话中暂停处理。

image.png

Guess you like

Origin juejin.im/post/7031801215885246500