2D-рисунок Opengl не параллелен экрану

Я думаю, что 2D-плоскость, на которой я рисую, не параллельна экрану.

Во-первых, в моей функции изменения размера окна я помещаю:

static void Resize(int w, int h)
{
width = w;
height = h;

glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float32 ratio = width / height;

b2Vec2 extents(ratio * 25.0f, 25.0f);
extents *= viewZoom;

b2Vec2 lower = settings.viewCenter - extents;
b2Vec2 upper = settings.viewCenter + extents;
gluOrtho2D(lower.x, upper.x, lower.y, upper.y);
}

Вот как я инициализирую opengl.

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA );
glutInitWindowSize(width, height);
mainWindow = glutCreateWindow("window");

И функция drawscene:

void drawScene() {

    glClear(GL_COLOR_BUFFER_BIT );

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();



    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glColor3f(1.0f, 1.0f, 1.0f);

    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f);
    glVertex2f(cords[0].x,cords[0].y);
    glTexCoord2f(1.0f, 0.0f);
    glVertex2f(cords[1].x,cords[1].y);
    glTexCoord2f(1.0f, 1.0f);
    glVertex2f(cords[2].x,cords[2].y);
    glTexCoord2f(0.0f, 1.0f);
    glVertex2f(cords[3].x,cords[3].y);
    glEnd();

    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);

    glutSwapBuffers();
}

Я думаю, что код не проблема, потому что я уже загрузил Identity для ModelView и Projection. Результат моего рисунка таков, что если мой прямоугольник параллелен горизонтальной линии, то это прямоугольник, при повороте на некоторый угол он становится перекошенным. Кажется, что плоскость, на которой я рисую, наклонена назад.


person Min Lin    schedule 19.12.2012    source источник
comment
Совет: всегда устанавливайте область просмотра и матрицу проекции в функции отображения. Это позволяет избежать того, чтобы какая-либо другая часть программы оставалась в нежелательном состоянии.   -  person datenwolf    schedule 19.12.2012
comment
Я думаю, вам может понадобиться добавить gluLookAt, чтобы указать положение глаз. Потому что по умолчанию положение глаз равно 1,1,1. Так что, если ваш прямоугольник достаточно велик, то после преобразования он может оказаться позади положения глаз. Или замените gluOrtho2D на glOrtho(lower.x, upper.x, lower.y, upper.y, -20, 20).   -  person Frank Cheng    schedule 19.12.2012
comment
Совет № 2: OpenGL 1.0 основан на старых способах выполнения задач в фиксированном конвейере. Если вы начинаете, я бы посоветовал просто приложить дополнительные усилия для выяснения OpenGL2... полученные навыки не устареют.   -  person kineticfocus    schedule 01.03.2013


Ответы (1)


Дело банальное:

float32 ratio = width / height;

потому что ширина и высота оба являются целыми, поэтому соотношение не является точным.

Если конвертировать в float, то становится нормально.

person Min Lin    schedule 01.03.2013