OpengGL

来源:互联网 发布:hecras软件 编辑:程序博客网 时间:2024/06/09 18:46

程序运行效果:
这里写图片描述


代码如下:

#include<gl/glut.h>#include<math.h>#include<windows.h>#include<algorithm>using namespace std;const GLubyte index[] = { 0, 3, 2, 1, 2, 3, 7, 6, 0, 4, 7, 3, 0, 1, 5, 4, 1, 2, 6, 5, 4, 5, 6, 7 };const float vertex[] = { -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 };const float color[] = { 0, 0, 0, 1.0, 0, 0, 1.0, 1.0, 0, 0, 1.0, 0,0, 0, 1.0, 1.0, 0, 1.0, 1.0, 1.0, 1.0, 0, 1.0, 1.0 };float speed = 0.1;int der = 3;        //0x轴,1y轴,2z轴float angle[] = { 0, 0, 0, 0 };int pr_x, pr_y;     //上次鼠标位置void myDisplay(){    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    //清除颜色缓存和深度缓存    glLoadIdentity();    glTranslated(0, 0, -6);    glRotatef(angle[0], 1, 0, 0);    glRotatef(angle[1], 0, 1, 0);    glRotatef(angle[2], 0, 0, 1);    glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, index);      //绘制正方体    glutSwapBuffers();}void idle(){    if (der == 3)        return;    angle[der] += speed;    if (angle[der] > 360)        angle[der] -= 360;    if (angle[der] < 0)        angle[der] += 360;    glutPostRedisplay();}void keyboard(unsigned char key, int x, int y){       if (key == 27)      //按ESC退出程序        exit(0);    else if (key == '+')        speed = min(1.0, speed + 0.02);    else if (key == '-')        speed = max(0.01, speed - 0.02);    else if (key == 'x')        der = 0;    else if (key == 'y')        der = 1;    else if (key == 'z')        der = 2;    else if (key == 'p')        der = 3;}void motion(int x,int y){    if (der != 3)        return;    if (x > pr_x)        angle[1] += 1.5;    if (x < pr_x)        angle[1] -= 1.5;    if (y > pr_y)        angle[0] += 1.5;    if (y < pr_y)        angle[0] -= 1.5;    pr_x = x;    pr_y = y;    glutPostRedisplay();}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(1, 1, 1, 0);    glShadeModel(GL_SMOOTH);    glEnable(GL_DEPTH_TEST);//激活深度测试    glEnableClientState(GL_COLOR_ARRAY);    glEnableClientState(GL_VERTEX_ARRAY);    glVertexPointer(3, GL_FLOAT, 0, vertex);    glColorPointer(3, GL_FLOAT, 0, color);    pr_x = width / 2.0;    pr_y = height / 2.0;}int main(int argc, char *argv[]){    initWindow(argc, argv, 600, 600, "彩色立方体");    puts("\n键盘操作: \n\t+加速,-减速,p暂停旋转\n\tx围x轴旋转,y围y轴旋转,z围z轴旋转");    puts("\n鼠标操作: 左键拖动实现旋转");    glutDisplayFunc(myDisplay);    glutReshapeFunc(Reshape);    glutIdleFunc(idle);    glutMotionFunc(motion);    glutKeyboardFunc(keyboard);    glutMainLoop();    return 0;}
原创粉丝点击