在保持速度的同时沿 X 轴拖动 SceneKit 节点? Swift 3

Drag SceneKit Node Along X-Axis while maintaining velocity? Swift 3

Swift 3、SceneKit:在我的游戏中,我在屏幕中央有一个SCNSphere节点。球体通过重力落到 SCNBox 节点上,一旦它与盒子碰撞,就会应用 SCNVector3(0,6,0) 的速度。

创建了一个新框并向前移动 (z+) 朝向我的相机和球体。球体上升、达到峰值,然后(通过重力)向新盒子回落,当它与新盒子碰撞时,将对其应用 SCNVector(0,6,0) 的速度。这个过程不断重复。基本上,一个在新接近的盒子上反复反弹的球体。

但是,不是只有一个盒子,而是一排三个盒子。所有的盒子都从球体节点的前面开始,并在创建时向它移动,盒子排成一排,一个在球体的左边,一个在球体的正前方(中间),第三个到球体的右侧。

我希望能够在屏幕上拖动我的手指并移动我的球体,以便它可以落在左右方框上。 当我拖动时,我根本不想改变 y 速度或 y 位置。我只想让我的球体节点的 x 位置反映我的手指相对于屏幕的真实世界 x 位置。 我也不希望球体节点仅根据触摸改变位置

例如,如果球体的位置在 SCNVector3(2,0,0),并且如果用户在 SCNVector3(-2,0,0) 附近点击,我不希望球体 "teleport" 到用户点击的位置。我希望用户从最后一个位置拖动球体。

func handlePan(recognizer: UIPanGestureRecognizer) {

    let sceneView = self.view as! SCNView
    sceneView.delegate = self
    sceneView.scene = scene


    let trans:SCNVector3 = sceneView.unprojectPoint(SCNVector3Zero)
    let pos:SCNVector3 = player.presentation.position
    let newPos = (trans.x) + (pos.x)
    player.position.x = newPos
}

I just want the x-position of my sphere node to mirror the real-world x-position of my finger relative to the screen

您可以在视图的坐标系中使用 UIPanGestureRecognizer and getting the translation 来完成此操作。

let myPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
let trans2D:CGPoint = myPanGestureRecognizer.translation(in:self.view)
let transPoint3D:SCNVector3 = SCNVector3Make(trans2D.x, trans2D.y, <<z>>)

关于 z 值,请参阅 unProjectPoint 讨论,其中说 z 应该是指相对于视锥体的近和远剪裁平面要取消投影的深度。

然后您可以将平移取消投影到场景的 3D 世界坐标系,这将为您提供球体节点的平移。部分示例代码:

let trans:SCNVector3 = sceneView.unProjectPoint(transPoint3D)
let pos:SCNVector3 = sphereNode.presentationNode.position
let newPos:SCNVector3 = // trans + pos
sphereNode.position = newPosition