在三维座标系中,有些时候我们需要知道一个平面(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
的夹角,分别得到其他两轴的旋转弧度,计算即可。