scipy.spatial.transform.Rotation.apply¶
- Rotation.apply()¶
将此旋转应用于一组向量。
如果原始帧通过此旋转旋转到最终帧,则可以通过两种方式查看其对向量的应用:
作为最终帧中表示的矢量分量到原始帧的投影。
作为向量的物理旋转,在原始帧旋转时将其粘贴到原始帧。在这种情况下,矢量分量在旋转前后的原始帧中表示。
就轮换矩阵而言,此应用程序与
self.as_matrix().dot(vectors)
。- 参数
- vectors类阵列,形状(3,)或(N,3)
每个人 vectors[i] 表示3D空间中的向量。可以使用Shape指定单个向量 (3, ) 或 (1, 3) 。给定的旋转数和矢量数必须遵循标准的数字广播规则:要么等于1,要么都相等。
- inverse布尔值,可选
如果为True,则将旋转的反转应用于输入向量。默认值为False。
- 退货
- rotated_vectorsndarray,形状(3,)或(N,3)
对输入向量应用旋转的结果。形状取决于以下情况:
如果对象包含单个旋转(与具有单个旋转的堆栈相反)并且使用Shape指定了单个向量
(3,)
,那么 rotated_vectors 有形状(3,)
。在所有其他情况下, rotated_vectors 有形状
(N, 3)
,在哪里N
或者是旋转的数量,或者是矢量的数量。
示例
>>> from scipy.spatial.transform import Rotation as R
对单个矢量应用单次旋转:
>>> vector = np.array([1, 0, 0]) >>> r = R.from_rotvec([0, 0, np.pi/2]) >>> r.as_matrix() array([[ 2.22044605e-16, -1.00000000e+00, 0.00000000e+00], [ 1.00000000e+00, 2.22044605e-16, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]]) >>> r.apply(vector) array([2.22044605e-16, 1.00000000e+00, 0.00000000e+00]) >>> r.apply(vector).shape (3,)
对多个向量应用单次旋转:
>>> vectors = np.array([ ... [1, 0, 0], ... [1, 2, 3]]) >>> r = R.from_rotvec([0, 0, np.pi/4]) >>> r.as_matrix() array([[ 0.70710678, -0.70710678, 0. ], [ 0.70710678, 0.70710678, 0. ], [ 0. , 0. , 1. ]]) >>> r.apply(vectors) array([[ 0.70710678, 0.70710678, 0. ], [-0.70710678, 2.12132034, 3. ]]) >>> r.apply(vectors).shape (2, 3)
单个向量上的多个旋转:
>>> r = R.from_rotvec([[0, 0, np.pi/4], [np.pi/2, 0, 0]]) >>> vector = np.array([1,2,3]) >>> r.as_matrix() array([[[ 7.07106781e-01, -7.07106781e-01, 0.00000000e+00], [ 7.07106781e-01, 7.07106781e-01, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]], [[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 2.22044605e-16, -1.00000000e+00], [ 0.00000000e+00, 1.00000000e+00, 2.22044605e-16]]]) >>> r.apply(vector) array([[-0.70710678, 2.12132034, 3. ], [ 1. , -3. , 2. ]]) >>> r.apply(vector).shape (2, 3)
多个向量上的多个旋转。每次旋转都应用于相应的向量:
>>> r = R.from_euler('zxy', [ ... [0, 0, 90], ... [45, 30, 60]], degrees=True) >>> vectors = [ ... [1, 2, 3], ... [1, 0, -1]] >>> r.apply(vectors) array([[ 3. , 2. , -1. ], [-0.09026039, 1.11237244, -0.86860844]]) >>> r.apply(vectors).shape (2, 3)
也可以应用反向旋转:
>>> r = R.from_euler('zxy', [ ... [0, 0, 90], ... [45, 30, 60]], degrees=True) >>> vectors = [ ... [1, 2, 3], ... [1, 0, -1]] >>> r.apply(vectors, inverse=True) array([[-3. , 2. , 1. ], [ 1.09533535, -0.8365163 , 0.3169873 ]])