創建全零的SCNQuaternion
並不真正意味着什麼。您已經沿着由全零「單位」向量指定的軸指定了0的旋轉。如果您嘗試使用此代碼的修改版本,則在嘗試更改topNode
的方向後,您將看不到任何更改。你還在周圍旋轉的軸的全部3個分量爲零:
let topNode = SCNNode()
topNode.camera = frontCamera
topNode.position = SCNVector3(4, 0, 0)
print(topNode.orientation, topNode.rotation)
-> SCNVector4(x: 0.0, y: 0.0, z: 0.0, w: 1.0) SCNVector4(x: 0.0, y: 0.0, z: 0.0, w: 0.0)
topNode.orientation = SCNQuaternion(0, 0, 0, 0)
print(topNode.orientation, topNode.rotation)
->SCNVector4(x: 0.0, y: 0.0, z: 0.0, w: 1.0) SCNVector4(x: 0.0, y: 0.0, z: 0.0, w: 3.14159)
你已經搬出了X軸4個單位將相機(topNode.position
)。按照通常的方向,這意味着4個單位在右側,正Y從屏幕底部運行到頂部,並且正Z從屏幕跑出到您的眼睛。你想圍繞Y軸旋轉。相機的方向是沿着其父節點的負Z軸。因此,讓我們1/4順時針方式旋轉,並嘗試設置rotation
代替(比四元數容易,我想):
topNode.rotation = SCNVector4Make(0, 1, 0, Float(M_PI_2))
print(topNode.orientation, topNode.rotation)
-> SCNVector4(x: 0.0, y: 1.0, z: 0.0, w: -4.37114e-08) SCNVector4(x: 0.0, y: 1.0, z: 0.0, w: 3.14159)
你可能會發現它有用註銷,甚至顯示,相機節點rotation
,orientation
和eulerAngles
(它們都表達相同的概念,只是使用不同的軸),因爲您在手動操作相機時。
爲了完整起見,這裏的整個viewDidLoad
:
@IBOutlet weak var sceneView: SCNView!
override func viewDidLoad() {
super.viewDidLoad()
sceneView.scene = SCNScene()
let sphere = SCNSphere(radius: 1.0)
let sphereNode = SCNNode(geometry: sphere)
sceneView.scene?.rootNode.addChildNode(sphereNode)
let frontCamera = SCNCamera()
frontCamera.yFov = 45
frontCamera.xFov = 45
let topNode = SCNNode()
topNode.camera = frontCamera
topNode.position = SCNVector3(4, 0, 0)
sceneView.scene?.rootNode.addChildNode(topNode)
print(topNode.orientation, topNode.rotation)
topNode.orientation = SCNQuaternion(0, 0, 0, 0)
print(topNode.orientation, topNode.rotation)
topNode.rotation = SCNVector4Make(0, 1, 0, Float(M_PI_2))
print(topNode.orientation, topNode.rotation)
}
問題就迎刃而解了。非常感謝!! –
請將答案標記爲已接受,而不是留下「謝謝」意見。 –