Как сохранить видовой экран OpenGL в окне SDL стационарным при изменении размера окна? - PullRequest
3 голосов
/ 25 июня 2011

У меня есть окно SDL, содержащее окно просмотра OpenGL.Когда пользователь изменяет размер окна, перетаскивая край окна, я бы хотел, чтобы (1) окно просмотра расширялось, чтобы заполнить окно, и (2) чтобы содержимое окна просмотра оставалось неподвижным.

Дляпример:

------------------------
|          |           |
|  <------ |           |
|          |        X  |
|  <------ |           |
|          |           |
------------------------

Если левый край окна перетащить дальше влево, то объект X в окне просмотра OpenGL должен оставаться неподвижным.

Я обнаружил, что код I 'm вызов событий SDL_VIDEORESIZE не только не делает этого, но и вызывает некоторое ужасное мерцание:

SDL_FreeSurface(window);
window = SDL_SetVideoMode(_w, _h, 32, SDL_OPENGL | SDL_RESIZABLE);

glViewport(0, 0, _w, _h);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

const double w_2 = _w/2.0;
const double h_2 = _h/2.0;

gluOrtho2D(-w_2, w_2, -h_2, h_2);

// adjust model matrix
const double s_cosT = _scale*cos(_theta);
const double s_sinT = _scale*sin(_theta);

model[ 0] =  s_cosT;
model[ 1] =  s_sinT;
model[ 4] = -s_sinT;
model[ 5] =  s_cosT;
model[12] =  s_cosT*_x - s_sinT*_y;
model[13] =  s_sinT*_x + s_cosT*_y;

glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(model);

Что этот код, кажется, делает при изменении размера окна, чтобы перевести то, что было в центре старогоокно просмотра должно быть в центре нового окна просмотра.Тот же код работал, как я и ожидал, при использовании с GLUT вместо SDL - с GLUT, изменение размера окна путем перетаскивания краев не приводило к повторному центрированию содержимого области просмотра.

Что объясняет эту разницу?Как я могу это исправить?

1 Ответ

2 голосов
/ 25 июня 2011

Единственный способ сделать это - заставить матрицу просмотра перемещаться вместе с окном.Это означает, что в дополнение к изменению матрицы преобразования при изменении размера необходимо также настроить ее при нажатии и перетаскивании окна.Чтобы продемонстрировать эквивалентность перемещения окна и повторного изменения размера, подумайте, что произойдет, если вы выполните несколько инкрементных изменений размера, например:

|---------------|                   1.  Starting window

        |-------|                   2.  Resize left edge

        |---------------|           3.  Resize right edge

Таким образом, чтобы получить желаемое поведение, вы должны установить для матрицы gluOrtho2D значениеследующее значение каждый раз, когда ваше окно перемещается / изменяется в размере (или, альтернативно, в начале кадра, где вы рисуете все):

int wind_x, wind_y;
SDL_GetWindowPosition(window, &wind_x, &wind_y);
gluOrtho2D(wind_x, wind_x + w, wind_y, wind_y + h);
...