我很难弄清楚如何让我的SceneKit相机围绕游戏中的特定节点旋转。
如果我的场景中只有一个节点(一艘船)和一台摄像机,则一切正常。如果我添加一个额外的节点(一个行星),则摄像机的轴心点似乎会从我的飞船更改为飞船与星球之间的空间。
我尝试过的事情:
更改相机枢轴点
示例:
class TestSceneViewController: UIViewController, SCNSceneRendererDelegate {
var scnView: SCNView = SCNView()
var scnScene: SCNScene!
var cameraNode: SCNNode!
var ship: SCNNode!
override func viewDidLoad() {
super.viewDidLoad()
setupView()
setupScene()
setupCamera()
...
func setupView() {
// scnView = self.view as! SCNView
// retrieve the SCNView
scnView = SCNView(frame: view.frame)
scnView.showsStatistics = true
view.addSubview(scnView)
scnView.allowsCameraControl = true
scnView.defaultCameraController.interactionMode = .orbitTurntable
scnView.defaultCameraController.inertiaEnabled = true
scnView.delegate = self
scnView.isPlaying = true
scnView.loops = true
}
func setupScene () {
scnScene = SCNScene()
scnView.scene = scnScene
let ships = SCNScene(named: "art.scnassets/simpleshuttle3.scn")
ship = ships!.rootNode.childNode(withName: "ship", recursively: true)
ship?.position = SCNVector3(x: 0, y: 0, z: 0)
scnScene.rootNode.addChildNode(ship!)
let planets = SCNScene(named: "art.scnassets/sphere.scn")!
if let planet = planets.rootNode.childNode(withName: "Ball", recursively: true){
planet.position = SCNVector3(x: 0, y: 0, z: 40)
scnScene.rootNode.addChildNode(planet)
}
}
func setupCamera() {
cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: ship.position.x, y: ship.position.y, z: 80)
cameraNode.camera?.motionBlurIntensity = 1.0
cameraNode.camera?.automaticallyAdjustsZRange = true
scnScene.rootNode.addChildNode(cameraNode)
}
答案 0 :(得分:0)
您正在启用相机的手动控制。
scnView.allowsCameraControl = true
如果您想使用例如SCNLookAtConstraint
您必须禁用它。否则,您将发生冲突。不应在用户同时旋转相机的同时将相机指向特定位置。
如果您想使用默认的相机控制器,则可以创建一个额外的SCNNode
作为行星和飞船的父代。现在可以移动该父节点,使枢轴点位于您想要的位置。