绘制多边形面

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

多边形面的类型

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

code.vb.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.vb.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.vb.net
Gl.glBegin(Gl.GL_TRIANGLE_FAN)
     Gl.glVertex2f(0.0F, 0.0F)       ' 圆心
     For i As Integer = 0 To 36
         Dim angle As Single = CSng(i * 10.0 * Math.PI / 180.0)
         Gl.glVertex2f(CSng(Math.Cos(angle)) * 0.5F, CSng(Math.Sin(angle)) * 0.5F)
     Next
Gl.glEnd()

多边形面的模型

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

code.vb.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.vb.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.vb.net
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
        Gl.glPushMatrix()
        'Gl.glColor3d(1.0#, 0.0#, 0.0#)
        Gl.glLineWidth(2)
        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()
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.Dispose()
    End Sub

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

Document Image
\[\]

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