您的位置:首页 > 编程语言 > C语言/C++

VC++下OpenGL的配置和OpenGl基本图元—点和线的的绘制

2014-10-20 15:30 260 查看
我们知道,OpenGL(Open GraphicsLibrary),是一个三维图形和模型库,它被定义为一个图形硬件的软件接口,使用OpenGL可以很好进行三维模型的绘制,模型进行几何的变换,对模型进行光照、材质的改变,以及给模型赋予一定的纹理贴图。但是这些功能都是零散的,没有很好的整合在一起,形成一个类似3DMax的可以进行完整的三维建模的系统。为了是大家对OpenGL有更好的认识,以及掌握与使用基于OpenGL的虚拟现实技术,进行三维建模,三维场景的绘制。

首先介绍一下,在VC++的环境下,进行OpenGL的配置,在对OpenGL的基本图元绘制的实现。

环境配置过程

1.先下载 glutdlls37beta.zip,
解压后把glut32.dll放到 windowssystem目录下。
2.另建目录,如 d:\glut,再在c:\glut下面

建d:\glut\include\gl,把头文件glut.h放到d:\glut\ include\ gl下面。
再在d:\glut下面建d:\glut\lib,把glut32.lib放在d:\glut\lib下面。
3.把glut加到工程中(project),工具—>选项—>目录如下所示:



图1.加入Include files



图2.选择d:\glut\ include\ gl文件



图3.加入Library files



图4.选择d:\glut\lib文件

4.加入OpenGL32.lib GLu32.lib GLaux.lib到工程里;
步骤如下:工程—>设置—>链接,在对象/库模块中加入OpenGL32.lib GLu32.lib GLaux.lib GLu32.lib


图5.加入OpenGL32.lib GLu32.lib GLaux.lib GLu32.lib

基本图元绘制

相关算法及原理描述:

齐次坐标

          在空间直角坐标系中,任意一点可用一个三维坐标矩阵[x y z]表示。如果将该点用一个四维坐标的矩阵[Hx Hy Hz H]表示时,则称为齐次坐标表示方法。在齐次坐标中,最后一维坐标H称为比例因子。

  在OpenGL中,二维坐标点全看作三维坐标点,所有的点都用齐次坐标来描述,统一作为三维齐次点来处理。每个齐次点用一个向量(x, y, z, w)表示,其中四个元素全不为零。

齐次点具有下列几个性质:

  1)如果实数a非零,则(x, y, x, w)和(ax, ay, az, aw)表示同一个点,类似于x/y = (ax)/( ay)。

  2)三维空间点(x, y, z)的齐次点坐标为(x, y, z, 1.0),二维平面点(x,y)的齐次坐标为(x, y, 0.0, 1.0)。

  3)当w不为零时,齐次点坐标(x, y, z, w)即三维空间点坐标(x/w, y/w, z/w);当w为零时,齐次点(x, y, z, 0.0)表示此点位于某方向的无穷远处。

  注意:OpenGL中指定w大于或等于0.0。

 

空间点的绘制

用浮点值表示的点称为顶点(Vertex)。所有顶点在OpenGL内部计算时都作为三维点处理,用二维坐标(x, y)定义的点在OpenGL中默认z值为0。所有顶点坐标用齐次坐标(x, y, z, w) 表示,如果w不为0.0,这些齐次坐标表示的顶点即为三维空间点(x/w, y/w, z/w)。编程者可以自己指定w值,但很少这样做。一般来说,w缺省为1.0。

最简单的计算机图形就是在屏幕上某个位置绘制一个点,并用特定的颜色绘制出来。

       glBegin(GL_POINTS);

              glVertex3f(0.0f,0.0f,0.0f);

              glVertex3f(10.0f,10.0f,10.0f);

       glEnd();

 glVertex函数用于指定顶点,它可以有2,3,4个参数。带2个参数时指定的是空间点的x,y坐标,其z坐标为默认值0,在绘制平面图形时常常使用这类函数;带3个参数时指定的是空间点的x,y和z坐标;带4个参数时,除了定义空间点的x,y,z坐标,还有一个不为0的w坐标,这样,点的坐标(x,y,z,w)实际上构成了一个齐次坐标。在OpenGL中,使用规范化齐次坐标以保证点的齐次坐标与三维坐标的一一对应关系,最后指定的空间点的坐标为(x/w,y/w,z/w,1),w成了坐标值的一个缩放因子。

