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

ARKit中hitTest无法识别平面后方节点的技术问题咨询

解决ARKit中HitTest无法识别平面后方虚拟节点的问题

嘿,这个坑我之前踩过!ARKit默认的hitTest行为确实会让你头疼——它优先检测真实世界的平面锚点,而把那些在平面“后方”(Z轴坐标比平面更远)的虚拟节点直接忽略了,这就是你调整Z轴靠近相机才有用的原因。

核心问题:你用错了hitTest方法

你当前调用的sceneView.hitTest(point, types:)是针对真实世界AR锚点的检测方法,它会优先返回真实平面、特征点这些真实世界的结果,完全不会考虑虚拟节点的位置。而你需要的是针对SceneKit场景内虚拟节点的检测,得换另一个方法。

正确的解决方案:改用场景节点的hitTest

使用sceneView.hitTest(_:options:)方法,它专门用来检测SceneKit场景中的虚拟节点,不管真实平面的位置。你只需要配置对应的选项,让它搜索所有可见节点:

fileprivate func addNode(atPoint point: CGPoint) {
    // 配置hitTest选项:搜索所有节点,忽略隐藏节点
    let hitTestOptions: [SCNHitTestOption: Any] = [
        .searchMode: ARHitTestSearchMode.all.rawValue,
        .ignoreHiddenNodes: true
    ]
    // 执行针对虚拟节点的hitTest
    let hits = sceneView.hitTest(point, options: hitTestOptions)
    
    if let firstHit = hits.first {
        // 获取被点击的虚拟节点
        let tappedNode = firstHit.node
        // 这里添加你的业务逻辑,比如选中节点、修改属性等
        print("成功点击节点:\(tappedNode.name ?? "未命名节点")")
    } else {
        // 没有检测到节点时的处理
        print("未检测到可点击的虚拟节点")
    }
}

额外优化建议

  • 如果你需要同时支持“点击虚拟节点”和“点击真实平面添加节点”的场景,可以先执行虚拟节点的hitTest,若没有结果,再执行真实平面的hitTest:
    let nodeHits = sceneView.hitTest(point, options: hitTestOptions)
    if !nodeHits.isEmpty {
        // 处理虚拟节点点击
    } else {
        let planeHits = sceneView.hitTest(point, types: .existingPlaneUsingExtent)
        // 处理真实平面点击
    }
    
  • 检查你的虚拟节点是否设置了isHidden = true,或者geometry没有正确加载——这些都会导致hitTest无法检测到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:50:04