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.getAllAnchors
和 Frame.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
返回由返回此Frame
的update()
更改的特定类型的可跟踪对象。要检索所有更改的 trackable,filterType 可能是 Trackable.class
或 Point.class
或 Plane.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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章