传感器方向 - >旋转不能正常工作

时间:2012-07-31 12:14:31

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

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

How to use onSensorChanged sensor data in combination with OpenGL

但这只适用于GL1.0,我需要为GLES2.0工作。使用我自己的着色器,一切正常,移动相机manuall很好。但是,就像我在示例中使用旋转矩阵那样,它实际上并不起作用。

我用:

生成旋转矩阵
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;

我的手机在他的代码中工作正常,但不在我的手机中。我的屏幕看起来像这样:

enter image description here

旋转矩阵似乎向右旋转90°(几乎就像我忘记切换到横向进行我的活动)。

我正在考虑以错误的方式使用remap()方法,但在示例中它是有道理的,相机运动现在可以正常工作。如果我向左旋转,屏幕也会向左旋转,即使因为一切都已转动,它会“向上”旋转(与地面相比,不是在底部,而是在右边)。它只是看起来我做了一个墙而不是一个地面,但我确信我的坐标适合顶点。

我看了GLSurface的绘制方法,我看不出我在这里做错了什么:

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

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

3 个答案:

答案 0 :(得分:1)

嗯,好吧,这是一个非常古老的问题,但现在我再次看了一下代码,我找到了解决方案。 将手机置于风景中我必须使用

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

但是仍然没有旋转图像 - 即使Y和-X轴的映射工作正常。所以只需使用

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

这份工作。不是很好,但它有效。

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

希望这有帮助,  托拜厄斯

答案 1 :(得分:0)

如果是(是)在特定手机上工作但不在你手机上工作,我想Android版可能会在这里发挥作用。我们在mixare Augmented Reality Engine 中遇到了问题,其中Surfaceview叠加在Camera视图上。请注意,由于我们不使用OpenGL,因此此处的信息可能不适用于您的案例。

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

答案 2 :(得分:0)

花些时间玩方向矩阵,你会发现一个包含有用的vaule的列。

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

因为稍后,你会有更多的输入选项,比如触摸,你也必须测试数值,使用它们,使用灵敏度常数和矩阵