在特定节点周围环绕Scenekit摄像机

时间:2019-02-03 16:28:48

标签: swift scenekit

我很难弄清楚如何让我的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)
        }
    

1 个答案:

答案 0 :(得分:0)

您正在启用相机的手动控制。

scnView.allowsCameraControl = true

如果您想使用例如SCNLookAtConstraint您必须禁用它。否则,您将发生冲突。不应在用户同时旋转相机的同时将相机指向特定位置。

如果您想使用默认的相机控制器,则可以创建一个额外的SCNNode作为行星和飞船的父代。现在可以移动该父节点,使枢轴点位于您想要的位置。