[OpenGL(C)] - 旋转立体三角形

GLUT库(v1.1):https://files.cnblogs.com/hcbin/glutdlls37beta.zip

 

//注:本人使用VS2008创建此程序
//新建Win32控制台程序->空程序(Win32 Console Application->An Empty Project)
/*

    glGenLists(i):自动分配没有使用的编号(返回的是编号中最小的一个,如果函数返回零,表示分配失败)
    glIsList:判断一个编号是否已经被用作显示列表。

    创建显示列表:
    glNewList(list, GL_COMPILE);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(0.0f, 0.0f);
    glEnd();
    注意:1.显示列表只能装入OpenGL函数
          2.不能装入其它内容,如if
          3.如装入OpenGL的函数带有返回值都不能装入,glCallList和glCallLists函数都不知道如何处理这些返回值。
          4.在网络方式下,设置客户端状态的函数也无法被装入到显示列表,这是因为显示列表被保存到服务器端,各种设置客户端状态的函数在发送到服务器端以前就被执行了,而服务器端无法执行这些函数。
          5.分配、创建、删除显示列表的动作也无法被装入到另一个显示列表,但调用显示列表的动作则可以被装入到另一个显示列表。


    调用显示列表:
    GLuint lists[] = {1, 3, 4, 8};
    glListBase(10); //偏移量,实际上调用的是编号为11, 13, 14, 18的四个显示列表
    glCallLists(4, GL_UNSIGNED_INT, lists); //调用一系列的显示列表;在使用该函数前需要用glListBase函数
    //第一个参数表示了要调用多少个显示列表。
    //第二个参数表示了这些显示列表的编号的储存格式,可以是
        GL_BYTE(每个编号用一个GLbyte表示)
        GL_UNSIGNED_BYTE(每个编号用一个GLubyte表示)
        GL_SHORT
        GL_UNSIGNED_SHORT
        GL_INT
        GL_UNSIGNED_INT,GL_FLOAT
    //第三个参数表示了这些显示列表的编号所在的位置。
    //注:“调用显示列表”这个动作本身也可以被装在另一个显示列表中。
    //要调用编号为10的显示列表,直接使用glCallList(10);就可以了


    销毁显示列表:
    使用glDeleteLists(20, 4);将销毁20,21,22,23这四个显示列表。

*/
#include 
<math.h>
#include 
<GL/glut.h>

#define ColoredVertex(c,v) do{ glColor3fv(c); glVertex3fv(v); }while(0)

GLfloat angle 
= 0.0f;

void RevolveTriangle(){
    
static int list = 0;
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT 
| GL_DEPTH_BUFFER_BIT);
    
if(list == 0){ //如果显示列表不存在,则创建
        GLfloat PointA[] = { 0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6}, //设置4个角的位置
                PointB[] = {-0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},
                PointC[] 
= { 0.0f,-sqrt(6.0f)/12, sqrt(3.0f)/3},
                PointD[] 
= { 0.0f, sqrt(6.0f)/4,  0};

        GLfloat ColorR[] 
= {1,0,0}, //设置4个角的颜色
                ColorG[] = {0,1,0},
                ColorB[] 
= {0,0,1},
                ColorY[] 
= {1,1,0};

        list 
= glGenLists(1);
        glNewList(list,GL_COMPILE);
            glBegin(GL_TRIANGLES); 
//画出4个三角形
                
//平面BAD(左)
                ColoredVertex(ColorG,PointB);
                ColoredVertex(ColorR,PointA);
                ColoredVertex(ColorY,PointD);

                
//平面ABC(正)
                ColoredVertex(ColorR,PointA);
                ColoredVertex(ColorG,PointB);
                ColoredVertex(ColorB,PointC);

                
//平面ACD(右)
                ColoredVertex(ColorR,PointA);
                ColoredVertex(ColorB,PointC);
                ColoredVertex(ColorY,PointD);

                
//平面CBD(底)
                ColoredVertex(ColorB,PointC);
                ColoredVertex(ColorG,PointB);
                ColoredVertex(ColorY,PointD);
            glEnd();
        glEndList();
    }
    
//已经创建了显示列表,在每次绘制正四面体时将调用它
    glPushMatrix(); //入矩阵栈
    glRotatef(angle,1,0.5,0); //旋转
    glCallList(list); //调用列表
    glPopMatrix(); //出矩阵栈

    glutSwapBuffers();
}

void action(){
    
if(angle >= 360.0f){
        angle 
= 0.0f;
    }
    angle
++;
    RevolveTriangle();
}

int main(int argc,char *argv[]){
    glutInit(
&argc,argv);
    glutInitDisplayMode(GLUT_RGBA 
| GLUT_DOUBLE);

    glutInitWindowPosition(
200,200);
    glutInitWindowSize(
640,480);
    glutCreateWindow(
"Revolve Triangle");

    glutDisplayFunc(
&RevolveTriangle);
    glutIdleFunc(
&action);
    glutMainLoop();

    
return 0;
}
posted @ 2010-02-24 19:40  炎峰森林影  阅读(1577)  评论(1编辑  收藏  举报