现在的位置: 首页 > 综合 > 正文

学习OpenGL(四)绘制直线图形

2017年10月04日 ⁄ 综合 ⁄ 共 2004字 ⁄ 字号 评论关闭
  学习OpenGL(四)绘制直线图形

kezunhai@gmail.com

http://blog.csdn.net/kezunhai

 在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欢迎转载或分享,但请务必声明文章出处。

抱歉!评论已关闭.