Android Studio中ARCore Geospatial多锚点仅显示最后三个的解决方法
问题分析与解决方案
你的代码存在两个核心问题,导致锚点无法全部正常显示:
- 局部变量导致锚点引用丢失:
earthAnchor2和earthAnchor3是函数内的局部变量,函数执行完毕后这些变量会被销毁,对应的Anchor对象因为没有被持续持有强引用,ARCore会自动停止跟踪并移除这些锚点。 - 旧锚点清理不彻底:仅对成员变量
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
相关产品推荐
相关产品推荐

