父节点旋转期间,SceneKit子节点位置未更改
我试图在SceneKit中重新编码摄像头pipe理。 为此,我使用UIPanGestureRecognizer围绕一个物体(在这种情况下围绕场景的中心)旋转相机。
接下来,我得到不同的比例或长度来确定在相机所在的虚拟球体的轴(X,Y,Z)上添加的angular度(cameraOrbit in code)。
我的问题是,我使用相机的位置来确定在球体上添加的angular度。 但是这个位置是不变的。 当我改变球体旋转时,子节点相机的位置永远不会更新。 那么angular度不会改变。
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) } }
如果有人有一个想法? 谢谢
当您更新父节点的变换(位置,旋转,缩放)时,子节点的变换在本地坐标(相对于父元素)中保持不变,仅在世界坐标中变化。
如果要访问给定节点的世界变换,请使用worldTransform属性。