[OpenGL(C)] – 旋轉立體三角形

來源:互聯網
上載者:User

GLUT庫(v1.1):http://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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.