无法在openGL中围绕它的中心旋转我的图像

Posted

技术标签:

【中文标题】无法在openGL中围绕它的中心旋转我的图像【英文标题】:Cannot rotate my image around it's center in openGL 【发布时间】:2014-11-22 13:39:11 【问题描述】:

我正在尝试围绕其中心旋转图像。这是代码:

glPushMatrix();
    glTranslatef(-x, -y, 0);
    glRotatef(10, 0, 0, 1);
    glTranslatef(x, y, 0);
    glBindTexture(GL_TEXTURE_2D, img);
    glBegin(GL_QUADS);
    glTexCoord2i(0, 0);
    glVertex2i(x, y);
    glTexCoord2i(1, 0);
    glVertex2i(x+width, y);
    glTexCoord2i(1, 1);
    glVertex2i(x+width, y+height);
    glTexCoord2i(0, 1);
    glVertex2i(x, y + height);
    glEnd();
    glPopMatrix();

我到处阅读,将我的图像翻译到旋转中心,然后旋转并将其翻译回来。 但是当我一步一步尝试这样做时,我发现当我平移然后旋转它时,它会随着图像一起移动旋转中心,所以它会围绕与图像距离相同的屏幕外的点旋转作为初始点从平移前的初始图像旋转。 谁能告诉我为什么会发生这种情况或如何解决?

【问题讨论】:

我认为您应该将中心而不是左上角转换为 (0,0)。 【参考方案1】:

Matrix-Operations 和 glTranslatef/glRotatef 以相反的顺序应用。所以当你的旋转中心是 c=(x,y) 时,你必须先沿 -c 平移,然后旋转,再沿 c 平移。

在您的情况下,您必须将两个翻译行交换为以下内容:

glTranslatef(x, y, 0); //Translate back
glRotatef(10, 0, 0, 1); //Rotate
glTranslatef(-x, -y, 0); //Translate first along -c

【讨论】:

谢谢,成功了。不知道它是按相反顺序应用的。 它们在技术上按照编写的顺序应用,但它与后乘列主矩阵和矩阵乘法的非交换性质有关。这与您通常必须在 GLSL 着色器中编写 projection * view * model * vtx 的原因相同,如果您有行主矩阵,则可以编写:vtx * model * view * projection 并获得相同的结果。

以上是关于无法在openGL中围绕它的中心旋转我的图像的主要内容,如果未能解决你的问题,请参考以下文章

Pygame,围绕中心旋转使图像消失

OpenGL 旋转 2D 纹理

如何在 OpenGL 中更改旋转中心

围绕对象中心的 2d OpenGL 旋转

opengl旋转的对象不居中

在OpenGL中围绕坐标旋转四边形