OpenGL - 旋轉四棱錐

鼠標左鍵加速旋轉,右鍵減速。


代碼如下:

#include<gl/glut.h>
#include<math.h>
#include<windows.h>
#include<algorithm>
using namespace std;
float angle = 0;
float speed = 0.1;
void myDisplay()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    //清除顏色緩存和深度緩存
    glLoadIdentity();       //初始化座標位置
    /*
    glTranslatef();     //平移
    glScaled();     //縮放
    glRotatef();        //旋轉
    */
    glTranslated(0, 0, -6);
    glRotatef(angle, 0, 1, 0);
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);  glVertex3f(0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);  glVertex3f(-1.0f, -1.0f, 1.0f);
    glColor3f(0.0f, 0.0f, 1.0f);  glVertex3f(1.0f, -1.0f, 1.0f);

    glColor3f(1.0f, 0.0f, 0.0f);  glVertex3f(0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);  glVertex3f(1.0f, -1.0f, 1.0f);
    glColor3f(0.0f, 1.0f, 0.0f);  glVertex3f(1.0f, -1.0f, -1.0f);

    glColor3f(1.0f, 0.0f, 0.0f);  glVertex3f(0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);  glVertex3f(1.0f, -1.0f, -1.0f);
    glColor3f(0.0f, 0.0f, 1.0f);  glVertex3f(-1.0f, -1.0f, -1.0f);

    glColor3f(1.0f, 0.0f, 0.0f);  glVertex3f(0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);  glVertex3f(-1.0f, -1.0f, -1.0f);
    glColor3f(0.0f, 1.0f, 0.0f);  glVertex3f(-1.0f, -1.0f, 1.0f);
    glEnd();

    angle += speed;
    if (angle > 360)
        angle -= 360.0;
    glutSwapBuffers();
}
void mouse(int button, int state, int x, int y)       //監聽鼠標動作
{
    if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
    {
        speed = min(1.0, speed + 0.01);
    }
    else if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP)
    {
        speed = max(0.01, speed - 0.01);
    }
}
void Reshape(int w, int h)      //兩個參數:窗口被移動後大小
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)w / (GLfloat)h, 0.1f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void initWindow(int &argc, char *argv[], int width, int height, char *title)    //初始化並顯示到屏幕中央
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);       //使用雙緩存模式和深度緩存
    glutInitWindowPosition((GetSystemMetrics(SM_CXSCREEN) - width) >> 1, (GetSystemMetrics(SM_CYSCREEN) - height) >> 1);       //指定窗口位置
    glutInitWindowSize(width, height);       //指定窗口大小
    glutCreateWindow(title);

    glClearColor(0, 0, 0, 0.0);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH_TEST);//激活深度測試
}

int main(int argc, char *argv[])
{
    initWindow(argc, argv, 500, 500, "Hermite");

    puts("左鍵加速,右鍵減速");

    glutDisplayFunc(myDisplay);
    glutReshapeFunc(Reshape);
    glutMouseFunc(mouse);
    glutIdleFunc(myDisplay);

    glutMainLoop();

    return 0;
}

這裏寫圖片描述

發佈了688 篇原創文章 · 獲贊 134 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章