Java OpenGL未按预期进行渲染
如果我有以下屏幕设置Java OpenGL未按预期进行渲染,java,android,opengl-es,Java,Android,Opengl Es,如果我有以下屏幕设置 gl.glViewport(0,0,width,height); //Reset the current viewport gl.glMatrixMode(GL10.GL_PROJECTION); //select the projection matrix gl.glLoadIdentity(); //Reset the Projection Matrix gl.glOrthof(0f,1f,0f,1f,-1f,1
gl.glViewport(0,0,width,height); //Reset the current viewport
gl.glMatrixMode(GL10.GL_PROJECTION); //select the projection matrix
gl.glLoadIdentity(); //Reset the Projection Matrix
gl.glOrthof(0f,1f,0f,1f,-1f,1f);
顶点的设置如下所示
this._vertices=new float[]{
0.0f,0.5f,0.0f, //V1 bottom left
0.0f,1.0f,0.0f, //V2 top left
0.5f,0.5f,0.0f, //V3 Bottom right
0.5f,1.0f,0.0f //V4 top right
};
那么当我画画的时候
gl.glTranslatef(0.0f,0.0f,0.0f);
它将正方形放在左上角(我以为0,0是左下角?)
然后
gl.glTranslatef(0.5f,-0.5f,0.0f);
把正方形放在屏幕中间(暗示底部实际上是-1.0F而不是0.0F)
如何使屏幕的左下角从0,0开始 更新------ 我发现如果我改变路线gl.glOrthof(0f,1f,0f,1f,-1f,1f);
到
然后没有任何变化(即左上角仍然为0,0,左下角为0,-1)
但是,如果我完全不使用该行,则原点位于屏幕的中心(即左上角为-1,-1)使用
glOrthof
创建屏幕坐标系,因为它的输入参数是左、右、上和下,我无法理解混淆的地方。如果您希望左上角是(0,0)点,则只需将“上”和“左”参数设置为零,将“下”和“右”参数设置为一些正值,使正X向右,正Y向下
使用glOrthof
的一些非常常见的情况是:
- 在左上角插入
,在右下角插入(0,0)
的位置查看坐标系。但在相当多的情况下,左下角位于(屏幕高度、屏幕宽度)
(0,0)
- 图形坐标系,屏幕中心位于
,左上角位于(0,0)
,右下角位于(1,-1)
(-1,1)
- 标准化视图系统,屏幕中心位于
,但高度与宽度相关,具体取决于屏幕比率。因此,左上角位于(0,0)
,右下角位于(-1,-(屏幕高度/屏幕宽度))
(1,屏幕高度/屏幕宽度)
a/b=screenWidth/screenHeight
)。因此,选择最适合您的应用程序
您应该知道,
glOrthof
对于平移和缩放也非常有用。你不需要做一些奇怪的转换和缩放,只需更改glOrthof
参数,就可以显示场景的某个部分。我认为在计算机图形世界中(0,0)通常是左上角,而不是你在数学中可能学到的左下角。不知道这是否是可以更改的。glTranslatef(0.0f,0.0f,0.0f)
完全没有用。您正在向每个方向平移0个单位。glTranslatef(0.0f,0.0f,0.0f)
实际上什么都不做。在每个方向上平移坐标0.0个单位的平移矩阵归结为一个单位矩阵。当你用一个恒等矩阵乘以某个东西时,什么都不会改变。因此,如果使用glTranslatef(0.0f,0.0f,0.0f)
您的四元组从Y=0.5开始,到Y=1.0结束。您需要转换它(0.0,-0.5,0.0),使您的四边形从左下角开始。glTranslatef(0.5f,0.5f,0.0f)
实际上会将您的四边形完全推出屏幕。给定投影矩阵,视口将映射到(0,0)-(1,1)。您的四元组将从Y=1.0开始,在Y=1.5结束。是的,这是正确的。从技术上讲,它将当前矩阵乘以转换矩阵(这就是我之前提到的glTranslatef(0.0f,0.0f,0.0f)
退化为单位矩阵的原因),但这就是最终结果。
gl.glOrthof(0f,1f,1f,0f,-1f,1f);