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的夹角,分别得到其他两轴的旋转弧度,计算即可。

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