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控制行星围绕太阳进行旋转

  • 相关阅读:
    访问者模式
    oracle触发器简单实用示例
    C#控件交互效果类(也可以用作缩小面板放大,展示更多信息)
    23种设计模式探索C#
    windows快捷操作个人记录(常用)
    C#巧妙使用关键字async/await
    学习的枚举类型,结构以及初步了解数组
    目前学习.net时间让我摸不着头脑的事情
    对C#中几个循环语句的使用,请教
    学习了用控制台显示结果
  • 原文地址:https://www.cnblogs.com/feifanrensheng/p/9250487.html
Copyright © 2011-2022 走看看