ARVR

SCNNode的方向和夹角

2020-12-21  本文已影响0人  loongod

在三维坐标系中,有些时候我们需要知道一个平面(Node)与世界坐标系中某个轴(x、y、z)的夹角。然后做一些额外操作。

因为没有直接的属性,只能间接求得。

SCNNode 有属性

simdRotationsimdEulerAnglessimdOrientation属性都会影响节点simdTransform属性的旋转角度。 这些属性之一的任何更改都会反映在其他属性中。

如果你要设置此属性:

// 创建一个新的四元数,该四元数的动作是围绕指定轴的指定旋转。
node.simdOrientation = simd_quatf(angle: .pi / 2.0 , axis: [0, 1, 0])

上面代码是把node沿Y轴正方向顺时针旋转90°

rotate90.png
  1. angle * x 表示沿X轴的正方向顺时针(结果为正时,负则逆时针),旋转的弧度
  2. angle * y 表示沿Y轴的正方向顺时针(结果为正时,负则逆时针),旋转的弧度
  3. angle * z 表示沿Z轴的正方向顺时针(结果为正时,负则逆时针),旋转的弧度

了解了orientation方向的设置后,如何计算一个Node相对于世界坐标系Y轴的夹角呢?

通过上面例子,可以看出,如果要计算与Y轴的夹角,那不管验Y轴是顺时针还是逆时针,不管旋转多少弧度,对计算与世界坐标系Y轴的夹角没有任何影响。

我们再看下在保持Z轴不变,沿X轴的旋转,比如下面沿X轴正方向旋转90°后,与世界坐标系Y轴的夹角就是90°

rotateX.png

同样的,X 轴不变,如果沿Z轴旋转角度后,与世界坐标系Y轴的夹角也是Z轴的旋转角度。

可知,要计算与 Y 轴的夹角,就是 XZ 的最大角。

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

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

同理,如果需要计算旋转后与XZ的夹角,分别得到其他两轴的旋转弧度,计算即可。

上一篇 下一篇

猜你喜欢

热点阅读