OpenGL вращает 2D текстуру - PullRequest
       28

OpenGL вращает 2D текстуру

2 голосов
/ 16 февраля 2012

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

Это вращает текстуру вместе с нарисованным квадом, она не растягивается и не обрезается. Однако края немного зазубренные, если изображение заполнено квадратом, но, думаю, я не смогу избежать этого без сглаживания.

1 Ответ

1 голос
/ 16 февраля 2012

То, что вы хотите, это:

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