Oru*_*aru 5 c c++ opengl 2d rotation
更新
更新见底部。
我一直在互联网上寻找很多,我发现了一些教程来解释我想要实现的目标,但我无法让它工作,要么教程不完整,要么不适用于我的代码。
我正在尝试像围绕其原点(中心)旋转 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);
Run Code Online (Sandbox Code Playgroud)
此代码将以原始大小绘制图像并旋转它,但它会从左上角旋转它,从而大量裁剪图像。通过调用 GameRectangle.getOrigin() 我可以轻松获得矩形的中心,但我不知道在哪里使用它。
位如果放:
glTranslatef(-0.5, -0.5, 0);
Run Code Online (Sandbox Code Playgroud)
在我打电话之后:
glRotatef(0.5, 0.5, 0);
Run Code Online (Sandbox Code Playgroud)
它将从中心旋转,但如果不是完美的 90 度旋转,它会拉伸图像。
更新
在尝试了几乎所有可能的方法之后,我得到了我想要的结果。
但我不确定这是否是最好的方法。请告诉我我的代码是否有问题。
正如我在上面的评论中提到的,我多次使用相同的图像并使用不同的值绘制它,所以我无法将任何内容保存到实际图像中。所以我每次渲染后都必须重置这些值。
我把我的代码改成这样:
//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);
Run Code Online (Sandbox Code Playgroud)
这会将纹理与其绘制的四边形一起旋转,它不会拉伸或裁剪。然而,如果图像是方形的,边缘会有点锯齿,但我想如果没有抗锯齿我就无法避免这种情况。
你想要的是这样的:
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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19649 次 |
| 最近记录: |