【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 PlaneAR Plane Manager检测与管理平台,包括垂直平面与水平平面
AR Point CloudAR Point Cloud Manager检测与管理特征点云
AR Reference PointAR Reference Point Manager检测与管理参考点,可以通过AR Reference Point Manager添加和移除参考点
AR Tracked ImageAR Tracked Image Manager检测与管理2D图像跟踪
AR Environment ProbeAR Environment Probe Manager管理环境探头生成Cubemaps
AR FaceAR Face Manager检测与管理人脸跟踪
AR Tracjed ObjectAR Tracjed Object Manager检测与管理3D物体对象
AR ParticipantAR Participant Manager在多人协作Session中检测和跟踪参与者

可跟踪管理器的实际作用就是对可跟踪对象进行位置追踪,姿态计算,状态更新,但管理器只负责存储可跟踪对象的数据信息,而不进行其他处理。例如可跟踪对象可视化是由其他的脚本或者组件完成的。

通过启用或者禁用AR XXX Manager可以启用或禁用对应Trackable对象的跟踪检测功能。由于跟踪对象十分消耗资源,因此在不使用时应当禁用或者删除对应Manager。

可跟踪对象事件

每一个可跟踪对象都可以被添加、更新、删除。在每一帧中,对应的管理器会对该类所有的可跟踪对象状态进行检测,把新的可跟踪对象加进来,对现跟踪对象进行姿态更新,删除陈旧过时的可跟踪对象。有时我们可能需要在特定事件发生时做一些操作,对此,所有的管理器都会提供一个事件,我们可以“订阅”事件后对一些操作进行对应处理

可跟踪对象可跟踪对象管理器
AR Plane ManagerplanesChanged
AR Point Cloud ManagerpointCloudsChanged
AR Reference Point ManagerreferencePointsChanged
AR Tracked Image ManagertrackedImagesChanged
AR Environment Probe ManagerenvironmentProbesChanged
AR Face ManagerfacesChanged
AR Tracjed Object ManagertrackedObjectChanged
AR Participant ManagerparticipantsChanged

管理可跟踪对象

在所有Trackable对象中,部分完全由manager自动管理,如Plane和Face。部分需要手动进行管理,如ReferencePoint 和 EnvironmentProbes,需要手动添加或者删除。部分则既可自动管理,又可手动管理,如PointCloud。

由于每一类可跟踪对象都由对应的管理器进行管理,因此,我们不应该直接尝试去销毁(Destroy)可跟踪对象,其实如果强行使用Destroy()方法销毁可跟踪对象可能会导致应用出错。对于那些可以手动添加和删除的可跟踪对象,相应的管理器也提供了删除的方法XXXManager.RemoveXXX(),例如移除一个参考点,我们只需要调用ARReferencePointManager.RemoveReferencePoint()方法即可。

在添加一个可跟踪对象时,AR Foundation需要做一系列的准备工作,因此,在我们添加一个可跟踪对象后,它并不会马上被系统所跟踪,直到系统准备完毕并报告可跟踪对象已经添加到AR Foundation系统中,这个过程和时间因可跟踪对象类型而异。为明确可跟踪对象状态,所有的可跟踪对象都有一个pending属性,pending属性为true时标识该可跟踪对象已经被添加但还没有真正添加到AR Foundation跟踪系统中,检测这个属性可获取到该可跟踪对象的跟踪情况

1var referencePoint = referencePointManager.AddReferencePoint(new Pose(position,   rotation));
2.  Debug.Log(referencePoint.pending); // "true"
34// 当前帧中该方法不会触发
5void OnReferencePointsChanged(ARReferencePointsChangedEventArgs eventArgs)
6{
7foreach (var referencePoint in eventArgs.added)
8{
9// 正在跟踪的对象
10}
11}

添加一个referencePoint后马上检查其状态,referencePoint.pending为true,意味着该可跟踪对象还未真正添加到AR Foundation跟踪系统,因此该管理器的OnReferencePointsChanged事件不会被触发,直到真正添加成功(可能要在第2帧或者第3帧才能触发)。

