ARFoundation之路-可跟踪对象

  在ARFoundation中,平面(Plane)、特征点云(Point Cloud)、参考点(Reference Point)、增强图像(Tracked Image)、环境探头(Environment Probe)、人脸(Face)、3D物体(Tracked Object)这七类对象称为可跟踪对象(trackable),也即是说ARFoundation目前可以实时的跟踪处理这七类对象。当然,这七类对象是否都支持还与平台底层SDK有关,如3D物体跟踪目前只能用在ARKit中。

  为方便管理各类可跟踪对象,ARFoundation为每一类可跟踪对象都建立了一个对应的管理器(Manager),一种管理器只管理对应的一类可跟踪对象,这种设计大大的提高了灵活性,可以非常方便的添加或者删除每类管理器,从而达到只对特定可跟踪对象进行处理的目的。

  需要特别注意的时,可跟踪对象管理器只能挂载在与AR Session Origin相同的一个对象上,这是因为AR Session Origin定义了Session空间与Unity空间的转换关系,可跟踪对象管理器需要利用Session原点及转换关系才能将可跟踪对象定位在Unity空间中的正确位置。一个挂载了所有可跟踪对象的AR Session Origin对象如下图所示。

在这里插入图片描述

(一)可跟踪对象管理器

  添加某种可跟踪对象管理器即可开始对这种类型的可跟踪对象进行管理,删除或者禁用一种可跟踪对象管理器即终止对这种类型的可跟踪对象的管理,Unity对可跟踪对象的这种处理非常简单易用。各管理器与可跟踪对象的对应关系如下表所示。

可跟踪对象 可跟踪对象管理器 说明
ARPlane ARPlaneManager 检测与管理平面,包括垂直平面与水平平面。
ARPointCloud ARPointCloudManager 检测与管理特征点云。
ARReferencePoint ARReferencePointManager 检测与管理参考点,可以通过ARReferencePointManager.AddReferencePoint 和 ARReferencePointManager.RemoveReferencePoint添加和移除参考点。
ARTrackedImage ARTrackedImageManager 检测与管理2D图像跟踪。
AREnvironmentProbe AREnvironmentProbeManager 管理环境探头生成Cubemaps。
ARFace ARFaceManager 检测与管理人脸跟踪。
ARTrackedObject ARTrackedObjectManager 检测与管理3D物体对象。

  在添加某类可跟踪对象管理器后,该类可跟踪对象姿态每帧都会被ARFoundation更新,但是管理器并不负责可视化可跟踪对象,即管理器只负责存储可跟踪对象的数据信息,但不对数据进行其他加工处理。

  如前所述,启用或者添加可跟踪管理器将启用某类跟踪功能。例如,可以通过启用或禁用ARPlaneManager来启用或者禁用平面检测功能。另外需要注意的是,跟踪对象是一个非常消耗资源的工作,因此最好在不使用某类可跟踪对象时禁用或者删除其管理器。

(二)可跟踪对象事件

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

可跟踪对象管理器 事件
ARPlaneManager planesChanged
ARPointCloudManager pointCloudsChanged
ARReferencePointManager referencePointsChanged
ARTrackedImageManager trackedImagesChanged
AREnvironmentProbeManager environmentProbesChanged
ARFaceManager facesChanged
ARTrackedObjectManager trackedObjectsChanged

(三)管理可跟踪对象

  ARFoundation中的可跟踪对象,有的可以手动添加删除,有的则是自动管理不需人工参与。如Reference Points和Enveronment probes,这两个可跟踪对象可以手动添加和删除,Plane和Face等其他的可跟踪对象则完全由ARFoundation自动管理。还有一些是既可以自动管理,也可以手动添加删除,如PointCloud。

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

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

var referencePoint = referencePointManager.AddReferencePoint(new Pose(position, rotation));
Debug.Log(referencePoint.pending); // "true"

// -- 当前帧中该方法不会触发--
void OnReferencePointsChanged(ARReferencePointsChangedEventArgs eventArgs)
{
    foreach (var referencePoint in eventArgs.added)
    {
        // 正在跟踪的对象
    }
}

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

  遍历可跟踪对象可以通过相应的管理器进行,如以下代码所示:

var planeManager = GetComponent<ARPlaneManager>();
foreach (ARPlane plane in planeManager.trackables)
{
    // 获取到所有正在跟踪的ARPlane
}

  如上代码所示,管理器的trackables属性返回一个TrackableCollection集合,利用这个集合,我们可以使用foreach循环进行遍历。另外,我们还可以使用TryGetTrackable()方法去获取特定的可跟踪对象。

  有时我们可能会禁用正在跟踪的对象的行为,但又不是完全禁用管理器对可跟踪对象的管理,例如我们可能不想渲染已被检测到的平面,但又不是禁用平面检测功能。那么这时我们可以通过遍历对特定或者全部的正在跟踪的对象进行处理即可,如下代码所示。

var planeManager = GetComponent<ARPlaneManager>();
foreach (var plane in planeManager.trackables)
{
    plane.gameObject.SetActive(false);
}

  在上面代码中,我们将所有检测到的平面禁用。

  可跟踪对象管理器检测到一个可跟踪对象后将会实例化一个该对象的prefab,这个prefab必须要有该类可跟踪对象的对应组件。如果没有提供这个prefab,管理器将创建一个空的挂载该类可跟踪对象组件的对象,如果提供的prefab没有挂载该类可跟踪对象的对应组件,管理器将为其添加一个。例如Plane Mnager检测到一个平面,如果Plane Prefab属性有赋值它将用这个prefab实例化为一个对象,如果提供的prefab没有ARPlane组件,将自动为其挂载一个,如果Plane Prefab属性没有指定,Plane Mnager将创建一个只有ARPlane组件的空对象。

参考文献

Trackable Managers Trackable Managers

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/94393189