【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

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学