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

2023-11-07 06:52

本文主要是介绍【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的管理。

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



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

相关文章

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

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 基本操