Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SceneKit基础:移动节点_Ios_Uigesturerecognizer_Scenekit - Fatal编程技术网

Ios SceneKit基础:移动节点

Ios SceneKit基础:移动节点,ios,uigesturerecognizer,scenekit,Ios,Uigesturerecognizer,Scenekit,我有一个简单的场景,其中有一个居中的对象,相机位于围绕中心的虚拟球体上(灵感来源于) 现在,我希望能够用两个手指平移的手势移动对象。只要我不先旋转相机,我的代码就可以正常工作。如果我首先将相机旋转180°(以便相机从后面看物体),那么运动方向是错误的(这对我来说是有意义的)。其他摄像机位置的情况更糟。但是,我无法找到如何将识别器的x/y平移转换或投影到平行于相机的平面。物体应该在手指下移动 这是我的场景设置: let scene = SCNScene() //add camer

我有一个简单的场景,其中有一个居中的对象,相机位于围绕中心的虚拟球体上(灵感来源于)

现在,我希望能够用两个手指平移的手势移动对象。只要我不先旋转相机,我的代码就可以正常工作。如果我首先将相机旋转180°(以便相机从后面看物体),那么运动方向是错误的(这对我来说是有意义的)。其他摄像机位置的情况更糟。但是,我无法找到如何将识别器的x/y平移转换或投影到平行于相机的平面。物体应该在手指下移动

这是我的场景设置:

    let scene = SCNScene()

    //add camera
    let camera = SCNCamera()
    camera.usesOrthographicProjection = true
    camera.orthographicScale = 30
    camera.zNear = 1.0
    camera.zFar = 1000

    cameraNode = SCNNode()
    cameraNode.camera = camera
    cameraNode.position = SCNVector3(x: 0.0, y: 0.0, z: 50.0)

    cameraOrbit = SCNNode()
    cameraOrbit.addChildNode(cameraNode)

    scene.rootNode.addChildNode(cameraOrbit)

    boxNode.geometry = SCNBox(width: 10, height: 40, length: 10, chamferRadius: 0.2) 
    scene.rootNode.addChildNode(boxNode)

    let panMoveGestureRecognizer = UIPanGestureRecognizer(target: self, action:#selector(panMoveGesture))
    panMoveGestureRecognizer.minimumNumberOfTouches = 2
    sceneView.addGestureRecognizer(panMoveGestureRecognizer)
以及手势识别器代码:

func panMoveGesture(recognizer: UIPanGestureRecognizer) {

    //move
    let translation = recognizer.translation(in: self.view.superview)
    var newXMovement = -Float(translation.x) * 0.1
    var newYMovement = Float(translation.y) * 0.1

    switch recognizer.state {
        case .began:
            currentXMovement = cameraOrbit.position.x
            currentYMovement = cameraOrbit.position.y
        case .changed:
            newXMovement += currentXMovement
            newYMovement += currentYMovement

            cameraOrbit.position.x = newXMovement
            cameraOrbit.position.y = newYMovement
        case .ended:
            currentXMovement = newXMovement
            currentYMovement = newYMovement
        default: break
    }

}

请帮忙;-)

因此,您希望对象对手势做出响应,就像其轴在摄影机移动时相对于摄影机保持相同的方向一样。例如,假设对象的x轴指向右侧。将相机旋转180°,x轴仍然指向右侧,尽管您现在正在从后面查看对象。这是对的吗?我理解他是这么问的。我想不出一种方法,不将对象附加到相机上,并在相机移动期间对其进行约束。是的,这就是我想要实现的。您是否想到一种方法来比较相机的当前位置和要旋转的对象的方向,以便将变换转换为该关系?我认为这是另一种方法,但不知道如何做。因此,你希望你的对象对手势做出反应,就好像它的轴在相机移动时相对于相机保持相同的方向一样。例如,假设对象的x轴指向右侧。将相机旋转180°,x轴仍然指向右侧,尽管您现在正在从后面查看对象。这是对的吗?我理解他是这么问的。我想不出一种方法,不将对象附加到相机上,并在相机移动期间对其进行约束。是的,这就是我想要实现的。您是否想到一种方法来比较相机的当前位置和要旋转的对象的方向,以便将变换转换为该关系?我认为这是另一种方法,但不知道怎么做。