SCNNode的方向和夹角
2020-12-21 本文已影响0人
loongod
在三维坐标系中,有些时候我们需要知道一个平面(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°
rotate90.png
-
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°
rotateX.png
同样的,X 轴不变,如果沿Z轴旋转角度后,与世界坐标系Y轴的夹角也是Z轴的旋转角度。
可知,要计算与 Y 轴的夹角,就是 X、Z 的最大角。
x弧度 :simdWorldOrientation.axis.x * simdWorldOrientation.angle
z弧度 :simdWorldOrientation.axis.z * simdWorldOrientation.angle
需要度数:再乘以 180.0 / .pi
同理,如果需要计算旋转后与X、Z的夹角,分别得到其他两轴的旋转弧度,计算即可。