2017-08-02 195 views
2

我目前正在嘗試通過使用JOGL將我的2D java遊戲的繪圖方法轉換爲OpenGL,因爲本機Java在快速連續繪製高分辨率圖像時似乎相當緩慢。現在我想要使用16:9的寬高比,但問題是我的圖像拉伸到了兩側。目前,我只畫一個白色的旋轉四測試此:縱橫比拉伸的OpenGL 2D投影

public void resize(GLAutoDrawable d, int width, int height) { 

    GL2 gl = d.getGL().getGL2(); // get the OpenGL 2 graphics context 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL2.GL_PROJECTION); 
    gl.glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f); 

} 

public void display(GLAutoDrawable d) { 

    GL2 gl = d.getGL().getGL2(); // get the OpenGL 2 graphics context 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    gl.glClear(GL.GL_COLOR_BUFFER_BIT); 

    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    gl.glColor3f(1.0f,1.0f,1.0f); 

    degree += 0.1f; 

    gl.glRotatef(degree, 0.0f, 0.0f, 1.0f); 

    gl.glBegin(GL2.GL_QUADS); 
    gl.glVertex2f(-0.25f, 0.25f); 
    gl.glVertex2f(0.25f, 0.25f); 
    gl.glVertex2f(0.25f, -0.25f); 
    gl.glVertex2f(-0.25f, -0.25f); 
    gl.glEnd(); 

    gl.glRotatef(-degree, 0.0f, 0.0f, 1.0f); 

    gl.glFlush(); 
} 

我知道,你能以某種方式使用glOrtho(),我現在嘗試了這麼多不同的值ADRESS這個問題,但他們沒有實現未拉伸的圖像。我該如何使用它?還是有另一個簡單的解決方案呢?

+1

'float aspect =(float)widht/height; gl.glOrtho(-aspect,aspect,-1.0f,1.0f,-1.0f,1.0f);' – Rabbid76

+0

我已經試過這個,當我這樣做的時候,它被拉伸到屏幕的頂部/底部 – Aschas

+0

Nevermind。它確實有效。問題是我添加了兩次GLEventListener – Aschas

回答

3

投影矩陣將所有頂點數據從眼睛座標轉換爲剪輯座標。 然後,這些剪輯座標也通過用剪輯座標的w分量進行分割而轉換爲標準化設備座標(NDC)。 標準化的設備座標範圍爲(-1,-1,-1)至(1,1,1)。

通過正投影,眼睛空間座標線性映射到NDC。

如果視口是矩形的,則必須通過映射座標來考慮。

float aspect = (float)widht/height; 
gl.glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f); 
+0

是的,這是做這項工作。我之前嘗試過,但它沒有工作,因爲我添加了兩次GLeventListener。不管怎樣,謝謝你 :) – Aschas