2012-07-04 70 views
1

我可能有一個簡單的數學問題,我很難搞清楚。我有一個可調整大小的LWJGL(OpenGL)窗口。我製作的遊戲是2D的,但我使用glFrustum()來獲得我的精靈的深度。下面是我的投影代碼(有點簡化)片段:LWJGL光標在調整大小時出現問題

double divider = 64.0; 
double left = -vw/divider; 
double right = vw/divider; 
double bottom = vh/divider; 
double top = -vh/divider; 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glFrustum(left * aspect, right * aspect, bottom, top, 8, 65536); 

float zModifier = -256; 
float vRatio = Game.HEIGHT/Display.getHeight(); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(-vw/2.0f, -vh/2.0f, zModifier * vRatio); 

(我必須承認,我不明白的視錐位非常好,我發現這段代碼在互聯網上的某個地方,它曾我很好...)

但是,我用一個精靈渲染自己的光標,並在光標與窗口邊界接觸時切換到本機光標。這一切都很好,直到我使窗口可調整大小。

現在我的問題是,當我調整窗口的大小時,本地光標與光標光標相對於vRatio「不同步」。根據調整後的窗口大小,它會「跳」一點,或者更多一點。

當精靈光標來與邊框接觸,我做了以下內容:

  1. 隱藏精靈光標
  2. 顯示本機光標
  3. 將本地光標的位置雪碧光標的位置(這不能正常工作了)

我覺得有一個簡單的數學解決方案,這一點,但我不明白我出來(我試過的東西......但..)。

我希望我的問題不是太模糊,並且我提供了足夠的信息!

+0

當你調整窗口大小時,你在更新'Game.HEIGHT'嗎? – corsiKa

+0

不,我不是,我用這一點代碼來適應遊戲區域大小的窗口。 – n00bster

+0

我明白了。那麼,對窗戶的寬度以及如何適當縮放會有什麼顧慮?看起來你真的需要兩個比率,除非你堅持認爲你的遊戲窗口總是具有相同的w:h比率, – corsiKa

回答

1

起初你的窗口大小與OpenGLs相匹配。但是當你調整窗口大小時,投影必須改變。所以至少添加了一個縮放因子。這解釋了爲什麼遊標不同步。

如果您想讓它們始終保持同步,則必須將窗口座標映射到世界座標。這可以用gluUnProjectOpenGL: gluUnProject完成。您已經手動完成了這項工作,但未考慮導致您的問題的分辨率變化。

爲了完整起見,相反,來自世界去座標窗口座標,也可以OpenGL: gluProject

當使用這些功能,你必須讓你的手模型矩陣,投影矩陣和視口。爲此目的使用glGet *系列的功能。請務必在正確設置的位置加載這些矩陣!

+0

非常感謝您的回覆!我剛回到這裏,並且完美地與gluUnProject一起工作!我看看我是否會稍後發佈代碼......以防其他人與此同時苦苦掙扎問題。 – n00bster