说明:
实线很简单,指定两个顶点画出来就行了,关键在于用虚线、点划线绘制直线,很有意思
重要的函数:
glEnable(GL_LINE_STIPPLE);
//打开画线模式
glLineStipple(GLint factor,GLushort pattern);
//建立画线的模式
factor参数充当倍数,结合pattern和代码理解,比如factor为2时代表pattern中每位在一行中充当两个像素的开或者关。
重点就在于pattern,它是16进制的值,用来指定画线时所用的模式:
把pattern换成2进制0时不画,1时画,先看转换规则:
还是看例子理解:本文中:
glLineStipple(2,0X00FF);
//画虚线
0X00FF的二进制位0000 0000 1111 1111,但是0时不画,1时画,为什么开始却画了,因为在应用模式时pattern是逆向使用的,即模式的最低有效位先作用于指定线段。
glLineStipple(2,0X11FF);
//画点划线
0X11FF的二进制为:0001 0001 1111 1111,知道了pattern是逆向使用的,所以用0X11FF而不是0XFF11。
代码:
有详细的注释,因为是一次性画三条,所以打开的函数并未在初始化函数中调用,而是也写在了display中
#include <stdio.h>
#include <windows.h>
#include <GL/freeglut.h>
//摄像机离物体的距离
float G_fDistance = 3.6f;
int mode=0;
GLfloat fullline[]={-1.0,0.0,0.0,1.0,0.0,0.0};//实线的顶点数组
void myinit(void);
void myReshape(GLsizei w, GLsizei h);
void display(void);
//响应键盘输入, 从而设定物体移近移远以及旋转的回调函数
void processNormalKeys(unsigned char key,int x,int y);
//主函数
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
//初始化OPENGL显示方式
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
//设定OPENGL窗口位置和大小
glutInitWindowSize (400, 300);
glutInitWindowPosition (100, 100);
//打开窗口
glutCreateWindow ("画实线、虚线、点划线");
//调用初始化函数
myinit();
//设定窗口大小变化的回调函数
glutReshapeFunc(myReshape);
//开始OPENGL的循环
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
//用户初始化函数
void myinit(void)
{
}
//窗口大小变化时的回调函数
void myReshape(GLsizei w, GLsizei h)
{
//设定视区
glViewport(0, 0, w, h);
//设定透视方式
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,30.0);
}
//每桢OpenGL都会调用这个函数,用户应该把显示代码放在这个函数中
void display(void)
{
//设置清除屏幕的颜色,并清除屏幕和深度缓冲
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT);
//视角的变化
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,-G_fDistance);
//画红色的实线
//开启顶点数组画直线
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,fullline);
glColor3f(1.0,0.0,0.0);
glDrawArrays(GL_LINES,0,2);
//画绿色的虚线
glEnable(GL_LINE_STIPPLE);//打开画线模式
glLineStipple(2,0X00FF);//建立画线的模式
glColor3f(0.0,1.0,0.0);
glPushMatrix();
glTranslatef(0.0,0.5,0.0);
glBegin(GL_LINES);
glVertex2f(-1.0,0.0);
glVertex2f(1.0,0.0);
glEnd();
glPopMatrix();
glDisable(GL_LINE_STIPPLE);//最后一定要关闭画线模式否则重新绘制时红色的实线也会被按虚线绘制
//画蓝色的点划线
glEnable(GL_LINE_STIPPLE);//打开画线模式
glLineStipple(2,0X11FF);//建立画线的模式
glColor3f(0.0,0.0,1.0);
glPushMatrix();
glTranslatef(0.0,-0.5,0.0);
glBegin(GL_LINES);
glVertex2f(-1.0,0.0);
glVertex2f(1.0,0.0);
glEnd();
glPopMatrix();
glDisable(GL_LINE_STIPPLE);//最后一定要关闭画线模式否则重新绘制时红色的实线也会被按虚线绘制
//交换前后缓冲区
glutSwapBuffers();
}