【问题标题】:How to convert between sensor quaternion and 3d camera quaternion?如何在传感器四元数和 3D 相机四元数之间转换?
【发布时间】:2016-08-18 13:17:46
【问题描述】:

我使用 getQuaternionFromVector() 从 Android 的 Sensor.TYPE_ROTATION_VECTOR 融合传感器中得到一个四元数。我想使用该四元数来控制我的 Rajawali 应用的摄像头。

我从传感器获得的值 (w, x, y, z) 是(横向手机,直视前方):

  • 北:(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)

结果是北方正确,东方向上,西方向下,南方颠倒。我注意到轴承与俯仰混淆了(我改变了设备的俯仰,相机的轴承发生了变化,以及储备)。

关于如何修改传感器四元数以匹配预期四元数的任何建议?如何更改它以使传感器轴承改变相机轴承而不是俯仰角?

提前致谢!

【问题讨论】:

    标签: android opengl-es 3d sensors rajawali


    【解决方案1】:

    设法解决了。

    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));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2022-01-18
      相关资源
      最近更新 更多