Session.getAllTrackables和Frame.getUpdatedTrackables有什么区别?

red*_*arl 5 java augmented-reality kotlin arcore

两者都返回当前已知的所有可跟踪对象吗?

为什么我们都需要?

什么时候应该叫哪个?

Session.getAllAnchors和的问题相同Frame.getUpdatedAnchors

ARG*_*Geo 3

Global返回所有已知可追踪项Session.getAllTrackables的列表。如果启用平面检测,则此列表包括,以及作为调用或的副作用而创建。PlanesPointshitTest(float, float)createAnchor(Pose)

例子:

planeRenderer.drawPlanes(session.getAllTrackables(Plane.class),
                         camera.getDisplayOrientedPose(), 
                         projmtx);
Run Code Online (Sandbox Code Playgroud)

正如您在这里所看到的,planeRenderer该类用于绘制平面。它使用一种.drawPlanes()方法来渲染 ARCore 会话使用视图和投影矩阵识别的任何已识别平面。它通过调用 来传递所有飞机getAllTrackables(Plane.class)


但 localFrame.getUpdatedTrackables返回特定类型的可追踪对象,这些可追踪对象已被update()返回 this 的更改Frame。要检索所有更改的可追踪项,filterType可以是Trackable.classPoint.classPlane.class。每当屏幕框架更新时,都会触发此方法。

例子:

private void onUpdateFrame(FrameTime frameTime) {
    Frame frame = arSceneView.getArFrame();
    Collection updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage.class);
}
Run Code Online (Sandbox Code Playgroud)

还有几句话update()

public Frame update()
Run Code Online (Sandbox Code Playgroud)

更新 ARCore 系统的状态。这包括:接收新的相机帧、更新设备的位置、更新跟踪锚点的位置、更新检测到的平面等。此调用可能会导致离屏 OpenGL 活动。因此,为了避免不必要的帧缓冲区刷新和重新加载,不应在渲染帧或离屏缓冲区的过程中进行此调用。此调用可能会更新所有创建的锚点和检测到的平面的姿态。更新后的对象集可通过 访问getUpdatedTrackables(Class)