Session.getAllTrackables 和 Frame.getUpdatedTrackables 有啥区别?

Posted

技术标签:

【中文标题】Session.getAllTrackables 和 Frame.getUpdatedTrackables 有啥区别?【英文标题】:What is the difference between Session.getAllTrackables and Frame.getUpdatedTrackables?Session.getAllTrackables 和 Frame.getUpdatedTrackables 有什么区别? 【发布时间】:2018-08-20 20:16:30 【问题描述】:

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

为什么我们需要两者?

什么时候应该调用哪个?

Session.getAllAnchorsFrame.getUpdatedAnchors 也有同样的问题。

【问题讨论】:

【参考方案1】:

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

例子:

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

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

但本地 Frame.getUpdatedTrackables 返回由返回此Frameupdate() 更改的特定类型的可跟踪对象。要检索所有更改的 trackable,filterType 可能是 Trackable.classPoint.classPlane.class。每当更新屏幕框架时都会触发此方法。

例子:

private void onUpdateFrame(FrameTime frameTime) 
    Frame frame = arSceneView.getArFrame();
    Collection updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage.class);

关于update()的几句话:

public Frame update()

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

【讨论】:

以上是关于Session.getAllTrackables 和 Frame.getUpdatedTrackables 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章