c++ - OpenGL 旋转 2D 纹理

标签 c++ c opengl rotation 2d

更新

见底部更新。


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

我正在尝试围绕其原点(中心)旋转 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 度旋转,它会拉伸(stretch)图像。

更新


在尝试了几乎所有可能的方法之后,我得到了我想要的结果。

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

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

我将我的代码更改为:

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

这会旋转纹理及其绘制的四边形,它不会拉伸(stretch)或裁剪。然而,如果图像是正方形的,边缘会有点锯齿,但我想如果没有抗锯齿我就无法避免这种情况。

最佳答案

你要的是这个:

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

关于c++ - OpenGL 旋转 2D 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9312486/

相关文章:

c++ - 我已经完成了 << 运算符重载,但它不起作用

创建 GUI 应用程序

macos - 每台配备 Lion 的 Mac 都支持 OpenGL 3.2 吗?

python - 在运行时python中修改图像

c++ - 编写测试套件的指南

c++ - 调整 vector 大小编译器错误

c++ - 使用堆栈指针删除派生类?

c - 访问结构内数组中的数据时出错

c - 多客户端服务器、多接口(interface)、多IP版本Socket

c++ - 为什么我不能使用 EGL 创建 headless OpenGl 上下文?