在3D空间中绘制直线

在3D空间中绘制直线


图元 GL_LINES :

         指定两个顶点,在它们之间绘制一条直线。如果为GL_LINES指定了奇数个顶点,那么最后一个顶点会被忽略。

 

图元 GL_LINE_STRIP :

         线带,它允许指定一个顶点列表,并绘制一条经过所有这些顶点的连续的线。

 

图元 GL_LINE_LOOP:

         线环,它与线带非常类似,会在顶点列表的最后一个顶点和第一个顶点之间也绘制一条直线。


在3D空间中绘制直线_第1张图片

线带(GL_LINE_STRIP)


在3D空间中绘制直线_第2张图片

线环(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)) {

        // 圆的上半部分,计算XY坐标

        x = 50.0f * sin(angle);

        y = 50.0f * cos(angle);

        // 指定顶点位置,直线的第一顶点

        glVertex3f(x, y, z);

       

        // 圆的下半部分,计算XY坐标

        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;

}

 

程序运行的结果如图所示,可以看出,直线完全被绘制在一个平面之上:


在3D空间中绘制直线_第3张图片


在3D空间中绘制直线_第4张图片

nice~

 


你可能感兴趣的:(【OpenGL基础日记】)