写在前面的话
本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏,更多详细内容请阅读原文。
在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上。
下表展示了八种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组件的空对象。
AR程序中Session负责管理整个程序的生命周期,因此其提供了一些事件用于对应用的操作:
也可以用Unity本身的脚本enable方法和Gameobject的setActive方法来实现对Session的管理。