3

私はアンドロイドで拡張現実アプリに取り組んでいます。現時点では、Open GL ES 2.0 に関する問題がいくつかあります。最初にオブジェクトを回転させてから平行移動させたいのですが、うまくいきません。回転または平行移動のみを意味する単一の変換が機能しています。私の質問はOpenGL - Translate afterrotateに似ていると思いますが、そこの答えは役に立ちません。たとえば、オブジェクトを z 軸を中心に 45 度回転させてから、左または右に 100 ピクセル移動するにはどうすればよいでしょうか?

ここにいくつかのコードがあります:

Matrix.setIdentityM(mModelMatrix, 0);
// Euler angles in res[] from opencv 
Matrix.setRotateEulerM(mRotateMatrix, 0,  (float) res[0], (float) res[1], (float) res[2]);
Matrix.multiplyMM(mModelMatrix, 0, mRotateMatrix , 0, mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, (x-hmWidth),(y-hmHeight)*(-1), 0);
Matrix.scaleM(mModelMatrix, 0, (float) arc.getSize().width, (float) arc.getSize().height, 10);
drawBlock(gl);

Udate: オイラー 角が間違っていたり、間違った使い方をしている場合があることがわかりました。知らない。Matrix.rotateM(mModelMatrix, 0, 90, 0, 0, 1); AFTER翻訳を使用すると、すべて正常に動作します。現在、rotateM() でオイラー角を使用する方法がわかりません。メソッドを 3 回呼び出そうとしましたが、間違ったローテーションが発生します。

Matrix.rotateM(mModelMatrix, 0, (float) res[0], 1, 0, 0);
Matrix.rotateM(mModelMatrix, 0, (float) res[1], 0, 1, 0);
Matrix.rotateM(mModelMatrix, 0, (float) res[2], 0, 0, 1);
4

1 に答える 1

0

私は実用的な解決策を見つけたと思います。関数「setRotateEulerM()」は、以前に私のコードでいくつかの問題を引き起こしたようです..今、私は「rotateM()」で単一の回転を行います。z 座標を -1 に設定することが重要です。これが私のコードです:

Matrix.setIdentityM(mModelMatrix, 0);
res = arc.getEulerAngles();

x = (int) ( (float) arc.getCenter().x / diffx);
y = (int) ( (float) arc.getCenter().y / diffy);
Matrix.translateM(mModelMatrix, 0, (x-hmWidth),(y-hmHeight)*(-1), -10f);
Matrix.rotateM(mModelMatrix, 0, (float) res[0], 1, 0, 0);
Matrix.rotateM(mModelMatrix, 0, (float) res[1], 0, 1, 0);
Matrix.rotateM(mModelMatrix, 0, (float) res[2], 0, 0, -1);

Matrix.scaleM(mModelMatrix, 0, (float) arc.getSize().width, (float) arc.getSize().height, 1);
drawBlock(gl);
于 2013-03-25T08:32:37.953 に答える