按纵横比拉伸的OpenGL 2D投影

问题描述 投票:2回答:1

我目前正在尝试使用JOGL将我的2D Java游戏的绘图方法转换为OpenGL,因为原生java似乎很快就能快速连续地绘制高分辨率图像。现在我想使用16:9的宽高比,但问题是我的图像被拉伸到两侧。目前我只是绘制一个白色旋转四边形来测试这个:

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()以某种方式解决这个问题,我现在尝试了很多不同的值,但是没有一个能够实现未拉伸的图像。我该如何使用它?或者还有另一种简单的解决方案吗?

java opengl jogl orthographic opengl-compat
1个回答
3
投票

投影矩阵将所有顶点数据从眼睛坐标变换到剪辑坐标。

然后,通过用剪辑坐标的w分量划分,这些剪辑坐标也被变换为标准化设备坐标(NDC)。归一化设备坐标在(-1, -1, -1)(1, 1, 1)的范围内。

利用正交投影,眼睛空间坐标线性地映射到NDC。

如果视口是矩形,则必须通过映射坐标来考虑。

float aspect = (float)width/height;
gl.glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);
© www.soinside.com 2019 - 2024. All rights reserved.