【ARFoundation学习笔记】ARFoundation基础(下)
写在前面的话
本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏,更多详细内容请阅读原文。
文章目录
- Trackables
- TrackableManager
- 可跟踪对象事件
- 管理可跟踪对象
- Session管理
Trackables
在AR Foundation中,平面(Plane)、特征点云(Point Cloud)、参考点(Reference Point)、跟踪图像(Tracked Image)、环境探头(Environment Probe)、人脸(Face)、3D物体(Tracked Object)、共享参与者(ARParticipant)这8类对象称为可跟踪对象(trackables)。
对于每一类可追踪对象,AR Foundation都为它们准备了一个对应的XXXManager。每种管理器对应管理一类可追踪对象,这些管理器可以非常方便的添加或者删除,从而可以灵活的对可追踪对象进行处理。且管理器之间的处理事件和API接口十分相似,便于掌握。
由于Trackable的姿态信息由AR Session Origin进行管理,因此对应的Manager也只能挂载在AR Session Origin上。
TrackableManager
下表展示了八种Trackable对象和它们对应Manager的作用描述
可跟踪对象 | 可跟踪对象管理器 | 描述 |
---|---|---|
AR Plane | AR Plane Manager | 检测与管理平台,包括垂直平面与水平平面 |
AR Point Cloud | AR Point Cloud Manager | 检测与管理特征点云 |
AR Reference Point | AR Reference Point Manager | 检测与管理参考点,可以通过AR Reference Point Manager添加和移除参考点 |
AR Tracked Image | AR Tracked Image Manager | 检测与管理2D图像跟踪 |
AR Environment Probe | AR Environment Probe Manager | 管理环境探头生成Cubemaps |
AR Face | AR Face Manager | 检测与管理人脸跟踪 |
AR Tracjed Object | AR Tracjed Object Manager | 检测与管理3D物体对象 |
AR Participant | AR Participant Manager | 在多人协作Session中检测和跟踪参与者 |
可跟踪管理器的实际作用就是对可跟踪对象进行位置追踪,姿态计算,状态更新,但管理器只负责存储可跟踪对象的数据信息,而不进行其他处理。例如可跟踪对象可视化是由其他的脚本或者组件完成的。
通过启用或者禁用AR XXX Manager可以启用或禁用对应Trackable对象的跟踪检测功能。由于跟踪对象十分消耗资源,因此在不使用时应当禁用或者删除对应Manager。
可跟踪对象事件
每一个可跟踪对象都可以被添加、更新、删除。在每一帧中,对应的管理器会对该类所有的可跟踪对象状态进行检测,把新的可跟踪对象加进来,对现跟踪对象进行姿态更新,删除陈旧过时的可跟踪对象。有时我们可能需要在特定事件发生时做一些操作,对此,所有的管理器都会提供一个事件,我们可以“订阅”事件后对一些操作进行对应处理
可跟踪对象 | 可跟踪对象管理器 |
---|---|
AR Plane Manager | planesChanged |
AR Point Cloud Manager | pointCloudsChanged |
AR Reference Point Manager | referencePointsChanged |
AR Tracked Image Manager | trackedImagesChanged |
AR Environment Probe Manager | environmentProbesChanged |
AR Face Manager | facesChanged |
AR Tracjed Object Manager | trackedObjectChanged |
AR Participant Manager | participantsChanged |
管理可跟踪对象
在所有Trackable对象中,部分完全由manager自动管理,如Plane和Face。部分需要手动进行管理,如ReferencePoint 和 EnvironmentProbes,需要手动添加或者删除。部分则既可自动管理,又可手动管理,如PointCloud。
由于每一类可跟踪对象都由对应的管理器进行管理,因此,我们不应该直接尝试去销毁(Destroy)可跟踪对象,其实如果强行使用Destroy()方法销毁可跟踪对象可能会导致应用出错。对于那些可以手动添加和删除的可跟踪对象,相应的管理器也提供了删除的方法XXXManager.RemoveXXX(),例如移除一个参考点,我们只需要调用ARReferencePointManager.RemoveReferencePoint()方法即可。
在添加一个可跟踪对象时,AR Foundation需要做一系列的准备工作,因此,在我们添加一个可跟踪对象后,它并不会马上被系统所跟踪,直到系统准备完毕并报告可跟踪对象已经添加到AR Foundation系统中,这个过程和时间因可跟踪对象类型而异。为明确可跟踪对象状态,所有的可跟踪对象都有一个pending属性,pending属性为true时标识该可跟踪对象已经被添加但还没有真正添加到AR Foundation跟踪系统中,检测这个属性可获取到该可跟踪对象的跟踪情况
1. var referencePoint = referencePointManager.AddReferencePoint(new Pose(position, rotation));
2. Debug.Log(referencePoint.pending); // "true"
3.
4. // 当前帧中该方法不会触发
5. void OnReferencePointsChanged(ARReferencePointsChangedEventArgs eventArgs)
6. {
7. foreach (var referencePoint in eventArgs.added)
8. {
9. // 正在跟踪的对象
10. }
11. }
添加一个referencePoint后马上检查其状态,referencePoint.pending为true,意味着该可跟踪对象还未真正添加到AR Foundation跟踪系统,因此该管理器的OnReferencePointsChanged事件不会被触发,直到真正添加成功(可能要在第2帧或者第3帧才能触发)。
1. var planeManager = GetComponent<ARPlaneManager>();
2. foreach (ARPlane plane in planeManager.trackables)
3. {
4. // 获取到所有正在跟踪的ARPlane
5. }
管理器的trackables属性返回一个TrackableCollection集合,利用这个集合,我们可以使用foreach循环进行遍历。另外,我们还可以使用TryGetTrackable()方法获取特定的可跟踪对象,该方法只要提供一个TrackableId参数,即可跟踪对象的GUID值。
当可跟踪对象管理器检测到一个可跟踪对象后会实例化一个该对象的prefab,这个prefab必须要有该类可跟踪对象的对应组件。例如要跟踪Plane平面,则指定的prefab需要由AR Plane组件,如果Prafab未指定,管理器也会创建一个空的Prefab并挂载AR Plane组件。
例如AR Plane Manager检测到一个平面,如果PlanePrefab属性有赋值它将用这个prefab实例化一个AR Plane对象;如果提供的prefab没有AR Plane组件,将自动为其挂载一个;如果PlanePrefab属性没有指定,AR Plane Manager将创建一个只有AR Plane组件的空对象。
Session管理
AR程序中Session负责管理整个程序的生命周期,因此其提供了一些事件用于对应用的操作:
也可以用Unity本身的脚本enable方法和Gameobject的setActive方法来实现对Session的管理。
相关文章:

