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);
Это вращает текстуру вместе с нарисованным квадом, она не растягивается и не обрезается. Однако края немного зазубренные, если изображение заполнено квадратом, но, думаю, я не смогу избежать этого без сглаживания.