在OpenGL中绘制一个点时,点大小的默认值是一个象素。可以用函数glPointSize修改这个值:

                              void glPointSize(GLfloatsize);

             这个函数采用一个参数来指定画点时以象素为单位的近似直径。通常使用下面的代码来获取点大小的范围和它们之间最小的中间值:

       GLfloat sizes[2];  //保存绘制点的尺寸范围

       GLfloat step;     //保存绘制点尺寸的步长

       glGetFloatv(GL_POINT_SIZE_RANGE,sizes);//获得点的尺寸范围

       glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);

                                                               //获得点尺寸的步长

            在数组sizes中包含两个元素,分别保存了glPointSize的最小有效值和最大有效值,而变量step将保存点大小之间允许的最小增量。

直线的绘制

 使用模式GL_LINES可以在两点之间画线,如下面的代码在两点(0,0,0)和(10,10,10)之间画一条直线:

       glBegin(GL_LINES);

              glVertex3f(0.0f,0.0f,0.0f);

              glVertex3f(10.0f,10.0f,10.0f);

       glEnd();

4000
          注意,在glBegin/glEnd序列中两个顶点指定了一个图元(直线),如果序列中指定的点为奇数个,那么最后一个顶点将被忽略。

有时需要在一系列的顶点之间绘制连续直线,此时需要用到GL_LINE_STRIP或GL_LINE_LOOP模式。GL_LINE_STRIP模式可以根据指定的一系列顶点,从一个顶点到另一个顶点用连续的线段画线。GL_LINE_LOOP模式与GL_LINE_STRIP模式类似,只是会在指定的最后一个顶点与第一个顶点之间画最后一条线。

       glBegin(GL_LINE_STRIP);

              glVertex3f(0.0f,0.0f,0.0f);

              glVertex3f(10.0f,10.0f,0.0f);

              glVertex3f(20.0f,5.0f,0.0f);

       glEnd();

             特别的,当沿着某条曲线指定一系列靠的很近的点,使用GL_LINE_STRIP模式可以绘制一条曲线。

直线的属性包括线宽和线型。在OpenGL中可用glLineWidth指定线宽: void glLineWidth(GLfloat width)

可以用下面的代码来获取线宽范围和它们之间的最小间隔:

       GLfloat sizes[2];  //保存线宽的尺寸范围

       GLfloat step;     //保存线宽尺寸的最小间隔

       glGetFloarv(GL_LINE_WIDTH_RANGE,sizes);

                                                                          //获得线宽的尺寸范围

       glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&step);

                                                                           //获得线宽尺寸的步长

            数组sizes中保存了glLineWidth的最小有效值和最大有效值,而变量step将保存线宽之间允许的最小增量。OpenGL规范只要求支持一种线宽:1.0。Microsoft的OpenGL实现允许线宽从0.5到10.0,最小增量为0.125。

除了修改线宽,可以用虚线或短划线模式创建直线,为此需要先调用:

                        glEnable(GL_LINE_STIPPLE);

      函数glLineStipple将建立用于画线的模式:

             glLineStipple(GLint factor,GLushort pattern);

          其中,pattern是一个16位值,指定了画线时所用的模式。每一位代表线段的一部分是开还是关。默认情况下,每一位对应一个象素,但factor参数充当倍数可以增加模式的宽度。例如,将factor设为2会使模式中的每一位代表一行中2个象素的开或关。另外,在应用模式时,pattern是逆向使用的,即模式的最低有效位最先作用于指定线段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: