2016-07-20 17 views
2

Ich versuche eine Kamera zu machen, die sich um ein Objekt dreht. Daher sollte die Kamera an einer Kugel befestigt sein. Dafür habe ich diesen Stapel gefunden, wo der Typ erklärt, wie man ein Setup macht: Rotate SCNCamera node looking at an object around an imaginary sphereSceneKit Kamera Rotation um ein Objekt

Mein Problem ist die Z-Achse der Kamera. Ich kann um X und Y drehen, aber nicht um Z.

Hier ist mein Code:

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

Wenn jemand eine Idee hat, wäre es sehr willkommen sein ;-)

Antwort

0

Sie werden ein brauchen zusätzlicher Gestenerkenner (wahrscheinlich ein UIRotationGestureRecognizer), um die Kamera auf ihrer eigenen Z-Achse zu drehen (wodurch die Ansicht um ihre Mitte herum gedreht wird).