hyde
路人甲
路人甲
  • 注册日期2003-09-24
  • 发帖数555
  • QQ
  • 铜币1457枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1347回复:0

OpenGL系列讲座(6)

楼主#
更多 发布于:2004-03-20 10:32
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所示的内容,这个例子很好地说明了几何图元的类型及

颜色等函数的用法 。希望读者自己仔细分析每个物体的绘制方法,体会其中的关键之处,达

到举一反三的效果。当然,还可利用上一章辅助库中提供的基本三维图元构造比较复杂的物

体,你不妨也试一试。

 

喜欢0 评分0
夜落了,风静了,我喜欢一本书,一杯茶,一粒摇曳的烛光...
游客

返回顶部