【ARFoundation学习笔记】ARFoundation基础(下)
写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏,更多详细内容请阅读原文。 文章目录 TrackablesTrackableManager可跟踪对象事件管理可跟踪对象 Session管理 Trackables 在AR Foundation中,平面…...

《UML和模式应用(原书第3版)》2024新修订译本部分截图
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 机械工业出版社即将在2024春节前后推出《UML和模式应用(原书第3版)》的典藏版。 受出版社委托,UMLChina审校了原中译本并做了一些修订。同比来说&a…...

JSP 学生成绩查询管理系统eclipse开发sql数据库serlvet框架bs模式java编程MVC结构
一、源码特点 JSP 学生成绩查询管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,比较流行的servlet框架系统具有完整的源代码和数据库,eclipse开发系统主要采用B/S模式 开发。 java 学生成绩查询管理系统 代码下载链接…...

技术分享 | app自动化测试(Android)-- 属性获取与断言
断言是 UI 自动化测试的三要素之一,是 UI 自动化不可或缺的部分。在使用定位器定位到元素后,通过脚本进行业务操作的交互,想要验证交互过程中的正确性就需要用到断言。 常规的UI自动化断言 分析正确的输出结果,常规的断言一般包…...
flutter实现上拉到底部加载更多数据
实现上拉加载数据,效果如下: flutter滚动列表加载数据 使用的库主要是infinite_scroll_pagination , 安装请查看官网 接口用的是https://reqres.in/提供的接口 请求接口用到的库是dio 下面主要是介绍如何使用infinite_scroll_pagination实现上拉加载…...

UE4 Niagara Module Script 初次使用笔记
这里可以创建一个Niagara模块脚本 创建出来长这样 点击号,输出staticmesh,点击它 这样就可以拿到对应的一些模型信息 这里的RandomnTriCoord是模型的坐标信息 根据坐标信息拿到位置信息 最后的Position也是通过Map Set的号,选择Particles的P…...

【Spring Boot 源码学习】JedisConnectionConfiguration 详解
Spring Boot 源码学习系列 JedisConnectionConfiguration 详解 引言往期内容主要内容1. RedisConnectionFactory1.1 单机连接1.2 集群连接1.3 哨兵连接 2. JedisConnectionConfiguration2.1 RedisConnectionConfiguration2.2 导入自动配置2.3 相关注解介绍2.4 redisConnectionF…...

