SCNNode的方向和夾角

在三維座標系中,有些時候我們需要知道一個平面(Node)與世界座標系中某個軸(x、y、z)的夾角。然後做一些額外操作。

因爲沒有直接的屬性,只能間接求得。

SCNNode 有屬性

  • simdOrientation : 節點的方向,表示爲四元數。 可動畫的。
  • simdWorldOrientation: 節點相對於場景的世界座標空間的方向。

simdRotationsimdEulerAnglessimdOrientation屬性都會影響節點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
  1. angle * x 表示沿X軸的正方向順時針(結果爲正時,負則逆時針),旋轉的弧度
  2. angle * y 表示沿Y軸的正方向順時針(結果爲正時,負則逆時針),旋轉的弧度
  3. angle * z 表示沿Z軸的正方向順時針(結果爲正時,負則逆時針),旋轉的弧度

瞭解了orientation方向的設置後,如何計算一個Node相對於世界座標系Y軸的夾角呢?

通過上面例子,可以看出,如果要計算與Y軸的夾角,那不管驗Y軸是順時針還是逆時針,不管旋轉多少弧度,對計算與世界座標系Y軸的夾角沒有任何影響。

我們再看下在保持Z軸不變,沿X軸的旋轉,比如下面沿X軸正方向旋轉90°後,與世界座標系Y軸的夾角就是90°

同樣的,X 軸不變,如果沿Z軸旋轉角度後,與世界座標系Y軸的夾角也是Z軸的旋轉角度。

可知,要計算與 Y 軸的夾角,就是 XZ 的最大角。

x弧度 :simdWorldOrientation.axis.x * simdWorldOrientation.angle
z弧度 :simdWorldOrientation.axis.z * simdWorldOrientation.angle

需要度數:再乘以 180.0 / .pi

同理,如果需要計算旋轉後與XZ的夾角,分別得到其他兩軸的旋轉弧度,計算即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章