在三維座標系中,有些時候我們需要知道一個平面(Node
)與世界座標系中某個軸(x、y、z
)的夾角。然後做一些額外操作。
因爲沒有直接的屬性,只能間接求得。
SCNNode
有屬性
-
simdOrientation
: 節點的方向,表示爲四元數。 可動畫的。 -
simdWorldOrientation
: 節點相對於場景的世界座標空間的方向。
simdRotation
,simdEulerAngles
和simdOrientation
屬性都會影響節點simdTransform
屬性的旋轉角度。 這些屬性之一的任何更改都會反映在其他屬性中。
如果你要設置此屬性:
// 創建一個新的四元數,該四元數的動作是圍繞指定軸的指定旋轉。
node.simdOrientation = simd_quatf(angle: .pi / 2.0 , axis: [0, 1, 0])
上面代碼是把node
沿Y
軸正方向順時針旋轉90°
-
angle
: 弧度 -
axis
:SIM3<Float>[x, y, z]
分別代表x, y, z
軸
-
angle * x
表示沿X
軸的正方向順時針(結果爲正時,負則逆時針),旋轉的弧度 -
angle * y
表示沿Y
軸的正方向順時針(結果爲正時,負則逆時針),旋轉的弧度 -
angle * z
表示沿Z
軸的正方向順時針(結果爲正時,負則逆時針),旋轉的弧度
瞭解了orientation
方向的設置後,如何計算一個Node
相對於世界座標系Y
軸的夾角呢?
通過上面例子,可以看出,如果要計算與Y
軸的夾角,那不管驗Y
軸是順時針還是逆時針,不管旋轉多少弧度,對計算與世界座標系Y
軸的夾角沒有任何影響。
我們再看下在保持Z
軸不變,沿X
軸的旋轉,比如下面沿X
軸正方向旋轉90°
後,與世界座標系Y
軸的夾角就是90°
同樣的,X
軸不變,如果沿Z
軸旋轉角度後,與世界座標系Y
軸的夾角也是Z
軸的旋轉角度。
可知,要計算與 Y
軸的夾角,就是 X
、Z
的最大角。
x
弧度 :simdWorldOrientation.axis.x * simdWorldOrientation.angle
z
弧度 :simdWorldOrientation.axis.z * simdWorldOrientation.angle
需要度數:再乘以 180.0 / .pi
同理,如果需要計算旋轉後與X
、Z
的夾角,分別得到其他兩軸的旋轉弧度,計算即可。