联想服务器-HTTP boot安装Linux系统
HTTP boot与传统PXE的主要差异 HTTP不再需要使用UDP协议的tftp服务(连接不可靠、不支持大文件)了,只需要dhcp 和http 两个服务即可,支持较稳定的大文件传输。 实验环境 ThinkSystem服务器SR650V2 SR660V2 通过HTTP boot安装Cen…...
容器滚动更新过程中流量无损
应用在发布或重启的期间会出现少量的 5xx 异常,应该如何解决? 我们发现导致流量有损的原因有很多,比如: 上线时,应用在就绪前收到流量,导致请求无法被处理; 下线时,应用没有做优雅…...
深入理解JS中的this
1、浅谈this 1.1、调用位置 在学习this的绑定过程之前,首先要理解调用位置,即函数在代码中被调用的位置,因此我们需要分析调用栈,看以下代码 function baz(){// 当前调用栈是baz// 因此调用位置就是全局作用域console。log(&qu…...
rust 基础数据类型
默认类型 大部分情况下,rust 可以基于上下文自动推导出变量的类型。下面代码中,变量 x 没有显式,rust 默认是 i32 类型。 fn main() {let x 5; }但也有一些例外情况,比如,字符串类型的转换中变量 x 的类型ÿ…...

ELK极简上手
目录 引言 首先,下载相关的包 其次,安装启动elasticsearch 下一步,安装并启动logstash 最后,安装并启动kibana 进一步的,测试数据的流动 引言 最近整理电脑发现之前的一篇ELK极简入门笔记,现整理发出…...
在 JavaScript 中,变量的作用域是如何确定的?
在 JavaScript 中,变量的作用域是由作用域链(Scope Chain)来确定的。作用域链是指变量在执行期间访问的作用域的链式结构。 JavaScript 中的作用域分为全局作用域和局部作用域(函数作用域和块级作用域)。 全局作用域…...

常见面试题-TCP三次握手四次挥手
TCP 三次握手/四次挥手 参数用途SYN用于启动和建立连接时,同步设备之间的序列号。0到2^32 - 1的随机数。ACK向另一端确认已经收到 SYN,数值为收到 SYN 增一。SYN-ACK确认之前收到了 SYN,数值为自定义值。FIN终止连接。RST重置连接。 三次握…...

前端框架Vue学习 ——(六)Vue组件库Element
文章目录 Element 介绍快速入门常见组件表格分页Dialog 对话框组件表单 Container 布局容器 Element 介绍 Element:是饿了么团队研发的,一套为开发者、 设计师和产品经理准备的基于Vue 2.0的桌面端组件库。 组件:组成网页的部件,…...

第六章:Property-based Testing and Test Oracles
文章目录 Test OraclesActive and Passive Test OraclesTypes of Test OraclesFormal, executable specificationsSolved examplesMetamorphic oraclesAlternative implementations (备用实现)Heuristic oracles (启发式)The Golden Program!Oracle Deviation (Oracle偏差)T…...
react生命周期函数
React 组件的生命周期可分为三大阶段:挂载阶段(Mounting)、更新阶段(Updating)和卸载阶段(Unmounting)。 1.挂载阶段(Mounting) 在组件被插入到 DOM 中后,会…...
QSqlDatabase使用Sqlite
QSqlDatabase使用Sqlite Sqlite本身就可以被内嵌在程序中,QSqlDatabase也自带Sqlite驱动,无需任何第三方依赖,可以直接使用 QSqlDatabase _db QSqlDatabase::addDatabase("QSQLITE"); QString dbPath "/path/to/xxx.db&qu…...

宝马——使用人工智能制造和驾驶汽车
德国汽车制造商宝马(BMW)每年在全球制造和销售250万台汽车,其品牌包括宝马、MINI和劳斯莱斯。 宝马汽车以其卓越的性能和对新技术的应用而著名,它是道路上最精致的汽车之一,并且和其竞争对手戴姆勒(Daimler)一样,在将自动驾驶汽车…...

java入门,Map<? extends String, ?>
一、前言 是不是平时写业务代码的时候很少用到这个写法:Map<? extends String, ?>,这是Map类型,Map的键是? extends String 类型,值是?。为什么不是我们平时写的Map< String, Object>,这种写法有什么好…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...