zoukankan      html  css  js  c++  java
  • [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;
    }
  • 相关阅读:
    linux中inittab文件详解
    Linux的 test 命令使用
    程序的链接和装入及Linux下动态链接的实现
    linux虚拟内存管理简要总结
    一些vim技巧和经验
    Linux cp mv rm ln 命令对于 inode 和 dentry 的影响
    Linux C编程一站式学习
    虚拟内存管理
    为何cp覆盖进程的动态库(so)会导致coredump
    linux下So覆盖导致coredump问题的分析
  • 原文地址:https://www.cnblogs.com/hcbin/p/1670003.html
Copyright © 2011-2022 走看看