视图

来源:互联网 发布:fluent软件中文版 编辑:程序博客网 时间:2024/06/06 01:35

一、四种变换

1. 视图变换;

2. 模型变换;

3. 投影变换;

4. 视口变换。

弄明白这四种变换,视图方面的理解也该差不多了。

首先定义位置。OpenGL中位置用(x,y,z,w)表示,x,y,z表示空间中的位置,而w通常为1,在之后的“透视除法”中使用。

二、视图变换

比如用库函数画一个四面体线框:

  1. gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  
  2. glutWireCube(1.0);  

视图变换设置:位置为(0.0, 0.0, 5.0),视线上的任一点(0.0, 0.0, 0.0),即确定了方向,向上方向为(0.0, 1.0, 0.0),即Y轴正方向。显示的结果为:



如若改变视图变换为:

  1. gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0);  

显示的结果为:


即把照相机向右倾斜了45度。

默认情况下,照相机位于原点,指向z轴的负方向,以y轴的正方向为朝上方向。

三、模型变换

模型变换是对空间中的物体进行变换,主要有三种:平移、旋转和缩放。

  1. void glTranslate(TYPE x, TYPE y, TYPE z);  
  2. void glRotate(TYPE angle, TYPE x, TYPE y, TYPE z);  
  3. void glScale(TYPE x, TYPE y, TYPE z);  

实际上,视图变换的某些效果可以由模型变换组合得到。因此,在OpenGL中,把视图变换和模型变换一起用模型视图矩阵表示(关于矩阵见后)。

四、投影变换

投影变换做两件事:一是规定场景中的哪部分进行显示(定义视景体/平头截体);二是如何显示(正投影和透视投影)。

定义视景体的部分总被我忽略,导致显示与预计不符,这种错误会浪费”巨大“时间去追踪。

1. 透视投影

透视投影将距照相机远的物体显示的较小。openGL库以glFrustum指定透视投影及其视影体。



  1. void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);  

指定了视影体的左下近点和右上远点。

另有openGL工具函数库提供gluPerspective函数定义视影体(较直观)。

  1. void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far);  


如下示例代码及其显示效果:

2. 正投影

正投影的视景体是个长方体。物体和照相机间的距离不影响其显示大小。正投影由glOrtho指定。

  1. void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);  

透视投影和正投影的效果:

       

前图为透视投影,后图为正投影。

五、视口变换。

通俗的讲,视口变换规定了最终图像显示在窗口的哪个区域。

  1. void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);  

左下角为(x,y),宽为width,高为height。

以上图为例,”正常情况“下视口的宽高比与窗口相同,显示的是正方体。但是如果宽高比为1:2,则显示的是长方体,如下。

  1. glViewport(0, 0, (GLsizei)w/2, (GLsizei)h);  



0 0
原创粉丝点击