如何在传感器四元数和 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 在风景中,直视前方):
- 北:(0.5, 0.5, -0.5, 0.5)
- 东:(0.71, 0, -0.71, 0)
- 南:(0.5,-0.5,-0.5,-0.5)
- 西:(0, 0.71, 0, 0.71)
我需要将这些值转换为这些正确的值:
- 北:(1.0, 0, 0, 0)
- 东:(0.71, 0, 0.71, 0)
- 南:(0, 0, 1, 0)
- 西:(-0.71, 0, 0.71, 0)
通过反复试验,我找到了一个解决方案,但我还有一些路要走。如果我首先相对于 Y 轴旋转 90 度,然后相对于 X 轴旋转 -90 度:
Quaternion a = new Quaternion(Vector3.Y, 90);
a.multiply(q);
Quaternion b = new Quaternion(Vector3.X, -90);
b.multiply(a);
我得到的值是:
- 北:(1, 0, 0, 0)
- 东:(0.71, -0.71, 0, 0)
- 南:(0, -1, 0, 0)
- 西:(0.71, 0.71, 0, 0)
结果是北正,东朝上,西朝下,南朝反。我注意到轴承与螺距混淆了(我改变了设备的螺距,相机的轴承也发生了变化,并且后备箱也发生了变化)。
关于如何修改传感器四元数以匹配预期的四元数值有什么建议吗?我怎样才能改变它,使传感器方位改变相机方位而不是间距?
提前致谢!
设法解决了。
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));
}
我从 Android 的 Sensor.TYPE_ROTATION_VECTOR fused sensor using getQuaternionFromVector() 得到了一个四元数。我想用那个四元数来控制我的 Rajawali 应用程序的相机。
我从传感器获得的值 (w, x, y, z) 是(phone 在风景中,直视前方):
- 北:(0.5, 0.5, -0.5, 0.5)
- 东:(0.71, 0, -0.71, 0)
- 南:(0.5,-0.5,-0.5,-0.5)
- 西:(0, 0.71, 0, 0.71)
我需要将这些值转换为这些正确的值:
- 北:(1.0, 0, 0, 0)
- 东:(0.71, 0, 0.71, 0)
- 南:(0, 0, 1, 0)
- 西:(-0.71, 0, 0.71, 0)
通过反复试验,我找到了一个解决方案,但我还有一些路要走。如果我首先相对于 Y 轴旋转 90 度,然后相对于 X 轴旋转 -90 度:
Quaternion a = new Quaternion(Vector3.Y, 90);
a.multiply(q);
Quaternion b = new Quaternion(Vector3.X, -90);
b.multiply(a);
我得到的值是:
- 北:(1, 0, 0, 0)
- 东:(0.71, -0.71, 0, 0)
- 南:(0, -1, 0, 0)
- 西:(0.71, 0.71, 0, 0)
结果是北正,东朝上,西朝下,南朝反。我注意到轴承与螺距混淆了(我改变了设备的螺距,相机的轴承也发生了变化,并且后备箱也发生了变化)。
关于如何修改传感器四元数以匹配预期的四元数值有什么建议吗?我怎样才能改变它,使传感器方位改变相机方位而不是间距?
提前致谢!
设法解决了。
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));
}