【ARFoundation学习笔记】ARFoundation基础(上)

2023-11-05 20:44

本文主要是介绍【ARFoundation学习笔记】ARFoundation基础(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述


写在前面的话

本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏,更多详细内容请阅读原文。


本文从原文第二章开始

文章目录

  • ARFoundation的体系
    • Subsystem的使用
    • 跟踪子系统
  • ARSession & AR Session Origin
    • ARSession
      • ARSessionState
    • AR Session Origin
    • AR Camera
  • 小结


ARFoundation的体系

在这里插入图片描述

ARFoundation的整个体系建立在一系列的Subsystem(子系统)上,每个子系统对应实现不同的模块功能。由于不同的AR设备提供的SDK不同,因此ARfoundation的子系统类似于提供了一系列的接口让不同厂商可以在同一套应用标准下对接他们的AR设备。

在本系列中我们需要使用的主要是安卓的ARcore(Google play的AR服务)以及苹果的ARKit。第一次使用AR程序的demo在该书的第一章节已经给出。

当然,不同的厂商对应能提供的服务也不同,因此ARfoundation提供了SubsystemDescriptor让厂商们自行标识出那些子系统是可用的。


Subsystem的使用

所有的Subsystem都有四个生命周期:创建(Create),开始(Start),停止(Stop),销毁(Destroy)。通过获取状态来在程序中判断子系统的活动。

当然,要激活子系统,我们需要获取SubsystemDescriptor描述符来判断子系统是否可用。下列是一段示例代码:

1XRPlaneSubsystem CreatePlaneSubsystem()
2{
3// 得到所有可用的plane subsystems:
4var descriptors = new List<XRPlaneSubsystemDescriptor>();
5.     SubsystemManager.GetSubsystemDescriptors(descriptors);
6// 遍历获取一个支持boundary vertices的功能
7foreach (var descriptor in descriptors)
8{
9if (descriptor.supportsBoundaryVertices)
10{
11// 创建plane subsystem
12return descriptor.Create();
13}
14}
15return null;
16}

通过SubsystemManager中的获取描述符List的方法GetSubsystemDescriptors,我们得到了所有可用的子系统,并遍历检测其子系统是否支持boundary vertices,若遍历过程中发现是支持的,则对其进行子系统的创建。以实现我们想要实现的功能。

Create()方法是一个单例模式的创建,想要控制AR中的一些功能,我们无需对GameObject进行一些消耗性能的操作,只需要手动控制子系统的生命周期即可:

1var planeSubsystem = CreatePlaneSubsystem();
2if (planeSubsystem != null)
3{
4// 开始平面检测
5.     planeSubsystem.Start();
6}
78if (planeSubsystem != null)
9{
10// 停止平面检测,但这并不会影响到已检测到的平面
11.    planeSubsystem.Stop();
12}
1314if (planeSubsystem != null)
15{
16// 销毁该subsystem
17.    planeSubsystem.Destroy();
18.    planeSubsystem = null;
19}

上述代码展示了一个子系统从创建到停止到销毁的生命过程。


跟踪子系统

一些子系统可用实现对物理环境的实时检测和跟踪,被称为跟踪子系统(Tracking subsystem),例如平面跟踪和图像跟踪,被跟踪的对象被称为可跟踪对象(Trackable),每个Trackable对象都拥有独特的ID作为标识。

在ARfoundation中,每类跟踪子系统都提供了getchanges()方法,用于获取被跟踪物体的状态信息变化。跟踪子系统也可以手动添加,更新或者移除Trackable对象。在跟踪子系统的manager类中通常提供了一些xxxChanged事件或者xxxChangedEventArgs的Event来对状态变化进行处理。


ARSession & AR Session Origin

在第一章节的demo中,创建AR程序的第一步是先创建ARSession和ARSessionOrigin两个对象,这两个对象支撑起了AR应用最基础的框架。我们将要学习这两个对象的作用。

ARSession

在这里插入图片描述

AR Session主要包括两个组件,一个就是AR Session,管理Session,另一个是AR Input Manager,管理输入相关信息。

Session用于管理AR应用的状态,处理生命周期,是AR API的主要入口,常用于控制AR程序。

AR Input Manager组件是启用环境跟踪的必需组件,若不启用此组件,Tracked Pose Driver(跟踪姿态驱动)将无法获取设备的姿态。

在任何一个AR应用中,有且只有一个Session,Unity将Session设成全局组件,因此如果场景中有多个AR Session,这些AR Session将尝试管理同一个Session。同理AR Input Manager也有且只有一个。

ARSessionState

由于并不是每一个设备都支持AR功能,AR Session提供了AR Session State 枚举类型来标识当前Session的状态。开发人员可用根据状态来定义XXX的状态事件。

ARSessionState描述
CheckingAvailability应用正在检测设备可用性
InstallingAR软件正在安装(这里指移动端的ARCore或者ARKit)
NeedsInstall设备支持AR,但需要安装相应软件(这里指移动端的ARCore或者ARKit)
None应用还未完成初始化,设备可用性未知
ReadyAR应用可用并已经准备好
SessionInitializingAR Session正在初始化,通常指AR在设备上可用,但AR应用目前还未收集到足够的环境信息
SessionTrackingSession正常运行并且处于正常跟踪状态
Unsupported设备不支持AR

通过状态类型,来检测AR应用在启动时的状态,并选择不同的处理方式:

1IEnumerator CheckSupport()
2{
3.     Debug.Log("检查设备...");
4yield return ARSession.CheckAvailability();
5if (ARSession.state == ARSessionState.NeedsInstall)
6{
7.        Debug.Log("设备支持AR,但需要更新...");
8.        Debug.Log("尝试更新...");
9yield return ARSession.Install();
10}
11if (ARSession.state == ARSessionState.Ready)
12{
13.       Debug.Log("设备支持AR!");
14.       Debug.Log("启动AR...");
1516// To start the ARSession, we just need to enable it.
17.       m_Session.enabled = true;
18}
19else
20{
21switch (ARSession.state)
22{
23case ARSessionState.Unsupported:
24.             Debug.Log("设备不支持AR.");
25break;
26case ARSessionState.NeedsInstall:
27.             Debug.Log("更新失败.");
28break;
29}
30//
31// 启动非AR的替代方案......
32//
33}
34}
3536void SetInstallButtonActive(bool active)
37{
38if (m_InstallButton != null)
39.       m_InstallButton.gameObject.SetActive(active);
40}
4142IEnumerator Install()
43{
44if (ARSession.state == ARSessionState.NeedsInstall)
45{
46.       Debug.Log("尝试安装ARCore服务...");
47yield return ARSession.Install();
4849if (ARSession.state == ARSessionState.NeedsInstall)
50{
51.          Debug.Log("ARCore服务更新失败.");
52SetInstallButtonActive(true);
53}
54else if (ARSession.state == ARSessionState.Ready)
55{
56.          Debug.Log("启动AR...");
57.          m_Session.enabled = true;
58}
59}
60else
61{
62.       Debug.Log("无需安装.");
63}
64}
6566void OnEnable()
67{
68StartCoroutine(CheckSupport());
69}

AR Session Origin

在这里插入图片描述

  • AR Session Origin的首要功能就是对Trackable对象的坐标处理

AR Session Origin对象默认有一个Transfrom组件和一个AR Session Origin组件

AR Session Origin中组件的作用是将可跟踪对象(如平面和特征点)姿态信息转换为Unity场景中的位置信息。由于AR设备由Session进行管理,因此Trackable对象的姿态信息会被获取到称为Session Space的初始空间,再通过AR Session Origin完成对姿态信息到Unity坐标空间的映射变换。

AR Camera

AR Session Origin的面板上还接收一个AR摄像机。

在这里插入图片描述

在AR Camera上,默认挂载了以上组件。

其中Tracked Pose Driver组件的主要作用是将Unity中的场景摄像机与设备的真实摄像机对齐,即根据设备真实摄像机的位置与方向来调整Unity中的场景摄像机姿态。使得Unity中的摄像机和AR设备的摄像机有用一致的参数,保证unity中的虚拟坐标和现实世界的坐标相对应。

在AR Foundation3.0以后,Tracked Pose Driver组件已被AR Pose Driver取代,AR Pose Driver没有任何控制参数,它会自动处理所有与场景姿态相关的工作。

AR Camera Manager组件负责处理控制摄像机的一些细节参数,如表示纹理和控制光照估计模式,其有两个参数,Focus Mode和Light Estimation Mode,相关属性如下表所示:

在这里插入图片描述

随后是AR Camera BackGround组件,该组件的两个参数:Use Custom Material 和 Use Custom Render Asset 均为可选参数,用于进行背景渲染。

每个AR Session Origin都可以通过添加AR Camera Background将摄像机图像渲染为场景。如果程序中存在多个AR Session Origin和多个摄像机,则需要为每一个AR Session Origin和每一个AR Camera都指定AR Camera Background。


小结

在本章中,我们学习了ARFoundation的一些基本结构(例如Subsystem,trackable)和用法,初步了解了AR Session和AR Session Origin两个基本组件,其中AR Session属于全局管理AR 程序的核心部分,控制整个AR的生命周期。而AR Session Origin 则用于相关的AR摄像机渲染,物体追踪等工作。

这篇关于【ARFoundation学习笔记】ARFoundation基础(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352381

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.