SceneKit相机围绕一个物体旋转

时间:2016-07-20 10:01:04

标签: swift trigonometry scenekit

我试图制作一个围绕物体旋转的相机。因此,相机应连接到球体上。为此我找到了这个堆栈,其中该人解释了如何进行设置:Rotate SCNCamera node looking at an object around an imaginary sphere

我的问题是相机的Z轴。我可以围绕X和Y旋转,但不能绕Z旋转。

这是我的代码:

class SceneManager
{
private let scene: SCNScene
private let view: SCNView
private let cameraOrbit: SCNNode
private var cameraOrbitLastRatioWidth: Float = 0
private var cameraOrbitLastRatioHeight: Float = 0.2
private var maxWidthRatioRight: Float = 0.2
private var maxWidthRatioLeft: Float = -0.2
private var maxHeightRatioXDown: Float = 0.02
private var maxHeightRatioXUp: Float = 0.4

init(view: SCNView, assetFolder: String, sceneName: String, cameraName: String, backgroundColor: UIColor) {
    self.view = view
    self.scene = SCNScene(named: (assetFolder + "/" + sceneName))!
    self.view.pointOfView = self.scene.rootNode.childNodeWithName(cameraName, recursively: true)
    if self.view.pointOfView == nil {
        print("Error: Inexistent camera specified in init SceneManager")
        exit(1)
    }
    self.cameraOrbit = SCNNode()
    self.cameraOrbit.addChildNode(self.view.pointOfView!)
    self.scene.rootNode.addChildNode(self.cameraOrbit)
    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panHandler(_:)))
    panGesture.maximumNumberOfTouches = 1
    self.view.allowsCameraControl = false
    self.view.addGestureRecognizer(panGesture)
    self.view.backgroundColor = backgroundColor
    self.view.scene = self.scene
}

@objc private func panHandler(sender: UIPanGestureRecognizer) {
    let translation = sender.translationInView(sender.view!)
    let ratioWidth = Float(translation.x) / Float(sender.view!.frame.size.width) + self.cameraOrbitLastRatioWidth
    let ratioHeight = Float(translation.y) / Float(sender.view!.frame.size.height) + self.cameraOrbitLastRatioHeight
    if (sender.state == UIGestureRecognizerState.Changed) {
        if self.cameraOrbitLastRatioWidth >= maxHeightRatioXUp {
            self.cameraOrbitLastRatioWidth = maxHeightRatioXUp
        }
        if self.cameraOrbitLastRatioWidth <= maxHeightRatioXDown {
            self.cameraOrbitLastRatioWidth = maxHeightRatioXDown
        }
        if self.cameraOrbitLastRatioHeight >= maxWidthRatioRight {
            self.cameraOrbitLastRatioHeight = maxWidthRatioRight
        }
        if self.cameraOrbitLastRatioHeight <= maxWidthRatioLeft {
            self.cameraOrbitLastRatioHeight = maxWidthRatioLeft
        }
        self.cameraOrbit.eulerAngles.y -= Float(M_PI_4 * 3) * ratioWidth
        self.cameraOrbit.eulerAngles.x -= Float(M_PI_4) * ratioHeight
    }
    if (sender.state == UIGestureRecognizerState.Ended) {
        self.cameraOrbitLastRatioWidth = ratioWidth
        self.cameraOrbitLastRatioHeight = ratioHeight
    }
}
}

如果有人有想法,那将非常受欢迎; - )

1 个答案:

答案 0 :(得分:0)

您需要一个额外的手势识别器(可能是UIRotationGestureRecognizer)来在相应的Z轴上旋转相机(有效地围绕其中心旋转视图)。