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
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? –
Ich werde versuchen, an den Eltern/Kind-Eigenschaften zu arbeiten und auf Sie zurückkommen. Viele – Ynamy