2011-06-24 60 views
3

我有一個包含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時,通過拖動邊緣來調整窗口的大小並不會導致視口的內容重新定位。

這個區別是什麼原因造成的?我該如何解決它?

+1

您沒有顯示剩餘的代碼。具體而言,當窗口更改大小時,您並未顯示如何更新視口/投影矩陣。 –

+0

增加了代碼更新模型矩陣。 – uckelman

回答

2

要做到這一點的唯一方法是也使視圖矩陣隨窗口移動。這意味着除了在調整大小時更改轉換矩陣之外,還必須在單擊並拖動窗口時對其進行調整。爲了證明移動窗口和反覆調整大小的等價性,可以考慮,如果你不喜歡這樣一羣增量resizings會發生什麼:

|---------------|     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); 
+1

好點。拖動右邊緣的大多數解決方案在拖動左邊緣時可能會嚴重損壞。這應該適用於兩者。 –

+0

「SDL_GetWindowPosition」不存在,就我所見。 – uckelman

+0

你使用的是哪個版本?它在最新版本:http://wiki.libsdl.org/moin.cgi/SDL_GetWindowPosition?highlight=%28%5CbCategoryVideo%5Cb%29%7C%28CategoryStruct%29%7C%28CategoryEnum%29 – Mikola

相關問題