从 device/camera 位置沿 Y 轴进行命中测试?

Hit test along the Y axis from the device/camera location?

我的应用程序涉及用户将他们的 phone 像遥控器一样指向虚拟节点,而不是 'AR window'。 (参见插图。)这些节点是手动放置在环境中的,并未锚定到物理平面。他们会漂浮。

为此,我需要从 camera/screen 中心沿 Y 轴投射并测试沿该射线的任何命中。在 Unity 中,我会通过从相机的 transform.top 进行 Raycast 命中测试来做到这一点,但我不确定如何在 SceneKit 中做到这一点。

我在 Z 轴上使用 sceneView.hitTest 取得了成功,但这不是我的最终用例。我也尝试过使用 scene.hitTestWithSegment(),使用相机世界 space 作为 from,但我不确定如何获得 to。我猜我需要沿着局部 Y 轴投射一条光线并沿着它得到一个点,这只会让我回到原来的问题。

关于在哪里查看的任何提示?从 SceneKit 中的本地 transform.top 投射是否有类似的便利?

提前谢谢!

插图:

** 更新 **

根据下面 Josh Homann 的回答,我最终是这样解决的:

// Set local segment end and convert to world space
let segmentLocalEnd:SCNVector3 = SCNVector3(0,20,0)
let segmentWorldEnd:SCNVector3 = sceneView.pointOfView!.convertPosition(segmentLocalEnd, to: nil)
// Get hits
let hitResults:[SCNHitTestResult] = scene.hitTestWithSegment(
    from: sceneView.pointOfView!.worldPosition,
    to: segmentWorldEnd,
    options: [SCNHitTestOption.firstFoundOnly.rawValue: true]
)

您已经有了大部分答案。在 AR 视图中,您将沿着观察向量从相机投射一条射线。在你的情况下,虽然你想垂直于观察向量,但你只是从相机沿着向上向量 (0,1,0) 投射光线(假设你没有旋转你的 space 和正 Y 向上)。在 SceneKit 中,您实际上无法沿着无限射线进行测试,因此只需选择一个足够大的值并将其传递给 hitTestWithSegment(from:to:options:)