Неправильное отображение при использовании glutReshapeFunc для изменения размера окна - PullRequest
0 голосов
/ 21 сентября 2018

Я знаю, что glutReshapeFunc может использоваться для реагирования на изменение размера окна, поэтому я использовал его для сброса матрицы проекции и рендеринга формы в соответствии с окном.Код выглядит следующим образом:

#include <GLUT/glut.h>

GLsizei wndWidth = 400;
GLsizei wndHeight = 300;

void init() {
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 400, 0, 300);
}

void drawSegment() {
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0, 0, 1.0);

    glBegin(GL_LINE_LOOP);
    glVertex2i(10, 10);
    glVertex2i(wndWidth-10, wndHeight-10);
    glVertex2i(wndWidth-10, 10);
    glEnd();

    glFlush();
}

void reshapeFunc(int width, int height) {


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, GLdouble(width), 0, GLdouble(height));

    glClear(GL_COLOR_BUFFER_BIT);

    wndWidth = width;
    wndHeight = height;
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

    glutInitWindowSize(400, 300);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Draw Window");

    init();
    glutDisplayFunc(drawSegment);
    glutReshapeFunc(reshapeFunc);

    glutMainLoop();
}

По моему мнению, после изменения размера окна треугольник всегда должен занимать половину окна.Но на самом деле треугольник остается своего размера после изменения размера окна, как если бы wndWidth и wndHeight не изменилось в drawSegment.Так почему я получаю неправильный результат и как я могу это исправить?

1 Ответ

0 голосов
/ 21 сентября 2018

Матрица проекции преобразует координаты вида в координаты клипа, а координаты клипа преобразуются в нормализованные координаты устройства (при равных координатах клипа в ортогональной проекции и нормированных координатах устройства).
Как нормализованные координаты устройства отображаются в координаты окна,определяется как glViewport.
После изменения размера окна вам необходимо заново указать отображение:

void reshapeFunc(int width, int height) {

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, GLdouble(width), 0, GLdouble(height));

    wndWidth = width;
    wndHeight = height;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...