0

我知道,归一化坐标应该是-1(左)和+1(右)和1(底部)和+1(上)应用正交投影或平截头体影响标准化坐标?

这样的:

enter image description here

但经过应用此:

从我onSurfaceChanged方法

GLES20.glViewport(0, 0, width, height); 
float ratio = (float) width/height; 
Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 

//The above line can be replaced with: 
//Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 
//But I get the same results with either frustumM or otrhoM 

而这在我的onDrawFrame方法

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 

(然后我通过mMVPMatrix到我的自定义类的抽签方法,在那里旋转和平移)。

但是,我的坐标似乎改变 - 这大约发生了什么:

enter image description here

正如你所看到的,X坐标都有些改变,-1和+1没有更长的屏幕边缘(我现在使用的设备上,外边缘变为-1.7和+1.7)

Y坐标保持不变。

如果有人能指出我要出错的地方,会很感激吗?我需要它应该是-1到+1。

谢谢

回答

0

我的眼睛看起来正确。如果你的屏幕不是一个正方形,那么你确定你想要你的x轴伸展,所以它的行为就像一个方形屏幕?因为如果你这样做了,那么如果你告诉OpenGL绘制一个正方形,它将在屏幕上显示为一个矩形,而不是当你的屏幕宽度比你的屏幕宽度宽时,你的x轴边缘大于你的y轴边缘您的屏幕高度,如图片所示。这就是为什么你通过ratio到投影,所以它知道如何正确绘制东西。

当你在屏幕上画一个正方形时发生了什么?它显示为正方形还是矩形?

+0

嗯,是啊我明白你的意思了,我写了一个四色渲染方法,你通过坐标(如drawQuad(x,y)),其中x和y被指定为'普通'屏幕坐标在左上角0,0)。该方法然后转换这些以便它们可以被绘制。但是,自从应用投影后,如果我指定0,0,它不会在左上角画出来,如果你看到我的意思,所以我试图理解为了解决这个问题。基本上,如果我将0指定为X坐标,那么我需要渲染方法以某种方式将其解释为屏幕的左侧。除非有更简单的方法去做..... – Zippy 2013-04-07 10:23:28

+0

感谢您的答案,但它解释得很好。我会问另一个关于开发不同资源/比率的问题。我习惯于通过基于屏幕宽度和高度来缩放我的精灵来开发它们,因此它们相对于任何屏幕显示相同的大小。 (即无论游戏运行的屏幕分辨率或屏幕比例如何,游戏的尺寸都是相同的) - 但我看到人们在更宽的屏幕上展示了“在游戏区域展示更多内容”,这是我正在寻找的一个概念很难把握。 – Zippy 2013-04-07 10:27:51