Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按纵横比拉伸的OpenGL二维投影_Java_Opengl_Jogl_Orthographic_Opengl Compat - Fatal编程技术网

Java 按纵横比拉伸的OpenGL二维投影

Java 按纵横比拉伸的OpenGL二维投影,java,opengl,jogl,orthographic,opengl-compat,Java,Opengl,Jogl,Orthographic,Opengl Compat,我目前正在尝试使用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

我目前正在尝试使用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()来解决这个问题,我现在尝试了很多不同的值,但是没有一个能得到一个未拉伸的图像。我要怎么用这个?或者有其他简单的解决方案吗?

投影矩阵将所有顶点数据从眼睛坐标转换为剪辑坐标

float aspect = (float)width/height;
gl.glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);
然后,通过与剪辑坐标的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);

我已经试过了,当我这样做的时候,它被拉伸到屏幕的顶部/底部。它确实有效。问题是我添加了一个GLEventListener twiceYes,这就是工作。我以前尝试过,但没有成功,因为我添加了两次GLeventListener。无论如何,谢谢你:)