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

iOS Swift基于Core Location的AR定位标记点显示异常求助

问题分析与解决方案

你当前的代码仅完成了将标记点添加到AR场景的基础功能,但缺少距离判断逻辑,导致标记点不会随用户与目标位置的距离变化而隐藏。要实现标记点固定在特定位置且仅在范围内显示,核心思路是实时计算用户当前位置与标记点的距离,超过设定阈值时隐藏节点。

具体实现步骤

  1. 定义显示范围阈值:根据需求设定标记点的有效显示距离(比如50米,可自行调整)。
  2. 存储标记点实例:将标记点节点声明为类的实例变量,方便后续位置更新时访问。
  3. 监听用户位置更新:通过SceneLocationViewDelegate代理方法,实时获取用户当前位置并计算与标记点的距离,动态控制节点的显示状态。

修改后的代码示例

首先在你的ViewController中声明实例变量和阈值:

import UIKit
import SceneKit
import CoreLocation
// 假设你用的是SceneLocationKit这类库
import SceneLocationKit

class YourViewController: UIViewController {
    @IBOutlet weak var sceneLocationView: SceneLocationView!
    
    // 存储标记点实例,方便后续访问
    private var iskproAnnotationNode: LocationAnnotationNode?
    // 设定标记点的有效显示范围(单位:米)
    private let displayThreshold: CLLocationDistance = 50
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupAnnotationNode()
        // 设置代理监听位置更新
        sceneLocationView.delegate = self
    }
    
    private func setupAnnotationNode() {
        let targetLocation = CLLocation(coordinate: CLLocationCoordinate2D(latitude: 28.610497, longitude: 77.360733), altitude: 0)
        guard let pinImage = UIImage(named: "LocationPin") else { return }
        
        iskproAnnotationNode = LocationAnnotationNode(location: targetLocation, image: pinImage)
        iskproAnnotationNode?.name = "ISKPRO"
        
        if let annotationNode = iskproAnnotationNode {
            sceneLocationView.addLocationNodeWithConfirmedLocation(locationNode: annotationNode)
        }
    }
}

然后实现代理方法处理位置更新:

extension YourViewController: SceneLocationViewDelegate {
    func sceneLocationViewDidUpdateLocation(_ sceneLocationView: SceneLocationView, location: CLLocation?) {
        guard let userCurrentLocation = location, let targetAnnotation = iskproAnnotationNode else {
            return
        }
        // 计算用户当前位置与标记点的直线距离
        let distanceToTarget = userCurrentLocation.distance(from: targetAnnotation.location)
        // 超过阈值则隐藏标记点,否则显示
        targetAnnotation.isHidden = distanceToTarget > displayThreshold
    }
}

补充说明

  • 如果你的LocationAnnotationNode未直接暴露location属性,可自行在节点类中存储目标位置,或从节点的位置数据中提取经纬度进行计算。
  • 若存在多个标记点,可将所有节点存入数组,在代理方法中循环遍历处理每个节点的显示状态。
  • 可根据需求调整位置更新的频率,避免过于频繁的距离计算影响性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:50:24