ios - 在 Scenekit 中移动相机

标签 ios swift scenekit

我有一个关于在 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
    }
}

最佳答案

如果你想向左/向右或向上/向下滑动,那么你不需要 cameraOrbit 节点(这就是 Scenekit camera orbit around object 使用的)。

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

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

关于ios - 在 Scenekit 中移动相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40603162/

相关文章:

ios - 在Mac上通过xCode使用OpenCL

ios - 用于注释的分段 Controller

swift - 我如何在 SceneKit 中组合物理场?

ios - Scene Kit 联系 catagoryBitMasks 总是返回 1

ios kSecClassCertificate 产量 -25303

ios - 以编程方式创建 GridView

ios - 滚动 UICollectionView 时如何自定义在顶部屏幕上粘滞的标题 View ?

ios - 在执行 unwindSegue 之前检查 UIViewController 是否已初始化

ios - 圆形SKShapeNode在SceneKit overlay中使用时显示为正方形

ios - 调试 IBDesignable - 调试选定的 View 不工作