如何在传感器四元数和 3d 相机四元数之间转换?

How to convert between sensor quaternion and 3d camera quaternion?

我从 Android 的 Sensor.TYPE_ROTATION_VECTOR fused sensor using getQuaternionFromVector() 得到了一个四元数。我想用那个四元数来控制我的 Rajawali 应用程序的相机。

我从传感器获得的值 (w, x, y, z) 是(phone 在风景中,直视前方):

我需要将这些值转换为这些正确的值:

通过反复试验,我找到了一个解决方案,但我还有一些路要走。如果我首先相对于 Y 轴旋转 90 度,然后相对于 X 轴旋转 -90 度:

Quaternion a = new Quaternion(Vector3.Y, 90);
a.multiply(q);
Quaternion b = new Quaternion(Vector3.X, -90);
b.multiply(a);

我得到的值是:

结果是北正,东朝上,西朝下,南朝反。我注意到轴承与螺距混淆了(我改变了设备的螺距,相机的轴承也发生了变化,并且后备箱也发生了变化)。

关于如何修改传感器四元数以匹配预期的四元数值有什么建议吗?我怎样才能改变它,使传感器方位改变相机方位而不是间距?

提前致谢!

设法解决了。

public static Quaternion transform(Quaternion q) {
    Quaternion a = new Quaternion(Vector3.Y, 90).multiply(q);
    Quaternion b = new Quaternion(a.w, a.y, -a.x, -a.z);
    return b.multiply(new Quaternion(Vector3.Y, 90));
}