按纵横比拉伸的 OpenGL 2D 投影
Posted
技术标签:
【中文标题】按纵横比拉伸的 OpenGL 2D 投影【英文标题】:OpenGL 2D projection stretched by aspect ratio 【发布时间】:2017-08-02 10:34:29 【问题描述】:我目前正在尝试使用 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() 以某种方式解决此问题,我现在为此尝试了许多不同的值,但没有一个获得未拉伸的图像。我该如何使用它?或者有其他简单的解决方案吗?
【问题讨论】:
我已经尝试过了,当我这样做时,它会被拉伸到屏幕的顶部/底部 没关系。它确实有效。问题是我两次添加了 GLEventListener 【参考方案1】:投影矩阵将所有顶点数据从眼睛坐标转换为剪辑坐标。
然后,这些剪辑坐标也通过除以剪辑坐标的 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 两次。还是谢谢你:)以上是关于按纵横比拉伸的 OpenGL 2D 投影的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中的 OpenGL 中将坐标从 3D 透视投影映射到 2D 正交投影
如何在opengl中计算给定3D点及其2D屏幕位置的投影/模型视图矩阵