突然想起一年多前,需要将手机空间姿态,同步到一个设备上,而这个设备只能水平旋转或者改变仰角
首先,先读取手机初始状态四元数,记为q0,因为这个空间姿态的变化相对于手机来说是相对的,然后再读取每一时刻的四元数,记为q,记相对初始状态的相对四元数为q1,根据四元数旋转的复合,那么有
q即q1=q0q1=q0−1q
那么到此,我们已经得到了相对四元数q1。
为了获得使手机的朝向,根据下图,我们可以构造一个3D向量(0,1,0),代表手机指向的方向,记为p0
将q1旋转作用于p0,可得
p1=q1p0q1−1
显然,p1的坐标即代表着手机朝向,将其记为(x,y,z)
记与x轴的夹角为α∈(−π,π],与y轴的夹角为β∈[−2π,2π],可得
cosαtanβ=x2+y2x=x2+y2z
易得
α=⎩⎨⎧arccosx2+y2x−arccosx2+y2xy≥0y<0
β=⎩⎨⎧∣arctanx2+y2z∣−∣arctanx2+y2z∣z≥0z<0
注:上文出现的三维向量与纯四元数的转换均为隐式转换,即(a,b,c)={0,a,b,c}
代码实现
注意:代码实现中的变量命名与上文不相同,水平旋转角的参考系也有些差别
参考资料
四元数与三维旋转
Microsoft Docs