如何在不干扰轨道功能的情况下将 UIPanGestureRecognizer 应用于场景?

How to apply a UIPanGestureRecognizer to a scene without disturbing the orbit function?

以我们在Xcode中新建一个Game类型的项目时生成的示例场景为例。它将显示一艘旋转的 space 飞船。该对象允许用户通过手指移动在所有方向上转动它。我在这里需要的是能够识别用户是否已经开始使用 3D 对象进行那种类型的移动。我使用以下代码将 UIPanGestureRecognizer 添加到场景视图中:

    let panGesture = UIPanGestureRecognizer(target: self, action: 
    #selector(handlePan(_:))) scnView.addGestureRecognizer(panGesture)
    
@objc
func handlePan(_ gestureRecognize: UIGestureRecognizer) {
      print("in handle Pan")
 }

这在这方面起作用,当手指移动时,消息会出现在控制台中。但是现在的问题是 space 船不再对这种运动做出反应。合乎逻辑的,因为 UIPanGestureRecognizer 捕获了该事件。现在的问题是:怎样才能既保留3D模型的轨道功能,又得到平移手势的反应?

您可以在 SCNView 上使用 hit testing(命中测试实际上是 SCNSceneRenderer 的一部分)来确定手势的开始是否在您关心的任何节点上.您可以使用类别位掩码将其缩小到您关心的节点。

在手势识别器的委托方法中进行命中测试,可能gestureRecognizerShouldBegin。 Return 如果触摸没有击中您关心的东西,则为 false。这应该允许您与节点交互,同时如果您没有触摸该节点则保持相机控制。

您还需要在委托中实现 shouldRecgonizeSimultaneouslyWith,并且 return 为 true 以便仍然处理相机平移手势。