Weird Scenekit камера вращения и перевода - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь анимировать между двумя положениями камеры, используя узел точки обзора.

Я хочу, чтобы анимация имитировала анимацию, которую я получаю, когда я нажимаю и перетаскиваю контроллер камеры с орбитальной дугой, который в большинстве случаев является очень коротким маршрутом.

Как вы можете видеть нафильм ниже, анимация выглядит странно.Это занимает большие объезды.Иногда из окна просмотра.

Это ситуация блокировки карданного подвеса?Я получаю одинаковые результаты, использую ли я rotation, eulerAngles или просто устанавливаю преобразование.Вы можете увидеть мои различные попытки, закомментированные в коде ниже

enter image description here

Вот весь код:

import Cocoa
import SceneKit
class ViewController: NSViewController {

@IBOutlet weak var scnView: SCNView!
@IBOutlet weak var button: NSButton!

var secondaryPov : SCNNode!

var phoneNode : SCNNode!

var destination : SCNNode!

override func viewDidLoad() {
    super.viewDidLoad()

    guard let scn = SCNScene(named: "TestScene.scnassets/TestScene.scn") else {
        print("couldnt load the scene")
        fatalError()
    }

    scnView.scene = scn

    phoneNode = scn.rootNode.childNode(withName: "box", recursively: true)

    scnView.allowsCameraControl = true
    scnView.defaultCameraController.interactionMode = .orbitArcball

    print(scnView.pointOfView)
}

@IBAction func button(_ sender: Any) {
    print("bushed")
    print("point of view is now ")
    print(scnView.pointOfView)

    destination = SCNNode()
    destination.position = scnView.pointOfView!.position
    destination.rotation = scnView.pointOfView!.rotation

}

@IBAction func play(_ sender: Any) {
    let pov = scnView.pointOfView!

    SCNTransaction.begin()
    SCNTransaction.animationDuration = 3
    pov.transform = destination.transform
    SCNTransaction.commit()


    // A few other things I've tried


    // Also tried this. Rotation still weird, and I don't want to lock the object in the middle
    //        let lookAt = SCNLookAtConstraint(target: phoneNode)
    //        lookAt.isGimbalLockEnabled = false
    //        pov.constraints = [lookAt]


    //  This seems to produce the same results
    //        let rotationAction = SCNAction.rotateTo(x: destination.eulerAngles.x, y: destination.eulerAngles.y, z: destination.eulerAngles.z,  duration: 1, usesShortestUnitArc: true)
    //        let positionAction = SCNAction.move(to: destination.position, duration: 1)
    //        let group = SCNAction.group([rotationAction, positionAction])
    //        pov.runAction(group)



    // Same weird rotation
    //        SCNTransaction.begin()
    //        pov.pivot = phoneNode.pivot
    //        SCNTransaction.animationDuration = 3
    //        pov.position = destination.position
    //        pov.rotation = destination.rotation
    //        SCNTransaction.commit()


}

}

...