• openGL 旋转的图形 矩阵操作


    #include <windows.h>
    #ifdef __APPLE__
    #include <GLUT/glut.h>
    #else
    #include <GL/glut.h>
    #endif
    
    #include <stdlib.h>
    
    static int slices = 16;
    static int stacks = 16;
    
    /* GLUT callback Handlers */
    
    static void resize(int width, int height)
    {
        const float ar = (float) width / (float) height;
    
        glViewport(0, 50, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity() ;
    }
    
    static void display(void)
    {
        const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
        const double a = t*90.0;
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3d(1,0,0);
    
        glPushMatrix();
            glTranslated(-2.4,1.2,-6);
            glRotated(60,1,0,0);
            glRotated(a,0,0,1);
            glutSolidSphere(1,slices,stacks);
        glPopMatrix();
    
        glPushMatrix();
            glTranslated(0,1.2,-6);
            glRotated(60,1,0,0);
            glRotated(a,0,0,1);
            glutSolidCone(1,1,slices,stacks);
        glPopMatrix();
    
        glPushMatrix();
            glTranslated(2.4,1.2,-6);
            glRotated(60,1,0,0);
            glRotated(a,0,0,1);
            glutSolidTorus(0.2,0.8,slices,stacks);
        glPopMatrix();
    
        glPushMatrix();
            glTranslated(-2.4,-1.2,-6);
            glRotated(60,1,0,0);
            glRotated(a,0,0,1);
            glutWireSphere(1,slices,stacks);
        glPopMatrix();
    
        glPushMatrix();
            glTranslated(0,-1.2,-6);
            glRotated(60,1,0,0);
            glRotated(a,0,0,1);
            glutWireCone(1,1,slices,stacks);
        glPopMatrix();
    
        glPushMatrix();
            glTranslated(2.4,-1.2,-6);
            glRotated(60,1,0,0);
            glRotated(a,0,0,1);
            glutWireTorus(0.2,0.8,slices,stacks);
        glPopMatrix();
    
        glutSwapBuffers();
    }
    
    
    static void key(unsigned char key, int x, int y)
    {
        switch (key)
        {
            case 27 :
            case 'q':
                exit(0);
                break;
    
            case '+':
                slices++;
                stacks++;
                break;
    
            case '-':
                if (slices>3 && stacks>3)
                {
                    slices--;
                    stacks--;
                }
                break;
        }
    
        glutPostRedisplay();
    }
    
    static void idle(void)
    {
        glutPostRedisplay();
    }
    
    const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
    const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
    
    const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat high_shininess[] = { 100.0f };
    
    /* Program entry point */
    
    int main(int argc, char *argv[])
    {
        glutInit(&argc, argv);
        glutInitWindowSize(640,480);
        glutInitWindowPosition(10,10);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    
        glutCreateWindow("GLUT Shapes");
    
        glutReshapeFunc(resize);
        glutDisplayFunc(display);
        glutKeyboardFunc(key);
        glutIdleFunc(idle);
    
        glClearColor(1,1,1,1);
        glEnable(GL_CULL_FACE);
        glCullFace(GL_BACK);
    
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
    
        glEnable(GL_LIGHT0);
        glEnable(GL_NORMALIZE);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_LIGHTING);
    
        glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
        glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
        glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
        glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    
        glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    
        glutMainLoop();
    
        return EXIT_SUCCESS;
    }
    
    
    
    
    
    可以按 +号增加层数,看起来更圆!
    
    


  • 相关阅读:
    mysql 历史版本下载
    mysql 5.7 版本 You must reset your password using ALTER USER statement before executing this statement报错处理
    5.7 zip 版本的安装 以及遇到的坑
    mysql 5.6zip版本的卸载与5.7 zip 版本的安装
    mysql数据库的备份与还原
    本地Navicat连接docker里的mysql
    docker修改数据库密码
    docker 在push镜像到本地registry出现的500 Internal Server Error
    linux 没有界面内容显示不全解决办法
    json与map互相转换
  • 原文地址:https://www.cnblogs.com/riasky/p/3481880.html
Copyright © 2020-2023  润新知