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