2017-08-02 196 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