Swift 3,SceneKit:在我的游戏中,我在屏幕中央有一个SCNSphere节点。球体通过重力下降到SCNBox节点上,一旦它与盒子碰撞,SCNVector3(0,6,0)的速度就会施加到它上面。
创建一个新框并向前(z +)向我的相机移动并朝向球体移动。球体上升,峰值,然后向下(通过重力)朝向新的盒子,当它与新盒子碰撞时,SCNVector(0,6,0)的速度被施加到它。这个过程不断重复。一个球体,在一个新的接近盒子上反复弹跳,基本上。
然而,不是一个盒子,而是连续三个盒子。所有的盒子都在球体节点的前面开始,并在它们被创建时向它移动,盒子放在一排,一个放在球体的左边,一个放在球体的前面(中间),第三个放在球体的权利。
我希望能够将手指拖过屏幕并移动我的球体,使其落在左右两侧的盒子上。 在我拖动时,我不希望y-velocity或y-position完全改变。我只想让我的球体节点的x位置反映我的手指相对于屏幕的真实世界x位置。 我也不希望球节点根据单独触摸来更改位置。
例如,如果球体的位置位于SCNVector3(2,0,0),并且用户点击SCNVector3(-2,0,0)附近,我不希望球体为&# 34;传送术"到用户点击的位置。我希望用户从最后位置拖动球体。
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
}
答案 0 :(得分:3)
我只想让我的球体节点的x位置反映我的手指相对于屏幕的真实世界x位置
您可以使用UIPanGestureRecognizer并在视图的坐标系中获取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