从 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:)
我的应用程序涉及用户将他们的 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:)