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

Android Studio中ARCore Geospatial多锚点仅显示最后三个的解决方法

问题分析与解决方案

你的代码存在两个核心问题,导致锚点无法全部正常显示:

  1. 局部变量导致锚点引用丢失:earthAnchor2和earthAnchor3是函数内的局部变量,函数执行完毕后这些变量会被销毁,对应的Anchor对象因为没有被持续持有强引用,ARCore会自动停止跟踪并移除这些锚点。
  2. 旧锚点清理不彻底:仅对成员变量earthAnchor执行了detach(),如果多次调用该函数,之前创建的其他锚点会残留,同时局部变量的锚点根本没被处理。

修正后的代码

首先在类中定义一个成员变量集合来保存所有锚点,确保ARCore能持续跟踪它们:

// 类成员变量:存储所有Geospatial锚点,确保强引用不丢失
private val geospatialAnchors = mutableListOf<Anchor>()

fun createMarkers(startApp: Boolean) {
    CreatedMakers = true

    val earth = session?.earth ?: return
    if (earth.trackingState != TrackingState.TRACKING) {
        return
    }

    if (startApp) {
        // 统一清理所有旧锚点:先解除跟踪再清空集合
        geospatialAnchors.forEach { it.detach() }
        geospatialAnchors.clear()

        // 创建第一个锚点并加入集合
        val anchor1 = earth.createAnchor(
            36.36584044154765, 127.34448328614235,
            earth.cameraGeospatialPose.altitude - 1.5,
            0f, 0f, 0f, 1f
        )
        geospatialAnchors.add(anchor1)

        // 创建第二个锚点并加入集合
        val anchor2 = earth.createAnchor(
            36.36580480414705, 127.34450038522482,
            earth.cameraGeospatialPose.altitude - 1.5,
            0f, 0f, 0f, 1f
        )
        geospatialAnchors.add(anchor2)

        // 创建第三个锚点并加入集合
        val anchor3 = earth.createAnchor(
            36.36572677978114, 127.34450273215772,
            earth.cameraGeospatialPose.altitude - 1.5,
            0f, 0f, 0f, 1f
        )
        geospatialAnchors.add(anchor3)
    }
}

关键说明

  • 用集合保存锚点引用:ARCore要求必须持有Anchor对象的强引用,否则系统会判定该锚点不再需要,自动停止跟踪并释放资源。成员变量集合可以确保所有锚点的引用被持续持有。
  • 统一清理旧锚点:每次创建新锚点前,遍历集合对所有旧锚点执行detach(),再清空集合,避免内存泄漏和旧锚点残留。
  • 移除无效代码:原代码中var earthAnchor2: Anchor? = null; earthAnchor2?.detach()这类代码完全无效,null调用detach()不会执行任何操作,直接删除即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:03:27