【问题标题】:Orbit Scenekit camera around specific node围绕特定节点环绕 Scenekit 摄像机
【发布时间】:2019-06-27 12:52:54
【问题描述】:

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

【问题讨论】:

    标签: swift scenekit


    【解决方案1】:

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

    scnView.allowsCameraControl = true

    如果你想使用例如SCNLookAtConstraint 你必须禁用它。否则你有冲突。相机不应该在被用户旋转的同时指向某个位置。

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

    【讨论】:

    • 我添加了父节点,但移动它的轴心点并没有达到我的预期(围绕玩家飞船运行)。在相机绕船和行星之间的某个点运行的情况下,似乎仍然具有相同的效果。感觉就像默认相机有一个设置,它试图始终在屏幕上显示两个对象或其他东西......我也会考虑创建自己的。令人沮丧的苹果让它看起来像是他们在 2017 年 WWDC 视频中解决了一堆相机问题。
    猜你喜欢
    • 2018-07-05
    • 2020-08-25
    • 2019-03-29
    • 2023-04-07
    • 2016-11-23
    • 2016-09-10
    • 2014-10-05
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多