我有一個包含OpenGL視口的SDL窗口。當用戶通過拖動窗口邊緣來調整窗口大小時,我希望(1)視口擴大以填充窗口,以及(2)視口的內容保持靜止。如何在調整窗口大小時將SDL窗口中的OpenGL視口保持固定?
例如:
------------------------
| | |
| <------ | |
| | X |
| <------ | |
| | |
------------------------
如果該窗口的左邊緣被拖動進一步離開,然後在OpenGL的視口中的對象X應該保持靜止。
我發現,我號召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時,通過拖動邊緣來調整窗口的大小並不會導致視口的內容重新定位。
這個區別是什麼原因造成的?我該如何解決它?
您沒有顯示剩餘的代碼。具體而言,當窗口更改大小時,您並未顯示如何更新視口/投影矩陣。 –
增加了代碼更新模型矩陣。 – uckelman