關於部落格
進資工一甲
  • 6070

    累積人氣

  • 0

    今日人氣

    0

    訂閱人氣

code_旋轉的立方體(上課示範檔)

/* 以顏色插值法轉動的立方體 */
/* 同類、同等的變革和簡單的資料結構用途示範*/
/* 法線和顏色分配到端點 */
/* 立方體集中在起源,因此 (非正常化) 法線是相同端點值 */

#include <stdlib.h>
#include <GL/glut.h>

GLfloat vertices[][3] = {{-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0},
           {1.0, 1.0,-1.0},{-1.0, 1.0,-1.0}, {-1.0,-1.0, 1.0},
           {1.0,-1.0, 1.0},{ 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}};

GLfloat normals[][3] = {{-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0},
          {1.0, 1.0,-1.0},{-1.0, 1.0,-1.0}, {-1.0,-1.0, 1.0},
          {1.0,-1.0, 1.0},{ 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}};

GLfloat colors[][3] = {{0.0,0.0,0.0}, {1.0,0.0,0.0},
          {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0},
          {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};

void polygon(int a, int b, int c , int d)
{

/* 取得一個多角形通過端點名單 */

       glBegin(GL_POLYGON);
                glColor3fv(colors[a]);
                glNormal3fv(normals[a]);
                glVertex3fv(vertices[a]);
                glColor3fv(colors[b]);
                glNormal3fv(normals[b]);
                glVertex3fv(vertices[b]);
                glColor3fv(colors[c]);
                glNormal3fv(normals[c]);
                glVertex3fv(vertices[c]);
                glColor3fv(colors[d]);
                glNormal3fv(normals[d]);
                glVertex3fv(vertices[d]);
        glEnd();
}             

/* 圖面端點 */
void colorcube(void) 
{
        polygon(0,3,2,1);
        polygon(2,3,7,6);
        polygon(0,4,7,3);
        polygon(1,2,6,5);
        polygon(4,5,6,7);
        polygon(0,1,5,4);
}

static GLfloat theta[] = {0.0,0.0,0.0};
static GLint axis = 2;

/* 顯示設置控制:清除結構緩衝與z緩衝,轉動立方體,緩衝區交換 */
void display(void)
{
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glRotatef(theta[0], 1.0, 0.0, 0.0);
    glRotatef(theta[1], 0.0, 1.0, 0.0);
    glRotatef(theta[2], 0.0, 0.0, 1.0);
    colorcube();
    glFlush();
    glutSwapBuffers();
}

/* 設置控制選擇的立方體軸任意旋轉2度 */
void spinCube()
{
        int i;
    theta[axis] += 2.0;
    if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
    glutPostRedisplay();
}

 /* 滑鼠控制設定選擇轉動的軸 */
void mouse(int btn, int state, int x, int y)
{
    if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0;
    if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1;
    if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;
}
void myReshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)

        glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w,
            2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
    else

        glOrtho(-2.0 * (GLfloat) w / (GLfloat) h,
            2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
}

/* 雙緩衝區技術和z緩衝需求 */
void main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow("colorcube");
    glutReshapeFunc(myReshape);
    glutDisplayFunc(display);
    glutIdleFunc(spinCube);
    glutMouseFunc(mouse);
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}
/* Enable hidden--surface--removal */

相簿設定
標籤設定
相簿狀態