Android 使用矩阵。在OpenGL ES 2.0中旋转

Android 使用矩阵。在OpenGL ES 2.0中旋转,android,rotation,opengl-es-2.0,translate-animation,Android,Rotation,Opengl Es 2.0,Translate Animation,编辑-添加更多代码 使用OpenGL ES 2.0正确旋转我的四边形时遇到很多问题 它似乎总是围绕屏幕坐标的中心旋转。我试着让它绕着自己的中心旋转(对于2d,所以只有z轴) 我一直在试验Matrix.translate,如下所示。但是,在这里更改x或y位置只是在屏幕上的不同位置绘制四边形,但当它旋转时,它再次围绕屏幕中心旋转。请有人解释一下如何让它绕着自己的z轴旋转(像一个轮子) 谢谢,这里是相关的代码行-如果需要更多,请询问,我会发布。(请注意,我在SO和更广泛的互联网上看过很多类似的问题,但

编辑-添加更多代码

使用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);
我的着色器(在类级别声明)

从OnSurface更改

float ratio = (float) width / height;
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
// 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);
在我的onDrawFrame方法中

float ratio = (float) width / height;
Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
// 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);

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

如果不知道矩阵函数是如何实现的,我们无法建议您是否正确使用它们。您在函数界面中向我们展示的所有内容


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

这里是一个演练。假设你要画一个茶壶。。。modelMatrix将是一个标识。形状以原点为中心,如下所示:

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

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

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

所以对你们来说,你们需要做的就是验证旋转矩阵是否为恒等式。 矩阵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>
Matrix.setIdentityM(mRotationMatrix,0);
旋转矩阵(旋转矩阵,0,-角度,0,0,1.0f);

分步进行,让你的生活变得轻松,这样你就能看到发生了什么。

我也遇到了同样的问题(看到了奇怪的扭曲和其他一切),我的解决方案基于以下内容

(如果需要,请转到我的详细帖子: )

  • 将mModelMatrix设置为identity Matrix

    Matrix.setIdentityM(mModelMatrix, 0); // initialize to identity matrix
    
  • 将转换应用于mModelMatrix

  • 将旋转应用于旋转矩阵(角度以度为单位)

  • 通过Matrix.multipleymm组合旋转和平移

  • 将模型矩阵与投影和摄影机视图相结合

    mTempMatrix = mMVPMatrix.clone();
    Matrix.multiplyMM(mMVPMatrix, 0, mTempMatrix, 0, mModelMatrix, 0);
    

  • 向后应用您的操作:

    1-矩阵平移(旋转矩阵,0,-.5f,.5f,0f)

    第二个矩阵。设置旋转矩阵(旋转矩阵,0,-角度,0,0,1.0f)


    它将围绕自己的中心旋转

    Hi@Sebby Johanns。谢谢你的评论,我现在不是在翻译前轮换吗?如果您能更详细地解释,我将不胜感激-我添加了更多的代码-这足够了吗?如果您还需要(以及您需要的零件),请提供建议-非常感谢!!如果平移的目的是移动旋转中心,而不是移动四边形,那么您可以平移、旋转、向后平移。@mbeckish谢谢您的评论,我听到人们说“traslate and translate back”,但我还没有完全理解它,我想你的意思是翻译x和y,然后用相反的值重新翻译(比如说,1,1,然后-1,-1)-请你编辑一下以展示一个例子好吗?我试过了,但什么也没得到。谢谢是的,您希望平移对象,使其位于原点的中心。如果在0,0附近绘制它,那么从单位矩阵开始,然后旋转,然后将旋转的版本平移到所需的位置就足够了。之后,您可以将模型、视图和投影矩阵相乘,以获得将发送到着色器的一致性(除非您是照明的,然后分别发送MV和P,以便正确计算着色)。translate到底应该做什么?移动四边形的中心/轴心点还是移动四边形本身?这是我所需要的最好的方法吗?(基本上,我正在为2d游戏编写一个简单的框架,所以我只想要一个旋转精灵的方法)嗨@paulczak-谢谢你。问题是,当形状位于中心时,它会完美地旋转(因为它的中心位于屏幕的中心)。但是,如果我将形状移动到左上角,它仍然会围绕中心旋转或“环绕”。我不知道如何翻译它,使它停留在同一个地方?所以当你说‘一旦你有了这个,你就可以翻译’——我想这就是我摔倒的地方,我不知道该怎么翻译?(代码顺序以及如何计算中心位置)。是否在每次调用onDrawFrame()时都将旋转矩阵(进行模型变换的位置)重置为标识?实际上,我没有矩阵。SetIdentityYM(mRotationMatrix,0);行-但我现在在使用setRotate之前添加了它。是的,它被称为每帧。(从我的onDrawFrame()方法调用的rotateQuad()方法)感谢您的帮助,我只是不知道我做错了什么!Strangley,如果我将转换应用于mRotationMatrix并将该矩阵直接传递给着色器(在我的示例中声明为“uniform mat4 uRotate”,然后将着色器编辑为“gl_Position=uRotate*a_Position;\n”+(因此不使用uMVPMatrix)这似乎是可行的。我说,因为我仍然得到我在另一个问题()中提到的失真,我不喜欢不使用uMVPMatrix
    mTempMatrix = mModelMatrix.clone();
    Matrix.multiplyMM(mModelMatrix, 0, mTempMatrix, 0, mRotationMatrix, 0);
    
    mTempMatrix = mMVPMatrix.clone();
    Matrix.multiplyMM(mMVPMatrix, 0, mTempMatrix, 0, mModelMatrix, 0);