阅读:1436回复:0
OpenGL系列讲座(6)
4.2 绘制图元
4.2.1 定义顶点 在OpenGL中,所有几何物体最终都由有一定顺序的顶点集来描述。函数 glVertex{234}{sifd}[v](TYPE coords)可以用二维、三维或齐次坐标定义顶点。举例如下: glVertex2s(2,3); glVertex3d(0.0,1.0,3.1414926535); glVertex4f(2.4,1.0,-2.2,2.0); GLfloat pp[3]={5.0,2.0,10.2}; glVertex3fv(pp); 第一例子表示一个空间顶点(2,3,0),第二个例子表示用双精度浮点数定义一个顶点,第 三个例子表示用齐次坐标定义一个顶点,其真实坐标为(1.2,0.5,-1.1),最后一个例子表示 用一个指针(或数组)定义顶点。 4.2.2 构造几何图元 在实际应用中,通常用一组相关的顶点序列以一定的方式组织起来定义某个几何图元,而 不采用单独定义多个顶点来构造几何图元。在OpenGL中,所有被定义的顶点必须放在 glBegain()和glEnd()两个函数之间才能正确表达一个几何图元或物体,否则,glVertex*() 不完成任何操作。如: glBegin(GL_POLYGON); glVertex2f(0.0,0.0); glVertex2f(0.0,3.0); glVertex2f(3.0,3.0); glVertex2f(4.0,1.5); glVertex2f(3.0,0.0); glEnd(); 以上这段程序定义了一个多边形,如果将glBegin()中的参数GL_POLYGON改为 GL_POINTS,则图形变为一组顶点(5个),见图2-4-3所示。 GL_POLYGON GL_POINTS 图2-4-3 绘制多边形或一组顶点 函数glBegin(GLenum mode)标志描述一个几何图元的顶点列表的开始,其参数mode 表示几何图元的描述类型。所有类型及说明见表2-4-1所示,相应的图示见图2-4-4。 ____________________________________________________________________________ 类 型 说 明 ____________________________________________________________________________ GL_POINTS 单个顶点集 GL_LINES 多组双顶点线段 GL_POLYGON 单个简单填充凸多边形 GL_TRAINGLES 多组独立填充三角形 GL_QUADS 多组独立填充四边形 GL_LINE_STRIP 不闭合折线 GL_LINE_LOOP 闭合折线 GL_TRAINGLE_STRIP 线型连续填充三角形串 GL_TRAINGLE_FAN 扇形连续填充三角形串 GL_QUAD_STRIP 连续填充四边形串 ____________________________________________________________________________ 表2-4-1 几何图元类型和说明 图2-4-4 几何图元类型 函数glEnd()标志顶点列表的结束。 从图2-4-4中可看出,可以采用许多方法构造几何图元,这些方法仅仅依赖于所给的顶 点数据。 在glBegin()和glEnd()之间最重要的信息就是由函数glVertex*()定义的顶点,必要时 也可为每个顶点指定颜色、法向、纹理坐标或其他,即调用相关的函数,见表2-4-2所示, 具体用法以后会逐步介绍。 ___________________________________________________________________________ 函 数 函 数 意 义 ___________________________________________________________________________ glVertex*() 设置顶点坐标 glColor*() 设置当前颜色 glIndex*() 设置当前颜色表 glNormal*() 设置法向坐标 glEvalCoord*() 产生坐标 glCallList(),glCallLists() 执行显示列表 glTexCoord*() 设置纹理坐标 glEdgeFlag*() 控制边界绘制 glMaterial*() 设置材质 ___________________________________________________________________________ 表2-4-2 在glBegin()和glEnd()之间可调用的函数 看如下几句: glBegin(GL_POINTS); glColor3f(1.0,0.0,0.0); /* red color */ glVertex(...); glColor3f(0.0,1.0,0.0); /* green color */ glColor3f(0.0,0.0,1.0); /* blue color */ glVertex(...); glVertex(...); glEnd(); 颜色等的设置只对当前点或后续点有效。上一例中第一个点是红色,第二个点和第三个 点都是蓝色。其中设置绿色时,之后没有顶点操作,而是设置蓝色,故只有当前蓝色对紧跟 其后的两个顶点有效。 为了更好地理解构造几何图元函数的用法,下面举一个简单的例子 drawgeom.c: 例 2-3 几何图元构造例程 drawgeom.c #include "glos.h" #include <GL/gl.h> #include <GL/glaux.h> void myinit(void); void DrawMyObjects(void); void CALLBACK myReshape(GLsizei w,GLsizei h); void CALLBACK display(void); void myinit(void) { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glShadeModel(GL_FLAT); } void CALLBACK myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0); else glOrtho(-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CALLBACK display(void) { glColor3f(1.0,1.0,0.0); DrawMyObjects(); glFlush(); } void DrawMyObjects(void) { /* draw some points */ glBegin(GL_POINTS); glColor3f(1.0,0.0,0.0); glVertex2f(-10.0,11.0); glColor3f(1.0,1.0,0.0); glVertex2f(-9.0,10.0); glColor3f(0.0,1.0,1.0); glVertex2f(-8.0,12.0); glEnd(); /* draw some line_segments */ glBegin(GL_LINES); glColor3f(1.0,1.0,0.0); glVertex2f(-11.0,8.0); glVertex2f(-7.0,7.0); glColor3f(1.0,0.0,1.0); glVertex2f(-11.0,9.0); glVertex2f(-8.0,6.0); glEnd(); /* draw one opened_line */ glBegin(GL_LINE_STRIP); glColor3f(0.0,1.0,0.0); glVertex2f(-3.0,9.0); glVertex2f(2.0,6.0); glVertex2f(3.0,8.0); glVertex2f(-2.5,6.5); glEnd(); /* draw one closed_line */ glBegin(GL_LINE_LOOP); glColor3f(0.0,1.0,1.0); glVertex2f(7.0,7.0); glVertex2f(8.0,8.0); glVertex2f(9.0,6.5); glVertex2f(10.3,7.5); glVertex2f(11.5,6.0); glVertex2f(7.5,6.0); glEnd(); /* draw one filled_polygon */ glBegin(GL_POLYGON); glColor3f(0.5,0.3,0.7); glVertex2f(-7.0,2.0); glVertex2f(-8.0,3.0); glVertex2f(-10.3,0.5); glVertex2f(-7.5,-2.0); glVertex2f(-6.0,-1.0); glEnd(); /* draw some filled_quandrangles */ glBegin(GL_QUADS); glColor3f(0.7,0.5,0.2); glVertex2f(0.0,2.0); glVertex2f(-1.0,3.0); glVertex2f(-3.3,0.5); glVertex2f(-0.5,-1.0); glColor3f(0.5,0.7,0.2); glVertex2f(3.0,2.0); glVertex2f(2.0,3.0); glVertex2f(0.0,0.5); glVertex2f(2.5,-1.0); glEnd(); /* draw some filled_strip_quandrangles */ glBegin(GL_QUAD_STRIP); glVertex2f(6.0,-2.0); glVertex2f(5.5,1.0); glVertex2f(8.0,-1.0); glColor3f(0.8,0.0,0.0); glVertex2f(9.0,2.0); glVertex2f(11.0,-2.0); glColor3f(0.0,0.0,0.8); glVertex2f(11.0,2.0); glVertex2f(13.0,-1.0); glColor3f(0.0,0.8,0.0); glVertex2f(14.0,1.0); glEnd(); /* draw some filled_triangles */ glBegin(GL_TRIANGLES); glColor3f(0.2,0.5,0.7); glVertex2f(-10.0,-5.0); glVertex2f(-12.3,-7.5); glVertex2f(-8.5,-6.0); glColor3f(0.2,0.7,0.5); glVertex2f(-8.0,-7.0); glVertex2f(-7.0,-4.5); glVertex2f(-5.5,-9.0); glEnd(); /* draw some filled_strip_triangles */ glBegin(GL_TRIANGLE_STRIP); glVertex2f(-1.0,-8.0); glVertex2f(-2.5,-5.0); glColor3f(0.8,0.8,0.0); glVertex2f(1.0,-7.0); glColor3f(0.0,0.8,0.8); glVertex2f(2.0,-4.0); glColor3f(0.8,0.0,0.8); glVertex2f(4.0,-6.0); glEnd(); /* draw some filled_fan_triangles */ glBegin(GL_TRIANGLE_FAN); glVertex2f(8.0,-6.0); glVertex2f(10.0,-3.0); glColor3f(0.8,0.2,0.5); glVertex2f(12.5,-4.5); glColor3f(0.2,0.5,0.8); glVertex2f(13.0,-7.5); glColor3f(0.8,0.5,0.2); glVertex2f(10.5,-9.0); glEnd(); } void main(void) { auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500); auxInitWindow("Geometric Primitive Types"); myinit(); auxReshapeFunc(myReshape); auxMainLoop(display); } 以上程序运行结果就是图2-4-4所示的内容,这个例子很好地说明了几何图元的类型及 颜色等函数的用法 。希望读者自己仔细分析每个物体的绘制方法,体会其中的关键之处,达 到举一反三的效果。当然,还可利用上一章辅助库中提供的基本三维图元构造比较复杂的物 体,你不妨也试一试。 |
|
|