图元 GL_LINES :
指定两个顶点,在它们之间绘制一条直线。如果为GL_LINES指定了奇数个顶点,那么最后一个顶点会被忽略。
图元 GL_LINE_STRIP :
线带,它允许指定一个顶点列表,并绘制一条经过所有这些顶点的连续的线。
图元 GL_LINE_LOOP:
线环,它与线带非常类似,会在顶点列表的最后一个顶点和第一个顶点之间也绘制一条直线。
线带(GL_LINE_STRIP)
线环(GL_LINE_LOOP)
下面是程序清单3_4,在3D空间中绘制直线的代码,添加了按键响应,与绘制点的代码的差别主要体现在RenderScene函数上:
/* 程序清单 3-4
* 2014/4/11
*/
#include
#include
// 定义常量值PI
#define GL_PI 3.1416f
// 定义旋转角度,在按键控制中使用
static GLfloat xRot =0.0f;
static GLfloat yRot =0.0f;
// 设置渲染状态
void SetupRC()
{
// 设置清除窗口的颜色(黑色背景)
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// 设置绘图颜色为绿色
glColor3f(0.0f, 1.0f, 0.0f);
}
// 绘制场景(显示回调函数)
void RenderScene()
{
// 存储坐标和角度
GLfloat x, y, z, angle;
// OpenGL命令,清除颜色缓冲区(使用当前设置的颜色)
glClear(GL_COLOR_BUFFER_BIT);
// 保存矩阵状态并旋转
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
//------------------------------------------------------------------------------
// 开始绘制直线(图元)
glBegin(GL_LINES);
// 设置Z等于零,绘制的直线完全位于X-Y平面
z = 0.0f;
// 画线
for (angle= 0.0f; angle <= GL_PI; angle += (GL_PI / 20.0f)) {
// 圆的上半部分,计算X、Y坐标
x = 50.0f * sin(angle);
y = 50.0f * cos(angle);
// 指定顶点位置,直线的第一顶点
glVertex3f(x, y, z);
// 圆的下半部分,计算X、Y坐标
x = 50.0f * sin(angle + GL_PI);
y = 50.0f * cos(angle + GL_PI);
// 指定顶点位置,直线的第二顶点,与第一顶点相对应
glVertex3f(x, y, z);
}
glEnd();
// 恢复矩阵状态
glPopMatrix();
// 刷新绘图命令,此时所有未执行的OpenGL命令被执行
glutSwapBuffers();
}
// 当窗口大小改变时由GLUT函数库调用
voidChangeSize(GLsizei w, GLsizei h)
{
// 范围
GLfloat nRange = 100.0f;
// 纵横比
GLfloat aspectRatio;
// 防止被0所除
if (0 == h){
h = 1;
}
// 根据窗口大小设置视口
glViewport(0, 0, w, h);
// 选择投影矩阵,并重置坐标系统
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 计算窗口的纵横比(像素比)
aspectRatio = (GLfloat) w / (GLfloat) h;
// 定义裁剪区域(根据窗口的纵横比,并使用正投影)
if (w <=h) {//宽 <高
glOrtho(-nRange, nRange, -nRange /aspectRatio, nRange / aspectRatio, -nRange, nRange);
} else {//宽 >高
glOrtho(-nRange * aspectRatio, nRange *aspectRatio, -nRange, nRange,-nRange, nRange);
}
// 选择模型视图矩阵,并重置坐标系统
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
// 按键响应函数
void SpecialKeys(int key,int x,int y)
{
if (key ==GLUT_KEY_UP)
xRot -= 5.0f;
if (key ==GLUT_KEY_DOWN)
xRot += 5.0f;
if (key ==GLUT_KEY_LEFT)
yRot -= 5.0f;
if (key ==GLUT_KEY_RIGHT)
yRot += 5.0f;
if (key> 356.0f)
xRot = 0.0f;
if (key< -1.0f)
xRot = 355.0f;
if (key> 356.0f)
yRot = 0.0f;
if (key< -1.0f)
yRot = 355.0f;
// 使用新的坐标重新绘制场景
glutPostRedisplay();
}
int main(int argc,char *argv[])
{
// 传递命令行参数,并对GLUT函数库进行初始化
glutInit(&argc, argv);
// 设置创建窗口时的显示模式(双缓冲区、RGB颜色模式)
glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB);
// 设置窗口的初始大小
glutInitWindowSize(480, 320);
// 创建窗口
glutCreateWindow("Bounce");
// 设置显示回调函数
glutDisplayFunc(RenderScene);
// 设置当窗口的大小发生变化时的回调函数
glutReshapeFunc(ChangeSize);
// 设置按键响应函数(特殊键)
glutSpecialFunc(SpecialKeys);
// 设置渲染状态
SetupRC();
// 启动GLUT框架的运行,一经调用便不再返回,直到程序终止
glutMainLoop();
return 0;
}
程序运行的结果如图所示,可以看出,直线完全被绘制在一个平面之上:
nice~