在绘制任何物体之前,首先要搞清楚屏幕的坐标长度和高度,以方便的准确定位位置。
在OpenGL中,有两种不同的投影方式,gluPerspective透视投影和正交投影glOrtho。不同的投影方式,屏幕定位方式也不同
先说正交投影,正交投影往往用于2D画面中,更贴近于传统的定位思路。比如说有以下设定:
glOrtho(0, 640, 0, 480, -1, 1);
设定屏幕的左下角为视图的起点坐标,设定640像素为视图整长度,480为整高度。这里,640 × 480就是整体屏幕的逻辑大小
此时,如果想画一个起点为屏幕左下角,长宽等同于整屏幕大小的矩形,就可以如下:
glBegin(GL_QUADS); //绘制长宽640×480的矩形glTranslatef(0.0f, 0.0f, 0.0f). // 把起点坐标设置为屏幕左下角
glEnd();
在正交投影中,定位是通过glTranslatef的,而且,和透视投影不同的是,正交投影中的X,Y长度,是根据glOrtho设定的,矩形的X,Y也要由此设置,而众所周知,在透视投影中,矩形的坐标系长度是从-1到1的。而现在,在上例中,变成了0~640&&0~480。如果想在屏幕中心画一个16×16的矩形,很简单,首先移动到屏幕中心,根据左下角的起点,x,y分别加上16就可以
glTranslatef(320, 240, 0.0f); //定位到屏幕中心
glBegin(GL_QUADS); //绘制16×16矩形
glVertex2f(0.0f, 0.0f);
glVertex2f(16.0f, 0.0f);
glVertex2f(16.0f, 16.0f);
;glVertex2f(0.0f, 16.0f);
glEnd();
总的说来正交投影是典型的2D思维模式,以左下角作为起点,以实际的像素为单位,进行定位和度量。比较容易理解。
××××××××××××××××××××××××××××××××××××××××××××××××××无敌性感分割线××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
××××××××××××××××××××××××××××××××××××××××××××××××××二次元再分割××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
接下来是透视投影,透视投影比较不一样,在绘制任何物体之前,首先要搞明白的一个就是,屏幕的长度和宽度。在透视投影中,屏幕的宽度随着Z轴的值是变化的
假如是以下标准的透视投影设定:
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height, 0.1f,200.0f);
在Z=0的时候(默认状态下),屏幕的宽度是(-1, -1) ~ (1, 1)
但实际上,我们在Z=0的状态下画东西,是看不到的,Z轴往往是变成负值。以下是个人在自己机器上不同Z轴的测试,数据并不通用,只是为了说明屏幕宽度是随着Z轴的值而变化
Z = -5。 屏幕大小:(-2.8, -2.1)~(2.8, 2.1)
Z = -12。 屏幕大小:(-6.7, -5.0)~(6.7, 5.0)
比如说要在屏幕顶部作画:
z = -5的时候:
glTranslatef(-0.6f, 1.1f, -5.0f);
glBegin(GL_QUADS);
glVertex2f(0.0f, 0.0f);
glVertex2f(1.0f, 0.0f);
glVertex2f(1.0f, 1.0f);
;glVertex2f(0.0f, 1.0f);
glEnd();
z = -12的时候:
这里面的数据往往都是反复调试得出的glTranslatef(-0.6f, 2.0f, -12.0f);
glBegin(GL_QUADS);
glVertex2f(0.0f, 0.0f);
glVertex2f(3.0f, 0.0f);
glVertex2f(3.0f, 3.0f);
;glVertex2f(0.0f, 3.0f);
glEnd();