Numpy四元数扩展:球坐标生成四元数的旋转轴不符疑问
解惑:
quaternion.from_spherical_coords的参数定义与你的误区 嘿,我完全懂你的困惑!咱们来一步步拆解这个问题:
首先,先复盘你运行的代码和输出:
import numpy as np import quaternion as q theta = np.pi * 1.0 / 3.0 # 对应60度 phi = 0.0 print(q.from_spherical_coords(theta,phi))
输出是(quaternion(0.866025403784439, -0, 0.5, 0)),这个四元数的结构是w + x*i + y*j + z*k,其中w≈√3/2,y=0.5——这正好对应绕Y轴旋转60度的四元数(绕Y轴转θ的四元数公式是cos(θ/2) + sin(θ/2)*j,θ=60度时θ/2=30度,cos30≈0.866,sin30=0.5)。
那为什么你以为phi=0时应该绕Z轴旋转?问题出在你对from_spherical_coords函数的用途和参数定义的理解上:
- 这个函数的作用不是直接生成绕Z轴/Y轴的欧拉角旋转四元数,而是生成一个将Z轴正方向旋转到球面坐标指定方向的单位四元数。
- 它的参数定义是:
theta:极角,是目标方向与Z轴正方向的夹角(从Z轴向下转到目标方向的角度)phi:方位角,是目标方向在XY平面上的投影与X轴正方向的夹角
当你设置phi=0时,相当于只需要把Z轴绕Y轴旋转theta角度,就能指向目标方向(此时目标方向在YZ平面内),所以得到的就是绕Y轴的旋转四元数,这完全符合函数的设计逻辑。
如果你想生成绕Z轴的旋转四元数
有两种简单的方式:
- 手动构造:绕Z轴转θ的四元数公式是
cos(θ/2) + 0*i + 0*j + sin(θ/2)*k,对应代码:theta = np.pi / 3 q_z_rot = quaternion(np.cos(theta/2), 0, 0, np.sin(theta/2)) print(q_z_rot) # 输出 (0.8660254, 0, 0, 0.5) - 用
from_euler_angles函数:明确指定旋转轴和顺序(这里用Z轴旋转):q_z_rot = q.from_euler_angles(0, 0, theta) # 顺序是X-Y-Z,这里只给Z轴的旋转角度
这样就能得到你预期的绕Z轴60度旋转的四元数啦!
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

