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
相关产品推荐
相关产品推荐

