#include <iostream>
#include <windows.h>
#include <GL/freeglut.h>
using namespace std;
GLfloat G_fDistance = 3.0f;
GLfloat G_fAngle_Horizon = 0.0f;
GLfloat G_fAngle_Vertical = 0.0f;
void myInit(void);//初始化函数
void myReshape(GLsizei w, GLsizei h);//窗口变化重调函数
void display(void);//显示函数
void processSpecialKey(int key,int x,int y);//接受 上下左右 按键
void processNormalKey(unsigned char key, int x, int y);//接受键盘按键
int main(int argc,char* argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);//显示模式双缓存 RGBA色彩
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Teapot");
myInit();//初始化
glutReshapeFunc(myReshape);//窗口变化函数
glutSpecialFunc(processSpecialKey);//接受上下左右回调
glutKeyboardFunc(processNormalKey);//接受键盘字母
glutDisplayFunc(display);//显示函数
glutIdleFunc(display);//随时都进行调用能够及时响应
glutMainLoop();//大循环
return 0;
}
void myInit(void){
glEnable(GL_DEPTH_TEST);
}
//窗口回调
void myReshape(GLsizei w,GLsizei h){
glViewport(0, 0, w, h);//设定视区
glMatrixMode(GL_PROJECTION);//透视方式确定
glLoadIdentity();//载入单位矩阵
gluPerspective(60.0, 1.0 * (GLfloat)w / (GLfloat)h, 1.0, 30.0);//设定范围
}
void display(void){
glClearColor(0.0, 0.0, 0.0, 0.0);//清除屏幕颜色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//屏幕颜色深度双缓冲清理
glMatrixMode(GL_MODELVIEW);//设定模型矩阵?
glLoadIdentity();//载入单位矩阵
glTranslatef(0.0f, 0.0f, -G_fDistance);//拉远坐标系
glRotatef(G_fAngle_Horizon, 0.0f, 1.0f, 0.0f);
glRotatef(G_fAngle_Vertical, 1.0f, 0.0f, 0.0f);
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glVertex3f(-1.0f,1.0f, 0.0f);
glEnd();
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glutWireTeapot(1.0);
glutSwapBuffers();
}
void processSpecialKey(int key,int x,int y){
switch(key){
case GLUT_KEY_LEFT:
G_fAngle_Horizon -= 5.0f;
break;
case GLUT_KEY_RIGHT:
G_fAngle_Horizon += 5.0f;
break;
case GLUT_KEY_UP:
G_fAngle_Vertical += 5.0f;
break;
case GLUT_KEY_DOWN:
G_fAngle_Vertical -= 5.0f;
break;
}
}
void processNormalKey(unsigned char key,int x,int y){
switch(key){
case 97://a
G_fDistance -= 0.3f;
break;
case 65:
G_fDistance += 0.3f;
break;
case 27:
exit(0);
break;
}
}
idlefunc加了才可以实时响应变化
平移旋转函数动的是坐标系
可以在响应函数里加一句redispost什么的也可以实时变化,就是每个都加