《OpenGL 3基本图形绘制》由会员分享,可在线阅读,更多相关《OpenGL 3基本图形绘制(53页珍藏版)》请在金锄头文库上搜索。
1、1,第 3 章,OpenGL基本图形绘制,3.1 OpenGL的数据类型,3.1 OpenGL的数据类型,所有的数据类型都以GL开头,表示是OpenGL。紧跟在后面的大多是它们相应的C数据类型。 一些开始有个u表示是无符号的数据类型,如:ubyte表示是无符号的字节。也给出了更多的描述名字的方法,如:size表示一个值的长度。GLsizei表示是一个GL变量,且参数的大小是一个整型。 Clamp是用于颜色的。这种数据类型以f和d结尾表示实型或双精度型数据类型。GLboolean变量用于标示True和False;GLenum用于枚举型变量; GLbitfield 用于包含二进制位的区域的变量。,
2、3.2 函数命名的语法,OpenGL函数都遵循一个命名约定,即采用以下格式: 函数glColor3f(1.0,0,0),gl表示这个函数来自库gl.h,color表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数。 GLfloat color =1.0,0,0 ; glColor3fv(color);,函数格式示例:定义点函数,3.2 函数命名的语法,3.3 OpenGL是一种状态机,OpenGL的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。 状态变量可以通过glEnable()、glDisable()这两个函数来设置成有效或无效状
3、态 。 另外可以用下列四个函数来获取某个状态变量的值:glGetBooleanv()、glGetDoublev()、glGetFloatv()和glGetIntegerv()。,3.4 OpenGL变换,OpenGL就是实现将物体的各个顶点通过各种变换矩阵的作用映射到屏幕的过程 。下图是顶点变换过程。注意: 在模型视图变换过程中,顶点的法向量也自动地进行变换。,3.4 OpenGL变换,视点变换(视图变换) 模型变换 投影变换 视口变换 裁剪变换,OpenGL的变换过程,OpenGL的坐标变换过程类似于用照相机拍摄照片的过程。使用照相机与坐标变换的步骤比较如下: 。 分为以下四步: 支起三角架
4、,把照相机放在场景中(视图变换)。 将要拍的场景置于所要求的位置上(模型变换)。 选择照相机镜头或调节焦距(投影变换)。 确定照片的大小,可以放大照片的某一部分(视口变换)。 其中(1)、(2)顺序可看成照相馆中的照相过程;而在室外摄影时,由于先有景物,再选择照相机的位置与方向,因此照相顺序可看成(2)、(1)。,模型-视图变换,模型-视图变换过程就是一个将顶点坐标从世界坐标变换到视觉坐标的过程。这里很重要的是对两个坐标系的认识。 世界坐标系也称为全局坐标系。它是一个右手坐标系,可以认为该坐标系是固定不变的,在初始态下,其x轴为沿屏幕水平向右,y轴为沿屏幕垂直向上,z轴则为垂直屏幕面向外指向用
5、户。 视觉坐标系(即观察坐标系)也称为局部坐标系。它是一个左手坐标系,该坐标系是可以活动的。在初始态下,其原点及x、y轴分别与世界坐标系的原点及x、y轴重合,而z轴则正好相反,即为垂直屏幕面向内。 默认:视点在原点,视线沿Z轴负方向。,坐标系,右手坐标系,缺省的观察坐标系,视点变换,View变换可以改变视点的位置和方向,要在Model变换之前调用。设置任意观察坐标点。,void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, Gldouble centerx, GLdouble centery, GLdouble centerz,
6、Gldouble upx, GLdouble upy, GLdouble upz); (eyex, eyey, eyez)为视点位置 (centerx, centery, centerz)为观察参考点的位置 (upx, upy, upz)为向上向量的方向,模型变换,平移变换 放缩变换 旋转变换,viod glTranslatefd(TYPE deltax,TYPE deltay,TYPE deltaz);,void glScalefd(TYPE sx,TYPE sy,TYPE sz);,void glRotatefd(TYPE angle,TYPE x,TYPE y,TYPE z);,(x,y
7、,z),o,逆时针为旋转正向,投影变换,就是要确定一个视景体,其作用有两个: 确定物体投影到屏幕的方式,即是透视投影还是正交投影。 确定从图象上裁剪掉哪些物体或物体的某些部分。 投影变换包括透视投影和正交投影(平行投影),透视投影,其视景体是一个截头锥体,再这个体积内的物体投影到锥的顶点,有glFrustum命令定义这个截头锥体,这个取景体积可以是不对称的 void glFrustum(Gldouble left,Gldouble right,Gldouble bottom,Gldouble top, Gldouble near,Gldouble far);,透视投影的示意图,透视投影:“近大
8、远小”,类似与人眼的视觉机制,透视投影,void gluPerspective(GLdouble fovy,GLdouble aspect, GLdouble near,GLdouble far);,w,坐标原点,h,aspect = w/h,near,far,fovy,正交投影,其视景体是一个各面均为矩形的六面体,用glOrtho命令创建正交平行的取景体积 void glOrtho(Gldouble left,Gldouble right,Gldouble bottom,Gldouble top, Gldouble near,Gldouble far);,正交投影的示意图,正交投影,对于二维
9、图形向二维屏幕的投影,则应使用实用库中的如下函数: void gluOrtho2D(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top); 前面提到过,用二维顶点命令绘制的二维物体的z坐标均为零,而gluOrtho2D()命令假定场景中的 z 坐标介于-1.0和 1.0 之间。,视口变换,void glViewport(GLint x,GLint y,GLint width,GLint height); (x,y):视区左下角位置 width,height:视区的宽和高,三维图形的变换流程,视图变换,模型变换,投影变换,窗口
10、至视 区的变换,OpenGL中的多种变换(几何变换、投影变换等)是由矩阵的乘积实现的。 OpenGL提供了一系列矩阵操作函数。 (1)确定当前矩阵栈,void glMatrixMode(Glenum mode); 参数取值: GL_MODELVIEW:模型视图矩阵 GL_PROJECTION:投影矩阵 GL_TEXTURE:纹理矩阵 默认的选定矩阵为模型-视图变换。,矩阵栈及其操作(1/8),矩阵栈及其操作(2/8),清矩阵栈栈顶,void glLoadIdentity(void); 将栈顶矩阵替换为单位矩阵 取消之前变换的作用,glLoadIdentity(),矩阵栈及其操作(3/8),压栈
11、,void glPushMatrix(void); 复制栈顶矩阵并压入栈 记住位置,坐标系1,坐标系2,坐标系1,坐标系2,坐标系3,矩阵栈及其操作(4/8),出栈,void glPopMatrix(void); 弹出栈顶矩阵 回到记住的位置,坐标系1,坐标系2,坐标系3,坐标系1,坐标系2,矩阵栈及其操作(5/8),设置栈顶矩阵,void glLoadMatrix(const TYPE *matrix); 将栈顶矩阵替换为matrix 实现任意变换,glLoadMatrix(M2),矩阵栈及其操作(6/8),矩阵相乘,void glMultiMatrixfd(const TYPE *matr
12、ix); 以矩阵matrix右乘栈顶矩阵并替换栈顶矩阵 实现任意变换,M1*M2,glMultiMatrix(M2),矩阵栈及其操作(7/8),基本几何变换的作用 平移变换 放缩变换,矩阵栈及其操作(8/8),旋转变换,变换的顺序: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(N); /* apply transformation N */ glMultMatrixf(M); /* apply transformation M */ glMultMatrixf(L); /* apply transformation L
13、 */ glBegin(GL_POINTS); glVertex3f(v); /* draw transformed vertex v */ glEnd(); 在这个过程中,在GL_MODELVIEW状态下,相继引入了I(单位阵),N,M,L矩阵。变换后的顶点为NMLv(顶点取列向量)。因此,顶点的变换为N(M(Lv),即是先作变换L,然后是变换M,最后才是N。这里,顶点v 的实际变换顺序正好与指定的顺序相反。,在调用投影变换命令前必须先在程序中加入下述语句: glMatrixMode(GL_PROJECTION); glLoadIdentity(); 这两条命令一方面指定接下来的变换命令只影
14、响投影矩阵,同时也将当前投影矩阵设置为单位阵。,矩阵 ModelView矩阵:描述了物体的旋转、平移、缩放等变换 Projection矩阵:描述了从三维空间到二维屏幕的变换,OpenGL中的ModelView变换机制,OpenGL中的ModelView变换机制,ModelView矩阵保存着视点变换和模型变换矩阵的累积乘积,每一次的视点变换或模型变换矩阵与当前的ModelView矩阵相乘就生成一个新的ModelView矩阵。 ModelView矩阵堆栈至少包含32个44的矩阵,初始状态, 最顶层的矩阵为单位阵。 用户可以通过函数glGetIntegerv()得到系统所允许的最大矩阵数目: glG
15、etIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH);,OpenGL中的ModelView变换机制,Projection矩阵保存着描述视景体的投影变换矩阵。一般情况下, Projection矩阵不需要复合,因此在进行投影前需要调用函数glLoadIdentity()。 用户可以通过函数glGetIntegerv()得到系统所允许的最大矩阵数目: glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH);,矩阵堆栈用于保存和恢复矩阵的状态,OpenGL提供了函数glPushMatrix()和glPopMatrix()进行堆栈操作。 优势
16、: 可以保存指定的矩阵状态,并在需要时进行恢复,从而避免通过逆变换进行状态恢复时带来的大量的矩阵运算,提高了绘图的效率。,OpenGL中的ModelView变换机制,OpenGL中的ModelView变换机制,ModelView变换: Model变换、View变换 Model变换可以改变物体的位置和尺寸,相当于几何变换。View变换改变相机的位置和观察方向,相当于坐标变换。 由于两者的等价性,OpenGL中Model变换和View变换用同一个矩阵表示:ModelView矩阵。,3.5 OpenGL基本图形的绘制,OpenGL提供了描述点、线、多边形的绘制机制。它们通过glBegin()函数和glEnd()函数配对来完成。 void glBegin(Glenum mode);mode取值见下表。 glEnd()函数标志着形状的结束,该函数没有参数。,OpenGL基本图形的绘制,点的绘制,点的绘制 glBegin(GL_POINTS); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(10.0f, 0.0f, 0.0f); glEnd(); 点的属性(大小) void glPointSize(GLfloat size);,