在OpenGL中,直线的绘制有三种形式,分别是GL_LINES、GL_LINE_STRIP和GL_LINE_LOOP。其差异如下图所示:
1、 GL_LINES绘制
如果将 学习OpenGL(三)绘制螺旋状图形中的绘图函数void
RenderScene_GRAPHIC(void)做些修改,改成绘制线条,如下:
void RenderScene_GRAPHIC(void) { GLfloat X, Y, Z, angle; GLfloat fR = 50.0f; // Clear the window with current color glClear(GL_COLOR_BUFFER_BIT); // Save matrix state and do the rotation glPushMatrix(); // Rotate glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); glBegin(GL_LINES); Z = 10.0f; for ( angle = 0.0f; angle<=GL_PI*3.0f; angle +=0.5f) { // top half of the circle X = fR * sin(angle); Y = fR * cos(angle); glVertex3f( X, Y, Z); // Bottom half of the circle X = fR * sin( angle+GL_PI); Y = fR * cos( angle+GL_PI); glVertex3f( X, Y, Z); } glEnd(); // restore transformations glPopMatrix(); // Flush drawing commands glFlush(); }
则会绘制成在在圆周成扇形展开的一些列线段,如图所示:
注意:如果线路类型为GL_LINES,当指定的顶点数为奇数时,最后一个顶点将会被忽略。
2、线段的跨接与循环(GL_LINE_STRIP和GL_LINE_LOOP)
从上面的表可以知道GL_LINES、GL_LINE_STRIP和GL_LINE_LOOP三者的差异:GL_LINE_STRIP将相邻的两个顶点相连成线段,而GL_LINE_LOOP则会将最后一个点与第一个点相连形成一个闭合图形,看下面一段代码:
glBegin(GL_LINE_STRIP); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(50.0f, 50.0f, 50.0f); glVertex3f(50.0f, 100.0f, 0.0f); glEnd(); glTranslatef(0.0f, -120.0f, 0.0f); glBegin(GL_LINE_LOOP); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(50.0f, 50.0f, 50.0f); glVertex3f(50.0f, 100.0f, 0.0f); glEnd();
运行结果如图所示:
上图中,上面一个图形是GL_LINE_STRIP绘制的结果,下面一个是GL_LINE_LOOP绘制的结果。
如同可以设置点的大小一样,我们也可以设置线段的宽度,通过以下几个函数可以获得线条宽度的相关信息:
void getLineWidth() { GLfloat sizes[2]; // store supported point size range GLfloat step; // store supported size increments GLfloat curr; // size of current point glGetFloatv(GL_LINE_WIDTH_RANGE, sizes); glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &step); glGetFloatv(GL_LINE_WIDTH, &curr); glLineWidth(curr+1.0f); // set current point size cout<<"Size:"<<sizes[0]<<","<<sizes[1]<<endl; cout<<"step:"<<step<<endl; cout<<"curr:"<<curr<<endl; }
除此以外,还可以用虚线或短线模式来创建直线,称为点画。为了使用点画,必须先启用点画:glEnable( GL_LINE_STIPPLE),然后调用void glLineStipple(GLint
factor, GLushort pattern)建立点画模式,如此就可以进行点画。
作者:kezunhai出处:http://blog.csdn.net/kezunhai欢迎转载或分享,但请务必声明文章出处。