Swift 阿基特&x2013;使用raycastQuery而不是hitTest点击节点,hitTest已被弃用

Swift 阿基特&x2013;使用raycastQuery而不是hitTest点击节点,hitTest已被弃用,swift,augmented-reality,scenekit,arkit,Swift,Augmented Reality,Scenekit,Arkit,在iOS 14中,已弃用。看来你现在该用了。从: 光线投射是在真实环境中查找曲面位置的首选方法,但为了兼容性,命中测试功能仍然存在。通过跟踪光线投射,ARKit将继续优化结果,以提高使用光线投射放置的虚拟内容的位置精度 但是,如何使用光线投射点击testSCNNodes?我只看到了测试飞机的选项 raycastQuery方法文档 允许:的唯一选项是平面 官方文档表明,只有ARKit的hitTest(uxAE:types:)实例方法被弃用。但在iOS 14中,您仍然可以使用它。ARKit的命中测试

在iOS 14中,已弃用。看来你现在该用了。从:

光线投射是在真实环境中查找曲面位置的首选方法,但为了兼容性,命中测试功能仍然存在。通过跟踪光线投射,ARKit将继续优化结果,以提高使用光线投射放置的虚拟内容的位置精度

但是,如何使用光线投射点击test
SCNNode
s?我只看到了测试飞机的选项

raycastQuery
方法文档
允许:
的唯一选项是平面
官方文档表明,只有ARKit的
hitTest(uxAE:types:)
实例方法被弃用。但在iOS 14中,您仍然可以使用它。ARKit的命中测试方法应该被光线投射法所取代

不推荐的命中测试:

let results: [ARHitTestResult] = sceneView.hitTest(sceneView.center, 
                                             types: .existingPlaneUsingGeometry)
光线投射等效物:

let raycastQuery: ARRaycastQuery? = sceneView.raycastQuery(
                                                      from: sceneView.center, 
                                                  allowing: .estimatedPlane, 
                                                 alignment: .any)

let results: [ARRaycastResult] = sceneView.session.raycast(raycastQuery!)
而且不需要为SceneKit的hitTest(uu2;:options:)实例方法寻找替代方法,因为它工作正常,现在不是弃用它的时候


但是,如果您更喜欢光线投射方法来命中节点(实体),请使用RealityKit framework而不是SceneKit:

let arView = ARView(frame: .zero)

let query: CollisionCastQueryType = .nearest
let mask: CollisionGroup = .default
    
let raycasts: [CollisionCastHit] = arView.scene.raycast(from: [0, 0, 0], 
                                                          to: [5, 6, 7],  
                                                       query: query, 
                                                        mask: mask, 
                                                  relativeTo: nil)
    
guard let raycast: CollisionCastHit = raycasts.first else { return }
    
print(raycast.entity.name)

或者使用SceneKit的点击测试。

感谢您的快速回答!但是有没有一种方法可以从
let results:[ARRaycastResult]
获取多维数据集节点?明白了。因此,基本上,如果我仍在使用ARKit+SceneKit,即使它已被弃用,也只需进行命中测试即可。sceneView对象(ARSCNView类型)有3种
hitTest()
方法。其中一个已弃用,返回
[ARHitTestResult]
——用于命中测试检测到的飞机。第二个
hitTest()
返回
UIView?,第三个返回
[SCNHitTestResult]`这对于针对节点的纯场景命中测试非常有用。第三种方法并不是不推荐使用的——您可以将其用于AR应用程序和VR应用程序。因此,在iOS 14的ARSCNView中,您的武器库是2个
hitTest
方法和1个
raycastQuery()
方法。此外,ARSCNView的session对象允许您对检测到的平面应用光线投射方法。但是,如果您使用ARView(ARKit也可以使用RealityKit的视图),则只能使用光线投射方法—
ARView.raycast(…)
(返回[ARRaycastResult]),
ARView.session.raycast(…)
(返回[ARRaycastResult]),
arView.session.trackedRaycast(…)
和2种方法
arView.scene.raycast(…)
hitest
raycast
方法不是来自协议。可以对SceneKit节点使用命中测试,也可以对RealityKit实体使用光线投射。对于ARKit检测到的平面,必须使用
光线投射