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

news2024/11/23 15:46:02

在这里插入图片描述


写在前面的话

本系列笔记旨在记录作者在学习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摄像机渲染,物体追踪等工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多目标优化中的“latent action”是什么?

2020 NeurIPS 中的“latent action”&#xff1a; Our model defines latent action as a boundary that splits the region represented by a node into a high-performing and a low performing region. 这里的latent action代表一个边界&#xff08;分类器&#xff09;&…

4 网络基础知识

1、 ifconfig&#xff1a; 1.Windows&#xff1a;ipconfig 2.Linux&#xff1a;ifconfigip addr2、 ifconfig 和 ip addr 的区别&#xff1f; 问题&#xff1a;假设你登录进入一个被裁剪过的非常小的 Linux 系统中&#xff0c;发现既没有 ifconfig 命令&#xff0c;也没有 ip…

CCF-CSP真题《202309-2 坐标变换(其二)》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202309-2试题名称&#xff1a;坐标变换&#xff08;其二&#xff09;时间限制&#xff1a;2.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 对于平面直角坐标…

【Mybatis小白从0到90%精讲】13: Mybatis sql片段,重用SQL的利器!

文章目录 前言SQL片段语句常见应用场景1. select 列字段2. where条件前言 代码复用是优秀程序员的标志之一,它能够减少代码冗余,提高代码可读性和可维护性。 在MyBatis开发中,Mapper中经常会有一些类似的SQL,如果每个语句都单独编写,会使代码冗长且难以维护。 MyBatis提…

Magics测量两个圆形中心点距离的方法

摘要&#xff1a;本文介绍如何使用magics测量两个圆孔之间的距离。 问题来源&#xff1a;3D模型打开后&#xff0c;两个圆孔中心点之间的间距测量无法直接通过测距实现&#xff0c;需要进行一些小小的设置才行。 工具选择“量尺”&#xff0c;如果不设置的话&#xff0c;它会默…

有关我自贡大盐商身世的两篇文章(一)

重游高坑岩瀑布随笔 都市噪杂喧嚣的生活&#xff0c;终于将我暂时逼离网络&#xff0c;决意出游数日&#xff0c;去山里寻找我向往的那些足以鼓舞人斗志的壮观瀑布&#xff0c;并试图从中领受它们那出自天然的&#xff0c;万马奔腾、猛烈撞击、拚抢速度、渲泄激情、永不妥协、…

【数据结构】树与二叉树(一):树(森林)的基本概念:父亲、儿子、兄弟、后裔、祖先、度、叶子结点、分支结点、结点的层数、路径、路径长度、结点的深度、树的深度

文章目录 5.1 树的基本概念5.1.1 树的定义树有序树、无序树 5.1.2 森林的定义5.1.3 树的术语1. 父亲&#xff08;parent&#xff09;、儿子&#xff08;child&#xff09;、兄弟&#xff08;sibling&#xff09;、后裔&#xff08;descendant&#xff09;、祖先&#xff08;anc…

【软件测试】工作内容

测试工程师工作&#xff1a; 阶段&#xff1a;编写测试计划测试用例、测试缺陷报告并执行测试用例&#xff1b;搭建Windows测试环境熟练&#xff1b;使用Bugzilla 提交软件缺陷报告 使用测试技术及工具&#xff1a;白盒测试黑盒测试 Loadrunner、Winrunner 能够运用边界值、等…

go-sync-mutex

Sync ​ Go 语言作为一个原生支持用户态进程&#xff08;Goroutine&#xff09;的语言&#xff0c;当提到并发编程、多线程编程时&#xff0c;往往都离不开锁这一概念。锁是一种并发编程中的同步原语&#xff08;Synchronization Primitives&#xff09;&#xff0c;它能保证多…

【CMake】15分钟带你入门CMake

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

[黑马程序员SpringBoot2]——运维实用篇

目录&#xff1a; 工程打包与运行打包插件Boot工程快速启动&#xff08;Linux版本&#xff09;临时属性配置文件4级分类自定义配置文件多环境开发(yaml版)多环境开发多文件版&#xff08;yaml版&#xff09;多环境开发多文件版&#xff08;properties版&#xff09;多环境分组…

基于AOSP源码Android-10.0.0_r41分支编译,framework开发,修改系统默认字体大小

文章目录 基于AOSP源码Android-10.0.0_r41分支编译&#xff0c;framework开发&#xff0c;修改系统默认字体大小 基于AOSP源码Android-10.0.0_r41分支编译&#xff0c;framework开发&#xff0c;修改系统默认字体大小 主要修改一个地方就行 代码源码路径 frameworks/base/co…

直流无刷电机(BLDC)六步换相驱动

直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动 文章目录 直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动1. 前言2. 六步换相原理3. 电角度与机械角度4. 动手实践4.1 霍尔输出表测量4.2 换向控制4.3 代码编写 5. 总结 1. 前言 直流无刷电机相对直流有刷电机具…

AOE性能调优问题案例

AOE&#xff08;Ascend Optimization Engine&#xff09;是一款自动性能调优工具&#xff0c;目的是为了充分利用有限的硬件资源&#xff0c;满足算子和整网的性能要求。 本期就分享几个关于AOE性能调优问题的典型案例&#xff0c;并给出原因分析及解决方法。 调优过程中进程…

Mysql之多表查询上篇

Mysql之多表查询上篇 多表查询什么是多表查询笛卡尔积(交叉连接)产生笛卡尔积的条件避免笛卡尔积的方法 多表查询的分类1.等值连接 VS 非等值连接等值连接非等值连接扩展1表的别名扩展2&#xff1a;连接多个表 2.自连接与非自连接扩展3&#xff1a;SQL语法标准 内连接SQL92语法…

【大模型应用开发教程】04_大模型开发整体流程 基于个人知识库的问答助手 项目流程架构解析

大模型开发整体流程 & 基于个人知识库的问答助手 项目流程架构解析 一、大模型开发整体流程1. 何为大模型开发定义核心点核心能力 2. 大模型开发的整体流程1. 设计2. 架构搭建3. Prompt Engineering4. 验证迭代5. 前后端搭建 二、项目流程简析步骤一&#xff1a;项目规划与…

TensorRT量化实战课YOLOv7量化:YOLOv7-PTQ量化(二)

目录 前言1. YOLOv7-PTQ量化流程2. 模型标定3. 敏感层分析 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 TensorRT下的模型量化&#xff0c;在其课程的基…

el-tree中展示项换行展示

文章目录 效果如下所示&#xff1a;没有换行展示的效果修改样式换行之后的展示效果 想要了解el-tree使用的详情往下看代码和数据如下所示Vue代码中可能使用到的数据如下Vue的代码如下&#xff1a;没有换行展示的效果换行之后的展示效果样式调试 效果如下所示&#xff1a; 没有…

仅以此文,纪念毕业一年后的日子

22年6月份从华农毕业了之后&#xff0c;拿到了好几份不错的offer&#xff0c;最后我进入了我学生时代十分憧憬的一家公司&#xff08;腾讯&#xff09;工作&#xff0c;加上实习的时间&#xff0c;已经在腾讯差不多工作了两年了。 从一开始实习的时候的懵懂学生气到现在的清醒…

Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测

目录 一、环境准备二、下载 ONNX 模型文件2.1 Azure 机器学习工作室2.2 Azure 机器学习 Python SDK2.3 生成模型进行批量评分多类图像分类 三、加载标签和 ONNX 模型文件四、获取 ONNX 模型的预期输入和输出详细信息ONNX 模型的预期输入和输出格式多类图像分类 多类图像分类输入…