我正在尝试使用“视点”节点在两个相机位置之间进行动画处理。
我希望动画模仿我单击并拖动轨道弧球摄像机控制器时得到的动画,这在大多数情况下是一条非常短的路线。
正如您在下面的电影中看到的那样,动画看起来很奇怪。绕道而行。有时不在视口中。
是否有万向节锁定情况?无论我使用的是rotation
,eulerAngles
还是只是设置转换,都得到相同的结果。您可以在下面的代码中看到我的各种尝试已被注释掉
这是完整的代码:
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()
}
}