7

编辑- 添加了更多代码

尝试使用 OpenGL ES 2.0 正确旋转我的四边形时遇到很多问题。

它似乎总是围绕屏幕坐标的中心旋转。我试图让它围绕它自己的中心旋转(对于 2d,所以仅限 z 轴)。

我一直在试验 Matrix.translate,如下所示。但是,在此处更改 x 或 y 位置只会在屏幕上的不同位置绘制四边形,但是当它旋转时,它会再次围绕屏幕中心旋转。请有人解释一下如何让它绕着它自己的z轴旋转(就像一个轮子)?

谢谢,这是相关的代码行 - 如果需要更多,请询问,我会发布。(请注意,我在 SO 和更广泛的互联网上查看了很多类似的问题,但到目前为止我还没有找到答案)。

谢谢。

//Set rotation
Matrix.setRotateM(mRotationMatrix, 0, -angle, 0, 0, 1.0f);

//Testing translation
Matrix.translateM(mRotationMatrix, 0, -.5f, .5f, 0f);

// Combine the rotation matrix with the projection and camera view
Matrix.multiplyMM(mvpMatrix, 0, mRotationMatrix, 0, mvpMatrix, 0);

我的着色器(在类级别声明)

private final String vertexShaderCode =
"uniform mat4 uMVPMatrix;" +

"attribute vec4 vPosition;" +
"void main() {" +
" gl_Position = uMVPMatrix * vPosition;" +
"}";

private final String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}";

从 onSurfaceChanged

float ratio = (float) width / height;
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

在我的 onDrawFrame 方法中

// Set the camera position (View matrix)
Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

//Calculate the projection and view transformation
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
4

4 回答 4

5

我遇到了同样的问题(看到奇怪的扭曲和其他一切),我的解决方案基于Android 培训 > 使用 OpenGL ES 显示图形 > 添加运动

(如果需要,请转到我的详细帖子: OpenGL ES Android Matrix Transformations。)

  1. mModelMatrix设置为单位矩阵

    Matrix.setIdentityM(mModelMatrix, 0); // initialize to identity matrix
    
  2. 将翻译应用于mModelMatrix

    Matrix.translateM(mModelMatrix, 0, -0.5f, 0, 0); // translation to the left
    
  3. 对mRotationMatrix应用旋转(以度为单位的角度)

    Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f);
    
  4. 通过Matrix.multiplyMM组合旋转和平移

    mTempMatrix = mModelMatrix.clone();
    Matrix.multiplyMM(mModelMatrix, 0, mTempMatrix, 0, mRotationMatrix, 0);
    
  5. 将模型矩阵与投影和相机视图相结合

    mTempMatrix = mMVPMatrix.clone();
    Matrix.multiplyMM(mMVPMatrix, 0, mTempMatrix, 0, mModelMatrix, 0);
    
于 2013-06-25T09:17:35.747 回答
4

这是一个演练。假设你要画一个茶壶...... modelMatrix 将是一个身份开始。形状以原点为中心,如下所示:

预旋转和平移

在继续之前验证这是您所拥有的...

一旦你有了,你应该将旋转应用于模型矩阵,编译+运行 - 你得到一个旋转的副本......

旋转

一旦你有了这个,你可以翻译:

旋转和平移

所以对你来说,你需要做的就是验证旋转矩阵何时是恒等式,例如 Matrix.setIdentityM(mRotationMatrix,0); 形状在中心。如果不是将其移至中心。

一旦它在中心应用旋转例如

    Matrix.setIdentityM( mRotationMatrix,0); 
    <as needed movement to center>

    Matrix.rotate(mRotationMatrix, 0, -angle, 0, 0, 1.0f);
    <any other translation you want>

分步进行,让您的生活更轻松,以便您了解正在发生的事情。

于 2013-04-05T16:53:21.973 回答
0

旋转通常发生在原点周围,因此您希望在平移四边形之前对其进行旋转。如果在平移后旋转,则四边形将首先从原点移开,然后围绕原点旋转。

在不知道您的 Matrix 函数是如何实现的情况下,我们无法就您是否正确使用它们提供建议。您在函数界面中向我们展示的所有内容。

但一般来说,在翻译之前先旋转。

于 2013-04-05T15:05:10.017 回答
0

向后应用您的操作:

1st- Matrix.translateM(mRotationMatrix, 0, -.5f, .5f, 0f);

2nd- Matrix.setRotateM(mRotationMatrix, 0, -angle, 0, 0, 1.0f);

它将围绕自己的中心旋转

于 2013-07-12T22:59:41.023 回答