3

我正在构建一个非常标准的 AR 应用程序,它会在相机上覆盖一些东西,并且在使用 SensorManager 时遇到了问题。我基本上是在尝试从传感器管理器中获取旋转矩阵,然后调用 glMultMatrix 来相应地旋转所有内容。在 SensorManager.getRotationMatrix 的文档中看起来这是可能的。然而,当我与旋转矩阵相乘时,一切都会变得扭曲并四处移动,不像你看到其他 ar 应用程序所期望的那样。我在下面得到了一些代码:

private float[] gravity = new float[3];
private float[] geomagnetic = new float[3];
private float filteringFactor = 0.01f;
private float[] rotationMatrixOut = new float[16];

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        geomagnetic[0] = event.values[0] * filteringFactor + geomagnetic[0] * (1.0f - filteringFactor);
        geomagnetic[1] = event.values[1] * filteringFactor + geomagnetic[1] * (1.0f - filteringFactor);
        geomagnetic[2] = event.values[2] * filteringFactor + geomagnetic[2] * (1.0f - filteringFactor);
    } else if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        gravity[0] = event.values[0] * filteringFactor + gravity[0] * (1.0f - filteringFactor);
        gravity[1] = event.values[1] * filteringFactor + gravity[1] * (1.0f - filteringFactor);
        gravity[2] = event.values[2] * filteringFactor + gravity[2] * (1.0f - filteringFactor);
    }

    SensorManager.getRotationMatrix(rotationMatrixOut, null, gravity, geomagnetic);
}

我也尝试过使用 SensorManager.remapCoordinateSystem 但没有运气。我的绘图代码如下,这是非常标准的东西,我注释掉了lookat,因为我不确定这是否会造成麻烦

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    //GLU.gluLookAt(gl, mCamera.position.x, mCamera.position.y, mCamera.position.z, 
    //                mCamera.target.x, mCamera.target.y, mCamera.target.z,
    //                mCamera.up.x, mCamera.up.y, mCamera.up.z);

    gl.glMultMatrixf(rotationMatrixOut, 0);


    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    gl.glLineWidth(1.0f);

    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);

    gl.glDrawArrays(GL10.GL_LINES, 0, 2 * 201 * 2);

如果有人能提供帮助,我会为此失去太多睡眠,不胜感激。谢谢

4

1 回答 1

0

只是猜测,但可能是,您从 SensorManager 收到的数据是按行主要顺序排列的吗?OpenGL 期望数据按列主要顺序排列,因此如果您将行主要顺序矩阵传递给 OpenGL,它会被转置解释。

你是对的,你不需要 gluLookAt 那里(假设你,即原点的设备,并显示它周围的世界)。

于 2011-09-01T13:14:37.490 回答