You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARCore安卓应用:如何判断Anchor是否处于当前帧视野内?

检查ARCore Anchor是否处于当前帧的实现思路

嘿,这个需求我在做ARCore项目时刚好处理过,给你分享几个实用的实现思路,都是经过项目验证的:

思路一:直接检查Anchor的追踪状态

这是最直观的方式——ARCore的Anchor类提供了getTrackingState()方法,返回的状态直接反映了当前帧是否在追踪该Anchor:

  • TrackingState.TRACKING:表示该Anchor在当前帧中被成功追踪,处于有效状态
  • TrackingState.PAUSED:Anchor暂时丢失追踪,可能移出了视野或环境变化
  • TrackingState.STOPPED:Anchor完全失效,无法再被追踪

代码示例:

// 假设你已经持有要检查的Anchor实例
if (anchor != null && !anchor.isDestroyed()) {
    boolean isInCurrentFrame = anchor.getTrackingState() == TrackingState.TRACKING;
    if (isInCurrentFrame) {
        // 处理Anchor在当前帧的逻辑
    }
}

思路二:结合当前Frame的更新Trackables验证

Anchor是附着在Trackable(比如平面Plane、特征点Point)上的,你可以通过当前Frame获取所有被更新的Trackable,再关联Anchor对应的Trackable来双重验证,这样能避免单独依赖Anchor状态的延迟问题:

代码示例:

// 获取当前帧
Frame currentFrame = arSession.update();
// 获取当前帧中所有更新的Plane(如果你的Anchor附着在其他Trackable上,替换对应的类即可)
Set<Trackable> updatedTrackables = currentFrame.getUpdatedTrackables(Plane.class);

if (anchor != null && !anchor.isDestroyed()) {
    Trackable anchorTrackable = anchor.getTrackable();
    // 同时验证Trackable和Anchor的追踪状态
    boolean isInCurrentFrame = updatedTrackables.contains(anchorTrackable)
            && anchorTrackable.getTrackingState() == TrackingState.TRACKING
            && anchor.getTrackingState() == TrackingState.TRACKING;
    
    if (isInCurrentFrame) {
        // Anchor处于当前帧的逻辑
    }
}

思路三:验证Anchor的Pose有效性

当Anchor在当前帧被追踪时,它的Pose(位姿)是有效且可获取的。你可以结合Pose的获取和追踪状态一起判断,进一步确保Anchor在当前帧的可用性:

代码示例:

if (anchor != null && !anchor.isDestroyed() && anchor.getTrackingState() == TrackingState.TRACKING) {
    Pose anchorPose = anchor.getPose();
    // 可以通过Pose的坐标是否合理(比如不是无穷大)来辅助验证
    boolean isPoseValid = anchorPose.tx() != Float.POSITIVE_INFINITY 
            && anchorPose.ty() != Float.POSITIVE_INFINITY 
            && anchorPose.tz() != Float.POSITIVE_INFINITY;
    
    if (isPoseValid) {
        // Anchor处于当前帧且Pose有效
    }
}

补充提示

  • 记得每次检查前先判断Anchor是否被销毁(isDestroyed()),避免空指针或无效操作
  • 如果是批量检查多个Anchor,可以把当前Frame的updatedTrackables缓存起来,避免重复调用方法影响性能

内容的提问来源于stack exchange,提问作者user3860345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:34:08