在保持速度的同时沿着X轴拖动SceneKit节点? 斯威夫特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)附近,我不希望球体“传送”到用户点击的位置。 我希望用户从最后位置拖动球体。

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 } 

我只想让我的球体节点的x位置反映我的手指相对于屏幕的真实世界x位置

您可以使用UIPanGestureRecognizer并在视图的坐标系中进行转换 。

 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值,请参阅unProjectPoint Discussion,其中z表示您应该相对于视锥体的近和远剪切平面取消投影的深度。

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

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