android - 需要根据 Sensor.TYPE_ORIENTATION 数据计算旋转矢量

标签 android opengl-es vector matrix sensors

我需要根据从 Sensor.TYPE_ORIENTATION 获得的数据计算旋转矢量。

传感器数据定义如下:

  • 必须重新计算值才能成为正确的 3d 位置:值 [0]:方位角,磁北方向与 Y 轴之间的角度,围绕 Z 轴(0 到 359)。 0=北,90=东,180=南,270=西
  • 1 :俯仰,绕X轴旋转(-180到180),当z轴向y轴移动时为正值。
  • values[2]:Roll,绕Y轴旋转(-90到90),当x轴远离z轴时取正值

我需要所有三个值,例如 Z 轴值(从 0 到 360 度)。我尝试了很多但无法弄清楚如何做到这一点:/

(编辑:要了解工作代码背后的想法,请查看 DroidAR framework 的 ActionWithSensorProcessing 类,您可以在其中了解如何处理不同的事件类型。)

我还尝试使用 Sensor.TYPE_ACCELEROMETER 和 Sensor.TYPE_MAGNETIC_FIELD 自行计算此 3d 矢量。这是代码:

final float[] inR = new float[16];
// load inR matrix from current sensor data:
SensorManager.getRotationMatrix(inR, null, gravityValues, geomagneticValues);
float[] orientation = new float[3];
SensorManager.getOrientation(inR, orientation);
mapMagAndAcclDataToVector(orientation); //here i do some *360 stuff
orientetionChanged(orientation); //then the correct values are passed (in theorie)

但这没有用,我认为这太复杂了。 所以我打赌有一个简单的解决方案如何重新计算 ensor.TYPE_ORIENTATION 的值以使它们成为 3d 旋转矢量,但我只是不知道该怎么做。如果你知道答案,请告诉我。

编辑: 我应该补充一点,我想将值传递给 OpenGL 以将其与轴对齐,如下所示:

gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[0], 0, 0, 1);

但由于奇怪的值范围,我显然不能这样做。同样的问题 来自 SensorManager.getOrientation 的值,因为当您通过地平线时它们也会翻转..

另一种解决方案是使用 inR 矩阵计算角度,但我认为必须有更简单的解决方案 (?)

最佳答案

这应该有效(使用 Sensor.TYPE_MAGNETIC_FIELD 和 Sensor.TYPE_ACCELEROMETER 输入)

switch (event.sensor.getType()) {
    case Sensor.TYPE_MAGNETIC_FIELD:
        magnitude_values = event.values.clone();
        sensorReady = true;
        break;
    case Sensor.TYPE_ACCELEROMETER:
        accelerometer_values = event.values.clone();
    }   

    if (magnitude_values != null && accelerometer_values != null && sensorReady) {
        sensorReady = false;

        float[] R = new float[16];
        float[] I = new float[16];

        SensorManager.getRotationMatrix(R, I, this.accelerometer_values, this.magnitude_values);

        float[] actual_orientation = new float[3];
        SensorManager.getOrientation(R, actual_orientation);
 }

将此条件放入您的 onSensorChanged 中。在 actual_orientation 中,您将获得相对于您的实际位置指向北方的矢量。

如果你想从相机的角度检测北方,你必须像这样更改最后一行代码

float[] outR = new float[16];
SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR);
SensorManager.getOrientation(outR, actual_vals); 

关于android - 需要根据 Sensor.TYPE_ORIENTATION 数据计算旋转矢量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2858255/

相关文章:

c++ - 比较 std::vector 大小时出错

opengl - openGL ES和OpenGL函数的区别

Java arrayList 与 Vector 不兼容

android - Cocos2D 示例中的 NoClassDefFoundError

java - 在蓝牙安卓中配对设备

java - 将字符串从第一个 Activity 传递到最后一个 Activity ,但在开始最后一个 Activity 之前运行另一个 Activity

android - 用于 Activity 测量的自定义 Broadcastreceiver

android - 如何处理色键滤镜中的镜面高光?

android - 处理 Android 的纹理大小限制

java - 通用简单 3D 矩阵旋转问题