鼠標左鍵加速旋轉,右鍵減速。
代碼如下:
#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;
}