旋转后的OpenGL ES 2翻译

时间:2013-03-22 09:29:07

标签: android opengl-es matrix rotation translation

我正在使用android中的增强现实应用程序。目前我对Open GL ES 2.0有些问题.. 首先,我想旋转一个对象然后翻译它但它不起作用。单个转换,意味着只有旋转或平移,正在工作。 我认为我的问题类似于OpenGL - Translate after rotate,但那里的答案对我没有帮助。 例如,如何围绕z轴旋转对象45度,然后向左或向右平移100px?

以下是一些代码:

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()来使用我的euler角度。我曾尝试过三次调用方法,但后来我得到了一个错误的轮换:

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

1 个答案:

答案 0 :(得分: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);