zoukankan      html  css  js  c++  java
  • opengl学习笔记(五):组合变换,绘制一个简单的太阳系

    创建太阳系模型

    描述的程序绘制一个简单的太阳系,其中有一颗行星和一颗太阳,用同一个函数绘制。需要使用glRotate*()函数让这颗行星绕太阳旋转,并且绕自身的轴旋转。还需要使用glTranslate*()函数让这颗行星离开原点,移动到它自己的轨道上。可以在glutWireSphere()函数中使用适当的参数,在绘制球体时指定球体的大小。

    planet.c

    #include <GL/glut.h>
    
    static int year =0,day =0;
    
    void init(void)
    {
        glClearColor(0.0,0.0,0.0,0.0);
        glShadeModel(GL_FLAT);
    }
    
    void display(void)
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(1.0,1.0,1.0);
        glPushMatrix();
        glutSolidSphere(1.0,20,16);
        glRotatef((GLfloat)year,0.0,1.0,0.0);
        glTranslatef(2.0,0.0,0.0);
        glRotatef((GLfloat)day,0.0,1.0,0.0);
        glutSolidSphere(0.2,10,8);
        glPopMatrix();
        glutSwapBuffers();
    }
    
    void reshape(int w, int h)
    {
        glViewport(0,0,(GLsizei)w,(GLsizei)h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,20.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
    }
    
    void keyboard(unsigned char key, int x, int y)
    {
        switch (key){
            case 'd':
            day =(day + 10)%360;
            glutPostRedisplay();
            break;
            case 'D':
            day =(day - 10)%360;
            glutPostRedisplay();
            break;
            case 'y':
            year =(year + 5 )%360;
            glutPostRedisplay();
            break;
            case 'Y':
            year =(year - 5)%360;
            glutPostRedisplay();
            break;
            default:
            break;
    
        }
    
    }
    
    int main(int argc, char** argv)
    {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
        glutInitWindowSize(500,500);
        glutInitWindowPosition(100,100);
        glutCreateWindow(argv[0]);
        init();
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutKeyboardFunc(keyboard);
        glutMainLoop();
        return 0;
    }

    在终端gcc生成可执行程序

    gcc planet.c -o planet -lGL -lGLU -lglut

    执行程序

    ./planet 

    程序运行效果如下所示

    d和D建行星自转

    y和Y控制行星围绕太阳进行旋转

  • 相关阅读:
    Gamma correction 伽马校准及 matlab 实现
    特征描述子(feature descriptor) —— HOG(方向梯度直方图)
    特征描述子(feature descriptor) —— HOG(方向梯度直方图)
    opencv cvtColor dtype issue(error: (-215) )
    opencv cvtColor dtype issue(error: (-215) )
    python 命令行:help(),'more'不是内部或外部命令,也不是可运行的程序或批处理文件
    PES包格式
    Makefile编写 四 函数篇
    Makefile编写 三 伪目标的作用
    ELF文件和BIN文件
  • 原文地址:https://www.cnblogs.com/feifanrensheng/p/9250487.html
Copyright © 2011-2022 走看看