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 に答える