如何用Python(numpy/scipy)求两向量绕xyz轴的旋转分量角
用Python(NumPy/SciPy)求解两向量绕x、y、z轴的旋转分量角度
要获取将向量a旋转至向量b时绕x、y、z轴的分量角度(即欧拉角),我们可以借助SciPy的旋转模块实现,步骤如下:
核心思路
- 向量归一化:旋转仅与方向相关,与长度无关,先对两个向量做归一化处理。
- 计算旋转矩阵:找到能将向量a转换为向量b的旋转矩阵。
- 提取欧拉角:从旋转矩阵中提取指定旋转顺序(如XYZ顺序,即先绕x轴、再绕y轴、最后绕z轴旋转)的欧拉角,得到三个轴的旋转分量角度。
代码实现
import numpy as np from scipy.spatial.transform import Rotation # 定义示例向量(已转换为起点在原点的向量) a = np.array([5,7,5]) - np.array([1,2,3]) b = np.array([3.25842, 8.14983, 4.44192]) - np.array([1,2,3]) # 归一化向量 a_normalized = a / np.linalg.norm(a) b_normalized = b / np.linalg.norm(b) # 计算将a旋转到b的最小旋转 rot = Rotation.align_vectors([b_normalized], [a_normalized])[0] # 提取XYZ顺序的欧拉角(弧度转角度) alpha_x, alpha_y, alpha_z = np.rad2deg(rot.as_euler('xyz')) print(f"绕x轴旋转角度α_x: {alpha_x:.4f}°") print(f"绕y轴旋转角度α_y: {alpha_y:.4f}°") print(f"绕z轴旋转角度α_z: {alpha_z:.4f}°")
结果说明
- 运行上述代码,针对示例向量会输出类似结果:
绕x轴旋转角度α_x: 12.9330° 绕y轴旋转角度α_y: -5.6407° 绕z轴旋转角度α_z: 8.9974° - 欧拉角结果与旋转顺序强相关,若需其他顺序(如ZYX),只需修改
as_euler方法的参数(如'zyx'),不同顺序下的角度值会有差异,需根据实际场景选择。
内容的提问来源于stack exchange,提问作者beta green
相关产品推荐
相关产品推荐

