OpenGL学习笔记:如何屏幕定位

在绘制任何物体之前,首先要搞清楚屏幕的坐标长度和高度,以方便的准确定位位置。


在OpenGL中,有两种不同的投影方式,gluPerspective透视投影和正交投影glOrtho。不同的投影方式,屏幕定位方式也不同


先说正交投影,正交投影往往用于2D画面中,更贴近于传统的定位思路。比如说有以下设定:

glOrtho(0, 640, 0, 480, -1, 1);

设定屏幕的左下角为视图的起点坐标,设定640像素为视图整长度,480为整高度。这里,640 × 480就是整体屏幕的逻辑大小

此时,如果想画一个起点为屏幕左下角,长宽等同于整屏幕大小的矩形,就可以如下:

glTranslatef(0.0f, 0.0f, 0.0f).             // 把起点坐标设置为屏幕左下角

     glBegin(GL_QUADS);                      //绘制长宽640×480的矩形
glVertex2f(0.0f, 0.0f);
glVertex2f(640.0f, 0.0f);
glVertex2f(640.0f, 480.0f);
glVertex2f(0.0f, 480.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();

这里面的数据往往都是反复调试得出的
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值