在Scenekit中移动相机

Zac*_*ler 3 ios scenekit swift

我有一个问题,关于上下左右移动相机而不用摇动手势在SceneKit中旋转。我已经找到了很多有关旋转相机的讨论,这些旋转我正在使用它。但是我不知道如何在不旋转照相机的情况下移动照相机。我正在尝试模仿,允许用户用两根手指平移以更改相机的x和y位置的allowCameraControl。这是我的平移手势识别器的代码,任何帮助将不胜感激,谢谢!

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
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

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

scnView.allowsCameraControl = true
scnView.defaultCameraController.interactionMode = .orbitTurntable
scnView.defaultCameraController.inertiaEnabled = true
scnView.defaultCameraController.maximumVerticalAngle = 89
scnView.defaultCameraController.minimumVerticalAngle = -89
Run Code Online (Sandbox Code Playgroud)


Hal*_*ler 5

如果要向左/向右或向上/向下滑动,则不需要cameraOrbit节点(这是对象周围Scenekit摄像机轨道所使用的节点)。

相反,您只想向左/向右(X轴)或向上/向下(Y轴)滑动以响应触摸。看来您正在这样做。但是,如果cameraNode是的子代cameraOrbit,您将在的坐标系中移动,该坐标系cameraOrbit也由手势处理程序旋转!将相机节点设为场景根节点的子节点。

现在,当您的相机未与根坐标系对齐时,就会发生令人困惑的事情。如果摄像机的X,Y和Z轴与场景的X / Y / Z轴平行,则可以调整摄像机的X / Y位置进行移动。但是,如果旋转了摄像机或将其指向Z轴之外,则需要调整摄像机节点的transform,以在摄像机平面中向左/向右或向上/向下移动。我会尽快扩大这个答案,以证明这一点。