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

时间:2018-03-12 17:49:21

标签: java kotlin augmented-reality arcore

两者都返回现在已知的所有可跟踪曲目吗?

为什么我们需要两者?

何时应该拨打哪一个?

同样的问题适用于Session.getAllAnchorsFrame.getUpdatedAnchors

1 个答案:

答案 0 :(得分:2)

全局 Session.getAllTrackables 返回所有已知可跟踪对象的列表。如果启用了平面检测,则此列表将包括Planes,以及作为对PointshitTest(float, float)的呼叫的副作用而创建的createAnchor(Pose)

示例:

planeRenderer.drawPlanes(session.getAllTrackables(Plane.class),
                         camera.getDisplayOrientedPose(), 
                         projmtx);

如您所见,planeRenderer类用于绘制平面。它使用.drawPlanes()方法来渲染ARCore会话已使用视图和投影矩阵标识的任何已标识平面。它将通过呼叫getAllTrackables(Plane.class)传递所有飞机。

enter image description here

但是本地 Frame.getUpdatedTrackables 返回由返回此update()的{​​{1}}更改的特定类型的可跟踪对象。要检索所有更改的可跟踪对象, filterType 可以为FrameTrackable.classPoint.class。每当屏幕框架更新时,都会触发此方法。

示例:

Plane.class

还有关于private void onUpdateFrame(FrameTime frameTime) { Frame frame = arSceneView.getArFrame(); Collection updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage.class); } 的几句话:

update()
  

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