Использование SensorManager для поворота в OpenGL? - PullRequest
3 голосов
/ 01 сентября 2011

Я создаю довольно стандартное приложение AR, которое накладывает материал на камеру, и у меня возникают проблемы при работе с SensorManager.Я в основном пытаюсь получить матрицу вращения из диспетчера датчиков, а затем вызвать glMultMatrix, чтобы повернуть все соответственно.В документации для SensorManager.getRotationMatrix это выглядит так, как это возможно.Однако, когда я умножаюсь на матрицу вращения, все становится странным и движется не так, как вы ожидаете увидеть в других приложениях.Я получил код ниже:

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, но безуспешно.Мой код для рисования приведен ниже, это довольно стандартные вещи, я прокомментировал это, потому что я не был уверен, вызывает ли это проблемы

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

Я терял слишком много сна из-за этого, если кто-то может помочьс благодарностью.Спасибо

1 Ответ

0 голосов
/ 01 сентября 2011

Просто угадайте, но может ли быть так, что данные, которые вы получаете от SensorManager, расположены в главном порядке?OpenGL ожидает данные в главном порядке столбцов, поэтому, если у вас есть матрица основного порядка строк, переданная в OpenGL, они были интерпретированы как транспонированные.

И вы правы, вам не нужен gluLookAt (при условииустройство в начале координат и отображение окружающего мира).

...