绘制多边形面

3.1节介绍了封闭多义线,即多边形的绘制。本节介绍多边形围成的面的绘制。

多边形面的类型

OpenGL可以绘制的面包括三角形面、四边形面、以及由三角形组成的条带和扇区、由四边形组成的条带和扇区,以及任意简单多边形。如下所示:

code.vc#.net
Gl.glBegin(Gl.GL_TRIANGLES);          // 三角形(每3个顶点)
Gl.glBegin(Gl.GL_TRIANGLE_STRIP);     // 三角形条带
Gl.glBegin(Gl.GL_TRIANGLE_FAN);      // 从第一个顶点开始的三角形扇
Gl.glBegin(Gl.GL_QUADS);              // 四边形(每4个顶点)
Gl.glBegin(Gl.GL_QUAD_STRIP);         // 四边形条带
Gl.glBegin(Gl.GL_POLYGON);            // 任意简单多边形

三角形面

下面的代码绘制红色三角形面。

code.vc#.net
Gl.glColor3f(1.0F, 0.0F, 0.0F);     // 红色
Gl.glBegin(Gl.GL_TRIANGLES);
     Gl.glVertex2f(0.0F, 0.5F);    // 顶部
     Gl.glVertex2f(-0.5F, -0.5F);   // 左下
     Gl.glVertex2f(0.5F, -0.5F);    // 右下
Gl.glEnd();

三角形扇

下面的代码用连续多个三角形组成扇形面。圆形面就可以由一组三角形面组成。

code.vc#.net
Gl.glBegin(Gl.GL_TRIANGLE_FAN);
    Gl.glVertex2f(0.0F, 0.0F);       // 圆心
    for(int i = 0; i <= 36; i++)
    {
        float angle = (float)(i * 10.0 * Math.PI / 180.0);
        Gl.glVertex2f(
            (float)Math.Cos(angle) * 0.5F,
            (float)Math.Sin(angle) * 0.5F
        );
    }
Gl.glEnd();

多边形面的模型

多边形面可以有顶点模型、线框模型和曲面模型等三种模型,如下所示。

code.vc#.net
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);    // 曲面(默认)
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_LINE);    // 线框
Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_POINT);   // 顶点

面剔除

面有正面和反面,可以用Gl.glCullFace()函数剔除背面或正面。

code.vc#.net
Gl.glEnable(Gl.GL_CULL_FACE);
Gl.glCullFace(Gl.GL_BACK);            // 剔除背面(默认)
Gl.glCullFace(Gl.GL_FRONT);           // 剔除正面
Gl.glFrontFace(Gl.GL_CCW);            // 逆时针为正面(默认)
Gl.glFrontFace(Gl.GL_CW);             // 顺时针为正面

绘多边形示例

本例绘制渐变色填充的三角形面,代码如下所示:

code.vc#.net
        private void button1_Click(object sender, EventArgs e)
        {
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
            Gl.glPushMatrix();
            Gl.glBegin(Gl.GL_TRIANGLES);
                Gl.glColor3d(1.0, 0.0, 0.0);
                Gl.glVertex3d(0, 8, 0);
                Gl.glColor3d(0.0, 1.0, 0.0);
                Gl.glVertex3d(-8, -8, 0);
                Gl.glColor3d(0.0, 0.0, 1.0);
                Gl.glVertex3d(8, -8, 0);
            Gl.glEnd();
            Gl.glPopMatrix();
            Gl.glFinish();
            simpleOpenGlControl1.SwapBuffers();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

运行代码,生成图3-2所示的渐变色填充的三角形面。

Document Image
\[\]

图3-2 生成渐变色填充的三角形面