3

GLESカメラにAndroidの向きセンサーデータを使用したいのですが、回転行列を使用します。私はここで非常に良い例を見つけました:

onSensorChangedセンサーデータを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ここで何が間違っていたのかわかりません。

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

私が言ったように、カメラを手動で動かすと、すべてが完璧に機能します。では、私が得た回転行列の何が問題になっていますか?

4

3 に答える 3

1

ええと、それは非常に古い問題でしたが、コードをもう一度見てみると、解決策が見つかりました。電話を横向きにすると、次を使用して軸を再マッピングする必要がありました

SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R);

しかし、それでも画像は回転しませんでした - Y 軸と -X 軸のマッピングはうまくいきましたが。だから単純に

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

仕事をします。本当にうまくいきませんが、うまくいきます。

私はそれが非常に古い質問であることを知っており、なぜ私がこの間違いを犯したのかわかりませんが、おそらく他の誰かがいつか同じ問題を抱えています.

これが役に立てば幸いです、トバイアス

于 2014-06-04T15:25:06.033 に答える
0

特定の電話では機能しているが、あなたの電話では機能していない場合は、Android バージョンがここで役割を果たす可能性があると思います。私たちは、Surfaceview が Camera ビューに重ねられるmixare Augmented Reality Engineの問題に直面しました。OpenGL を使用していないため、ここに記載されている情報がお客様のケースに当てはまらない可能性があることを考慮してください。

Android の最新バージョンはデフォルトの向きを返しますが、以前は縦向きがデフォルトでした。互換性クラスでこれを照会する方法を確認できます。次に、この情報を使用して、このファイルの 739 行目以降の RemapCoordinateSystem コールチェック行に異なる値を適用します。Mixare もデフォルトでランドスケープ モードを使用しているため、再マッピングの値はあなたのケースにも適用されるはずです。先ほど言ったように、OpenGL を使用していないため、3x3 マトリックスを使用していますが、これは OpenGL 互換のマトリックスでも同じはずです。

于 2012-07-31T12:54:46.563 に答える
0

時間をかけて方向行列をいじると、有用な値を含む列が見つかります。

各列のログ値に加えて、どれが有用かを確認し、クォータニオンを試し、値をいじり続けます。レンダラーでコードを直接試してはいけません。最初に値を確認してください

後で、タッチなどの入力のオプションが増えるため、値をテストし、それらで遊んで、マトリックスで感度定数も使用する必要があります

于 2012-08-05T16:15:27.333 に答える