2016-07-22 7 views
0

Ich versuche, die Kameraverwaltung in SceneKit zu rekodieren. Dafür benutze ich UIPanGestureRecognizer für die Drehung der Kamera um ein Objekt (In diesem Fall um das Zentrum der Szene).SceneKit Untergeordnete Knotenposition wurde während der Rotation des übergeordneten Knotens nicht geändert

Als nächstes erhalte ich das unterschiedliche Verhältnis oder die Länge, um den Winkel zu bestimmen, der an den Achsen (X, Y, Z) der imaginären Kugel hinzugefügt werden soll (Kamera im Code).

Mein Problem ist, dass ich die Position der Kamera verwende, um den Winkel zu bestimmen, der an der Kugel hinzugefügt wird. Aber die Position ist konstant. Wenn ich die Kugeldrehung ändere, wird die Position der Kindknotenkamera niemals aktualisiert. Dann ändert sich der Winkel nie.

import SceneKit 
import UIKit 

class SceneManager 
{ 
    private let scene: SCNScene 
    private let view: SCNView 
    private let camera: SCNNode 
    private let cameraOrbit: SCNNode 
    private let cameraRadius: Float 

    init(view: SCNView, assetFolder: String, sceneName: String, cameraName: String, backgroundColor: UIColor) { 
     self.view = view 
     self.scene = SCNScene(named: (assetFolder + "/" + sceneName))! 
     if (self.scene.rootNode.childNodeWithName(cameraName, recursively: true) == nil) { 
      print("Fatal error: Cannot find camera in scene with name :\"", cameraName, "\"") 
      exit(1) 
     } 
     self.camera = self.scene.rootNode.childNodeWithName(cameraName, recursively: true)! // Retrieve cameraNode created in scene file 
     self.cameraOrbit = SCNNode() 
     self.cameraOrbit.addChildNode(self.camera) 
     self.cameraRadius = sqrt(pow((self.camera.position.x), 2) + pow(self.camera.position.y, 2)) // CameraOrbit radius for rotation camera in panHandler 
     self.scene.rootNode.addChildNode(self.cameraOrbit) 
     let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panHandler(_:))) 
     panGesture.maximumNumberOfTouches = 1 
     self.view.addGestureRecognizer(panGesture) 
     self.view.backgroundColor = backgroundColor 
     self.view.pointOfView = self.camera 
     self.view.scene = self.scene 
    } 

    @objc private func panHandler(sender: UIPanGestureRecognizer) { 
     let alpha = cos(self.camera.position.z/self.cameraRadius) // Get angle of camera 

     // -- 
     print(self.camera.position) // <-------- (X, Y, Z) The axes position are always the same 
     // -- 

     var ratioX = 1 - ((CGFloat)(alpha)/(CGFloat)(M_PI)) // Get the radio with angle for apply to Z and X axes rotation 
     var ratioZ = ((CGFloat)(alpha)/(CGFloat)(M_PI)) 
     // Change direction of rotation depending camera's position in trigonometric circle 
     if (self.camera.position.z > 0 && self.camera.position.x < 0) { 
      ratioZ *= -1 
     } else if (self.camera.position.z < 0 && self.camera.position.x < 0) { 
      ratioX *= -1 
      ratioZ *= -1 
     } else if (self.camera.position.z > 0 && self.camera.position.x > 0) { 
      ratioX *= -1 
     } 
     // Set the angle rotation to add at imaginary sphere (cameraOrbit) 
     let xAngleToAdd = (sender.velocityInView(sender.view!).y/10000) * ratioX 
     let yAngleToAdd = (sender.velocityInView(sender.view!).x/10000) * (-1) 
     let zAngleToAdd = (sender.velocityInView(sender.view!).y/10000) * ratioZ 
     let rotation = SCNAction.rotateByX(xAngleToAdd, y: yAngleToAdd, z: zAngleToAdd, duration: 0.5) 
     self.cameraOrbit.runAction(rotation) 
    } 
} 

Wenn jemand eine Idee hat? Dank

+0

Ich habe festgestellt, dass Sie von "self.rootNode.childNodeWithName" auf "cameranode" verweisen. Und dann rufe 'self.camearOrbit.addChildNode (self.cameranode)' auf. Solltest du nicht 'self.cameranode.removeFromParentNode' nennen, bevor du den cameranode zum cameraOrbit hinzufügst? –

+0

Ich werde versuchen, an den Eltern/Kind-Eigenschaften zu arbeiten und auf Sie zurückkommen. Viele – Ynamy

Antwort

1

Wenn Sie den übergeordneten Knotens aktualisieren die untergeordneten Knoten Transformation (Position, Rotation, Skalierung), bleibt Transformation unverändert in lokalen Koordinaten (relativ zum übergeordneten), ist es nur Veränderungen in Weltkoordinaten.

Wenn Sie die Welt verändern für einen bestimmten Knoten zugreifen möchten, verwenden Sie die worldTransform Eigenschaft.

+0

Ja, ich weiß, daß aber, wenn ich die Position mit „self.camera.position“ abrufen, erhalte ich die Weltposition? Das Zentrum der Kugel ist 0,0,0. Wie kann ich dann die Weltposition bekommen? – Ynamy

Verwandte Themen