学习OpenGL(四)绘制直线图形
在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();
}
则会绘制成在在圆周成扇形展开的一些列线段,如图所示:
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();
运行结果如图所示:
如同可以设置点的大小一样,我们也可以设置线段的宽度,通过以下几个函数可以获得线条宽度的相关信息:
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欢迎转载或分享,但请务必声明文章出处。