在Scenekit中移动相机

5
我有一个关于在SceneKit中使用平移手势上下左右移动相机而不旋转的问题。我已经找到了很多关于旋转相机的讨论,这些讨论对我的旋转非常有用。但是我无法弄清楚如何在不旋转相机的情况下移动相机。我正在尝试模仿allowsCameraControl,用户可以用两个手指平移来改变相机的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
    }
}

为了澄清一下:你想进行侧移,而不改变相机角度吗?例如,我正面向东北,然后我向侧面移动(向左北西,向右南东),同时保持面向东北? - Hal Mueller
是的,我只是想尝试将摄像机左移/右移或上移/下移,而不进行旋转,就像使用allowsCameraControl一样,对于造成的困惑,抱歉@HalMueller。 - Zach Fuller
3个回答

6
现在你可以很简单地做到这一点:
scnView.allowsCameraControl = true
scnView.defaultCameraController.interactionMode = .orbitTurntable
scnView.defaultCameraController.inertiaEnabled = true
scnView.defaultCameraController.maximumVerticalAngle = 89
scnView.defaultCameraController.minimumVerticalAngle = -89

5
如果您想要左右或上下滑动,则不需要使用cameraOrbit节点(这是Scenekit camera orbit around object使用的内容)。
相反,您只需响应触摸向左/右(X轴)或向上/下(Y轴)滑动即可。看起来您正在这样做。但是,如果cameraNodecameraOrbit的子级,则您将在cameraOrbit的坐标系中移动,该坐标系也会被您的手势处理程序旋转!请将相机节点设置为场景根节点的子级。
现在,当您的相机与根坐标系不对齐时,令人困惑的事情发生了。如果相机的X、Y和Z轴与场景的X/Y/Z轴平行,则可以调整相机的X/Y位置进行移动。但是,如果相机已经旋转或朝向Z轴以外,则需要调整相机节点的transform,以在相机平面内向左/右或向上/下移动。我会尽快扩展此答案以进行演示。

2

使用保存的方向移动相机,请使用以下代码:

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))
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接