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

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

 

2010022100000779.png

// 注:本人使用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 ;
}

转载于:https://www.cnblogs.com/hcbin/archive/2010/02/24/1670003.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值