1var planeManager = GetComponent<ARPlaneManager>();
2foreach (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的管理。

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

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

相关文章

GoLong的学习之路(番外)如何使用依赖注入工具:wire

我为什么要直接写番外呢&#xff1f;其原因很简单。项目中会使用&#xff0c;其实在这里大家就可以写一些项目来了。 依赖注入的工具本质思想其实都大差不差。无非控制反转和依赖注入。 文章目录 控制反转为什么需要依赖注入工具 wire的概念提供者&#xff08;provider&#x…

【计算机网络笔记】TCP的拥塞控制机制

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

Linux文件描述符和打开文件之间的关系

简介 文件描述符和打开的文件之间似乎呈现出一一对应的关系。然而&#xff0c;实际并非如此。多个文件描述符指向同一打开文件&#xff0c;这既有可能&#xff0c;也属必要。这些文件描述符可在相同或不同的进程中打开。 要理解具体情况如何&#xff0c;需要查看由内核维护的…

应用安全四十二:SSO安全

一、什么是SSO SSO是单点登录(Single Sign On)的缩写,是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是比较流行的企业业务整合的解决方案之一。 身份验证过程依赖于双方之间的信任关…

Spring Boot创建多模块项目

创建一个普通的Spring Boot项目, 然后只留下 pom.xml 剩下的都删掉 删除多余标签 标识当前为父模块 创建子模块 删除子模块中多余标签 声明父模块 在父模块中声明子模块

基于JAVA+SSM的房屋租赁系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的发展和人们…

【C/C++】什么是POD(Plain Old Data)类型

2023年11月6日&#xff0c;周一下午 目录 POD类型的定义标量类型POD类型的特点POD类型的例子整数类型&#xff1a;C 风格的结构体&#xff1a;数组&#xff1a;C 风格的字符串&#xff1a;std::array:使用 memcpy 对 POD 类型进行复制把POD类型存储到文件中&#xff0c;并从文…

webgoat-(A1)SQL Injection

SQL Injection (intro) SQL 命令主要分为三类&#xff1a; 数据操作语言 &#xff08;DML&#xff09;DML 语句可用于请求记录 &#xff08;SELECT&#xff09;、添加记录 &#xff08;INSERT&#xff09;、删除记录 &#xff08;DELETE&#xff09; 和修改现有记录 &#xff…

【自我提升】项目升级-Beyond Compare效率工具

写在前面&#xff1a;最近接手一个项目&#xff0c;这个项目集成了许多开源项目&#xff0c;其中我需要对其中一个开源项目进行升级操作。在此记录升级过程和心得&#xff0c;希望可以给各位道友提供一种思路&#xff0c;同时也希望道友有更好的办法能分享在评论区。 项目场景 …

RabiitMQ消息队列系统

一、MQ 1、概念&#xff1a; MQ 全称为 Message Queue (消息队列)&#xff0c;是一种应用程序对应用程序的通信方法。MQ 允许应用程序将消息写入队列&#xff0c;其他应用程序从队列中读取并处理这些消息&#xff0c;不需要它们之间直接相互联系。消息队列可用于实现异步通信…

idea Error: java: OutOfMemoryError: insufficient memory处理

IDEA设置里&#xff0c;修改heap size更大一点&#xff0c;可以解决问题

apachesolr启动带调试

这里solr.cmd报错&#xff0c;报错原因是java版本问题&#xff0c;后面发现这是因为多个java版本导致读取java_home失败&#xff0c; 那么我们修改solr.cmd中的JAVA_HOME为SOLR_JAVA_HOME IF DEFINED SOLR_JAVA_HOME set "JAVA_HOME%SOLR_JAVA_HOME%"环境变量将SOLR…

【Python基础】史上最全||一篇博客搞懂Python面向对象编程(封装、继承、多态)

Python面向对象编程 1.面向对象概念介绍1) 面相过程 —— 怎么做&#xff1f;2&#xff09;面向对象 谁来做 2.类和对象2.1类2.2对象2.3类和对象的关系2.4类的设计2.5面向对象设计案例 士兵类设计2.6身份运算符 3.私有属性和私有方法3.1. 应用场景及定义方式 4.继承、多态重写父…

2014年亚太杯APMCM数学建模大赛C题公共基础课教师专业化培养方式研究求解全过程文档及程序

2014年亚太杯APMCM数学建模大赛 C题 公共基础课教师专业化培养方式研究 原题再现 近年来&#xff0c;世界基础工业、信息产业、服务业的跨越式发展引发了大量人才需求&#xff0c;导致了职业教育的飞速发展&#xff0c;除原有专科层次高等职业教育院校外&#xff0c;大量普通…

24PL-18-50-1836、12PN-4.1-50-1836比例电磁铁控制器

12PG-2.2-40-1836、24PG-8.8-40-1836、12PT-40-1836、24PT-40-1836、12PL-2.2-40-1836、24PL-8.8-40-1836、12PN-2.2-40-1836、24PN-8.8-40-1836、12PG-4.1-50-1836、24PG-18-50-1836、12PT-4.1-50-1836、24PT-18-50-1836、12PL-4.1-50-1836、24PL-18-50-1836、12PN-4.1-50-183…

基于8086汽车智能小车控制系统

**单片机设计介绍&#xff0c;基于8086汽车智能小车控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于 8086 的汽车智能小车控制系统是一种将微处理器技术应用于汽车控制的系统。下面是其主要的设计介绍&#xff1a; 硬…

大数据学习之Spark性能优化

文章目录 Spark三种任务提交模式宽依赖和窄依赖StageSpark Job的三种提交模式 Shuffle机制分析未优化的Hash Based Shuffle优化后的Hash Based ShuffleSort-Based Shuffle Spark之checkpointcheckpoint概述checkpoint与持久化的区别checkPoint的使用checkpoint源码分析 Spark程…

Django实战项目-学习任务系统-发送短信通知

接着上期代码内容&#xff0c;继续完善优化系统功能。 本次增加发送短信通知功能&#xff0c;学习任务系统发布的任务&#xff0c;为了更加及时通知到学生用户&#xff0c;再原有发送邮件通知基础上&#xff0c;再加上手机短信通知功能。 第一步&#xff1a;开通短信通知服务…

Docker容器中执行throttle.sh显示权限报错:RTNETLINK answers: Operation not permitted

在模拟通信环境时&#xff0c;我执行了一下命令&#xff1a; bash ./throttle.sh wan但是&#xff0c;出现了权限的报错&#xff1a;RTNETLINK answers: Operation not permitted 解决方案说简单也挺简单&#xff0c;只需要两步完成。但是其实又蛮繁琐&#xff0c;因为需要将…

正点原子嵌入式linux驱动开发——Linux 4G通信

前面学习了如何在Linux中使用有线网络或者WIFI&#xff0c;但是使用有线网络或者WIFI有很多限制&#xff0c;因为要布线&#xff0c;即使是WIFI也得先布线&#xff0c;然后再接个无线路由器。有很多场合是不方便布线的&#xff0c;这个时候就是4G大显身手的时候&#xff0c;产品…