在Scenekit中移动相机

时间:2016-11-15 06:10:07

标签: ios swift scenekit

我有一个关于在没有使用平移手势在SceneKit中旋转而上/下和左/右移动相机的问题。我发现有很多关于旋转相机的讨论,我正在使用它进行旋转。但我无法弄清楚如何在不旋转的情况下移动相机。我试图模仿,allowCameraControl用户可以用两根手指平移来改变相机的x和y位置。这是我的平移手势识别器的代码,非常感谢任何帮助,谢谢!

func handlePan(gestureRecognize: UIPanGestureRecognizer) {

    let numberOfTouches = gestureRecognize.numberOfTouches

    var translation = gestureRecognize.translation(in: gestureRecognize.view!)
    var widthRatio = Float(translation.x) / Float(gestureRecognize.view!.frame.size.width) + lastWidthRatio
    var heightRatio = Float(translation.y) / Float(gestureRecognize.view!.frame.size.height) + lastHeightRatio

    if (numberOfTouches==fingersNeededToPan) {


        self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio
        self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio

        //for final check on fingers number
        lastFingersNumber = fingersNeededToPan
    }

    if numberOfTouches == 2 {

        self.cameraNode.position.x = -(Float(translation.x) / Float(gestureRecognize.view!.frame.size.width) + lastWidthRatio)
        self.cameraNode.position.y = -(Float(translation.y) / Float(gestureRecognize.view!.frame.size.height) + lastHeightRatio)

    }


    lastFingersNumber = (numberOfTouches>0 ? numberOfTouches : lastFingersNumber)

    if (gestureRecognize.state == .ended && lastFingersNumber==fingersNeededToPan) {
        lastWidthRatio = widthRatio
        lastHeightRatio = heightRatio
    }
}

3 个答案:

答案 0 :(得分:4)

如果您想向左/向右或向上/向下滑动,则您不需要cameraOrbit节点(Scenekit camera orbit around object使用的那个节点)。

相反,您只想向左/向右(X轴)或向上/向下(Y轴)滑动以响应触摸。看起来你正在这样做。但是,如果cameraNodecameraOrbit的孩子,那么您将会移动cameraOrbit的坐标系,该坐标系也会被您的手势处理程序轮换!使摄像机节点成为场景的根节点的子节点。

现在,当你的相机没有与根坐标系对齐时,会发生混乱的事情。如果摄像机的X,Y和Z轴与场景的X / Y / Z轴平行,则可以调整摄像机的X / Y位置进行移动。但是,如果相机已旋转或指向Z轴,则需要调整相机节点transform,以便在相机平面中向左/向右或向上/向下移动。我很快就会尝试扩展这个答案,以证明这一点。

答案 1 :(得分:0)

现在,您可以非常简单地做到这一点:

scnView.allowsCameraControl = true
scnView.defaultCameraController.interactionMode = .orbitTurntable
scnView.defaultCameraController.inertiaEnabled = true
scnView.defaultCameraController.maximumVerticalAngle = 89
scnView.defaultCameraController.minimumVerticalAngle = -89

答案 2 :(得分:0)

使用保存的方向移动相机

func stepLeft() {
        print("stepLeft")
        if let pov = view.pointOfView {
            pov.localTranslate(by: SCNVector3(-0.5, 0, 0))
        }
    }
    
    func stepRight() {
        print("stepLeft")
        if let pov = view.pointOfView {
            pov.localTranslate(by: SCNVector3(0.5, 0, 0))
        }
    }