opengl入门(ubuntu版)(二)

在正式介绍opengl函数前先说一些基础知识。

1.窗口与视口

在使用opengl之前,我们要明白一个什么是窗口,什么是视口。这里给一个不太准确的定义,窗口的大小表示全部可以用来画图的范围,而视口的大小表示当前允许你画图的范围。
下面是一个小例子,虽然还没有说明opengl具体函数的使用,这里也先看一个简单的例子,说明窗口与视口的关系。代码如下:

    glViewport(30,30,100,100);
    glBegin(GL_LINES);
    glVertex2f(-1.0,-1.0);
    glVertex2f(-1.0,1.0);

    glVertex2f(-1.0,1.0);
    glVertex2f(1.0,1.0);

    glVertex2f(1.0,1.0);
    glVertex2f(1.0,-1.0);

    glVertex2f(1.0,-1.0);
    glVertex2f(-1.0,-1.0);
    glEnd();
    glViewport(50,50,200,200);
    glBegin(GL_LINES);
    glVertex2f(-1.0,-1.0);
    glVertex2f(-1.0,1.0);

    glVertex2f(-1.0,1.0);
    glVertex2f(1.0,1.0);

    glVertex2f(1.0,1.0);
    glVertex2f(1.0,-1.0);

    glVertex2f(1.0,-1.0);
    glVertex2f(-1.0,-1.0);
    glEnd();

代码执行后的效果如下:
这里写图片描述
上面的代码中glViewport就是用来设置视口在窗口中的位置。代码执行顺序如下:
1.将视口的宽高设置为100,并将视口的左下角放在窗口的(30,30)的地方;
2.沿着视口边缘绘制四条线;
3.将视口的宽高改为200,并将视口的左下角放在窗口的(50,50)的地方;
4.沿着视口边缘绘制四条线;
看了这个例子,就比较好理解视口与窗口了,默认情况下视口的大小就是窗口的大小。所以可以在整个窗口范围内绘图。

2.坐标系

opengl的作用是在屏幕上绘图,所以opengl需要知道把图绘制到什么地方。上面已经说过,我们只能在视口的范围内绘制,所以,我们需要在视口内建立一个坐标系统,将视口内的每一个点都用坐标表示出来,这样opengl在绘制时就知道将图形的每个点都画在什么地方了。以下是opengl默认的坐标系:
这里写图片描述
其中绿色的框代表视口范围,x,y,z轴的默认范围都是-1~1的小数,原点在视口的中心,z轴的正方向是从屏幕指向观看屏幕的人。以上这些只是默认情况的设置,如果需要都可以修改。
这里有两点要说明的:
1.视口内的坐标默认是浮点数,所以理论上是连续的,但屏幕是由无数离散的点组成的,所以如果你要opengl画一个(-0.345,0.123)的点,opengl的底层会进行“四舍五入”将这个点画在最接近的位置。
2.视口与窗口间的位置关系和视口内部使用两套不同的坐标系统。大家可以通过以上的说明体会一下。

3.正投影与透视投影

先说说什么是投影,在上文中我们提到了一个z轴,其实仔细想想你会发现这个z轴很不“自然”。计算机的屏幕毕竟是一个二维平面,你在z轴上画一个点,到底要画在二维屏幕上的什么位置上呢?这就好像你在画画,你看到的东西都是三维的,但你画画用的纸,却是一个二维平面,你需要一些技巧,利用这些技巧你可以实现在二维平面上画出来的东西,让人“看起来”是三维的。我想这并不难理解,这个技巧就叫做投影。
对于艺术家来说,这种技巧有很多种,有些画家就是凭借自己独特的技巧而成名。但对于opengl这个技巧有两种,正投影和透视投影。
下图左边就是正投影,右边就是透视投影。
这里写图片描述

正投影可以理解为用一束平行光去“照”一个三维物体,再用一张纸放在物体的后面,那么三维物体的每个边就都会在纸上留下一个影子,这样,就实现了三维物体到二维平面的映射,也就是投影。
透视投影与正投影的区别就是,将平行光,换为一个点光源。这样的映射会出现一个近大远小的效果(右图投射在纸上的红线就比绿线长),也比较符合我们在现实世界看到的效果。
其实,要生动的理解正投影与透视投影,需要一点数学的能力和对眼球构造的了解。但我觉得比较有用的就是记住以下几点:
1.透视投影是用点光源,可以实现近大远小,比较符合眼睛看东西的习惯;
2.正投影没有近大远小的效果,多用于模型设计等工业场合,可以精确反映物体的长度等物理量。

4.正面与反面

在现实的世界里,任何实体都是三维的,再薄的一章纸,都是有厚度的,所以现实世界里纸就有正反两个面。opengl也真实的模拟了这种现象。对于opengl来说,绘制的每一个图形,都有正面和反面。你可以为正面和反面填充不同的颜色等效果,就好像你可以把一张纸的正面涂成红色,反面涂成绿色。
这里有一个“特殊”的情况需要说明一下,opengl绘制的“立体“,都是空心的。比如你绘制一个立方体,它是由6个“面”组成的,由于立方体是空心的,所以每个”面“依然有正面与反面。在默认情况下,opengl会去绘制所有的正面与反面,即使反面无法被看到。
正面与反面的各种现象实际还有好多,我以上只是给大家一个粗略的印象,有些正反面产生的效果,甚至会让你觉得“不科学”。但要想把“不科学”的东西,科学的解释出来,需要更多的知识,我会在后续补充。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值