簡體   English   中英

OpenGL旋轉2D紋理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM