【问题标题】:Sensor Orientiation -> GLRotation doesn't work properly传感器方向 -> 旋转无法正常工作
【发布时间】:2012-07-31 12:14:31
【问题描述】:

我想为我的 GLES 相机使用 Android 方向传感器数据 - 为其提供旋转矩阵。我在这里找到了一个很好的例子:

How to use onSensorChanged sensor data in combination with OpenGL

但这仅适用于 GL1.0,我需要针对 GLES2.0 进行处理。使用我自己的着色器,一切正常,手动移动相机很好。但是当我像示例中那样使用旋转矩阵时,它并没有真正起作用。

我生成旋转矩阵:

SensorManager.getRotationMatrix(rotationMatrix, null, bufferedAccelGData, bufferedMagnetData);

我的应用程序在 LANDSCAPe 中运行,因此我在之后使用该方法(如示例代码中所示):

float[] result = new float[16];
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, result);
return result;

他的代码在我的手机上运行良好,但在我的手机上却不行。我的屏幕是这样的:

旋转矩阵似乎向右旋转了 90°(几乎就好像我忘记为我的活动切换到横向一样)。

我正在考虑以错误的方式使用 remap() 方法,但在示例中它是有道理的,相机移动现在有效。如果我向左旋转,屏幕也会向左旋转,尽管由于一切都转动了,它会“向上”旋转(与地面相比,地面不在底部而是在右侧)。看起来我做了一面墙而不是地面,但我确信我的坐标适合顶点。

我查看了GLSurface 的 draw 方法,但我看不出我在这里可能做错了什么:

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
MatrixStack.glLoadMatrix(sensorManager.getRotationMatrix());  // Schreibt die MVMatrix mit der ogn. Rotationsmatrix
GameRenderer.setPerspMatrix(); // Schreibt die Perspektivmatrix Uniform für GLES. Daran sollte es nicht liegen.
MatrixStack.mvPushMatrix();
  drawGround();    
MatrixStack.mvPopMatrix();

正如我所说,手动移动相机时,一切正常。那么我得到的旋转矩阵有什么问题呢?

【问题讨论】:

标签: opengl-es-2.0 augmented-reality android-sensors rotational-matrices


【解决方案1】:

好吧,这是一个非常古老的问题,但现在我再次查看代码,我找到了解决方案。 让手机处于横向状态,我不得不使用

重新映射轴
SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R);

但这仍然没有旋转图像 - 即使 Y 轴和 -X 轴的映射工作正常。所以简单地使用

Matrix.rotateM(R, 0, 90, 1, 0, 0);

做这项工作。不是很好,但它确实有效。

我知道这是一个非常古老的问题,我不明白我为什么会犯这个错误,但也许有一天其他人也会遇到同样的问题。

希望这会有所帮助, 托比亚斯

【讨论】:

    【解决方案2】:

    如果它(曾经)在特定手机上工作,但不在您的手机上,我想 android 版本可能会在这里发挥作用。我们在 mixare Augmented Reality Engine 中遇到了 Surfaceview 叠加在 Camera 视图上的问题。请考虑这里的信息可能不适用于您的情况,因为我们没有使用 OpenGL。

    现代版本的 android 将返回默认方向,而以前的纵向是默认方向。您可以在Compatibility class 中查看我们是如何查询的。然后使用此信息将不同的值应用于 RemapCoordinateSystem 调用check lines 739 and onwards of this file。 Mixare 默认情况下也使用横向模式,所以我想我们的重映射值也应该适用于您的情况。正如我之前所说,我们使用的是 3x3 矩阵,因为我们没有使用 OpenGL,但我想这对于 OpenGL 兼容矩阵应该是相同的。

    【讨论】:

    • 您好,谢谢您的回答。问题是,它在我的设备上工作,但使用 OpenGL 1.0,但是当我将所有内容更改为 GL2.0 (GLES) 时,它不再工作(或者只是将整个图像向右转)。我知道方向的变化。因为我只在风景中使用它,所以我和你做的完全一样:SensorManager.AXIS_X, SensorManager.AXIS_MINUS_Z 但正如你在屏幕截图中看到的那样,突然一切都向右旋转了……很奇怪。但至少感谢您的尝试! :-)
    • 哦,顺便说一句,我不认为这只是一个 GL2.0 问题,因为它在这里似乎是同样的问题:stackoverflow.com/questions/9342283/… 这是在 GL1.1 中制造的 :-(
    • 嗯,我有个主意。 developer.android.com/reference/android/hardware/… 提到:“当设备的屏幕方向改变时,轴不会交换。”所以我认为这是问题所在。有没有人知道如何改变它,因为我有横向模式而不是纵向?我想试试这个。非常感谢!
    【解决方案3】:

    花点时间,玩一下方向矩阵,你会发现一列包含有用的价值。

    除了记录每列的值,看看哪一个有用,试试四元数,继续玩值永远不要直接在渲染器中尝试代码,首先检查值

    因为稍后,您将有更多的输入选项,如触摸,您也必须测试这些值,使用它们,使用灵敏度常数也可以使用矩阵

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多