OpenGL旋转2D纹理

UPDATE

请参阅底部以获取更新


我一直在寻找很多互联网,我找到了一些教程,解释了我想要实现的目标,但我无法让它工作,教程不完整或不适用于我的代码。

我正在尝试像在原点(中心)周围旋转2D图像一样简单的事情。

我使用xStart,xEnd,yStart和yEnd来翻转0或1的纹理。

这就是代码的样子

GameRectangle dest = destination; Vector2 position = dest.getPosition(); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, this->image); //If the rotation isn't 0 we'll rotate it if (rotation != 0) { glMatrixMode(GL_TEXTURE); glLoadIdentity(); glTranslatef(0.5, 0.5, 0); glRotatef(rotation, 0, 0, 1); glMatrixMode(GL_PROJECTION); } glBegin(GL_QUADS); glTexCoord2d(xStart,yStart); glVertex2f(position.x, position.y); glTexCoord2d(xEnd,yStart); glVertex2f(position.x + this->bounds.getWidth(), position.y); glTexCoord2d(xEnd,yEnd); glVertex2f(position.x + this->bounds.getWidth(), position.y + this->bounds.getHeight()); glTexCoord2d(xStart,yEnd); glVertex2f(position.x, position.y + this->bounds.getHeight()); glEnd(); glDisable(GL_TEXTURE_2D); //Reset the rotation so next object won't be rotated glMatrixMode(GL_TEXTURE); glLoadIdentity(); glRotatef(0, 0, 0, 1); glMatrixMode(GL_PROJECTION); 

此代码将以原始大小绘制图像并将其旋转,但它将从左上角旋转它,从而大量裁剪图像。 通过调用GameRectangle.getOrigin(),我可以很容易地得到矩形的中心,但我不知道在哪里使用它。

比特如果放:

  glTranslatef(-0.5, -0.5, 0); 

我打电话给:

  glRotatef(0.5, 0.5, 0); 

它将从中心旋转,但如果它不是完美的90度旋转,它将拉伸图像。

UPDATE


在尝试了几乎所有可能之后,我得到了我正在寻找的结果。

但我不确定这是否是最佳方法。 请告诉我我的代码是否有问题。

正如我在上面的评论中提到的,我多次使用相同的图像并使用不同的值绘制它,因此我无法将任何内容保存到实际图像中。 所以我必须在每次渲染后重置值。

我将我的代码更改为:

 //Store the position temporary GameRectangle dest = destination; Vector2 position = dest.getPosition(); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, this->image); glTranslatef(dest.getOrigin().x, dest.getOrigin().y, 0); glRotatef(rotation, 0, 0, 1); glBegin(GL_QUADS); glTexCoord2d(xStart,yStart); glVertex2f(-dest.getWidth()/2, -dest.getHeight()/2); glTexCoord2d(xEnd,yStart); glVertex2f(dest.getWidth()/2, -dest.getHeight()/2); glTexCoord2d(xEnd,yEnd); glVertex2f(dest.getWidth()/2, dest.getHeight()/2); glTexCoord2d(xStart,yEnd); glVertex2f(-dest.getWidth()/2, dest.getHeight()/2); glEnd(); //Reset the rotation and translation glRotatef(-rotation,0,0,1); glTranslatef(-dest.getOrigin().x, -dest.getOrigin().y, 0); glDisable(GL_TEXTURE_2D); 

这会将纹理与绘制的四边形一起旋转,它不会拉伸或裁剪。 然而,如果图像填充方形,边缘有点锯齿,但我想我无法避免使用抗锯齿。

你想要的是这个:

 glPushMatrix(); //Save the current matrix. //Change the current matrix. glTranslatef(dest.getOrigin().x, dest.getOrigin().y, 0); glRotatef(rotation, 0, 0, 1); glBegin(GL_QUADS); glTexCoord2d(xStart,yStart); glVertex2f(-dest.getWidth()/2, -dest.getHeight()/2); glTexCoord2d(xEnd,yStart); glVertex2f(dest.getWidth()/2, -dest.getHeight()/2); glTexCoord2d(xEnd,yEnd); glVertex2f(dest.getWidth()/2, dest.getHeight()/2); glTexCoord2d(xStart,yEnd); glVertex2f(-dest.getWidth()/2, dest.getHeight()/2); glEnd(); //Reset the current matrix to the one that was saved. glPopMatrix();