[英]OpenGL rotating a 2D texture
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.