zoukankan      html  css  js  c++  java
  • 基于Opengl的太阳系动画实现

    #include <GLglut.h>

    float fEarth = 2.0f;//地球绕太阳的旋转角度
    float fMoon = 24.0f;//月球绕地球的旋转角度

    void Init()
    {
      glEnable(GL_DEPTH_TEST);//启用深度测试
      glClearColor(0.0f,0.0f,0.0f,0.8f);//背景为黑色
    }

    void Reshape(int width, int height)
    {
      if (0==height)
      {
        height = 1;
      }
      
      glViewport(0,0,width,height);//设置视区尺寸
      glMatrixMode(GL_PROJECTION);//指定当前操作投影矩阵堆栈
      glLoadIdentity();//重置投影矩阵

      //指定透视投影的观察空间
      gluPerspective(45.0f,(float)width/(float)height,1.0f,1000.0f);
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
    }

    void Display(void)
    {
      //清除颜色和深度缓冲区
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
      //指定当前操作模型师徒矩阵堆栈
      glMatrixMode(GL_MODELVIEW);
      //重置模型视图矩阵
      glLoadIdentity();

      //图形沿Z轴负向移动
      glTranslatef(0.0f,0.0f,-500.0f);
      //绘制太阳
      glColor3f(1.0f,0.0f,0.0f);
      glutSolidSphere(50.0f,20,20);

      glColor3f(0.0f,0.0f,1.0f);
      //地球与太阳的黄赤交角
      glRotatef(23.27,0.0,0.0,1.0);
      glRotatef(fEarth,0.0f,1.0f,0.0f);

      glTranslatef(200.0f,0.0f,0.0f);
      //画地球
      glutSolidSphere(20.0f,20,20);
      glPopMatrix();
      glPopMatrix();

      glRotatef(6.0f,1.0f,1.0f,1.0f);
      glRotatef(fMoon,0.0f,1.0f,0.0f);
      glColor3f(1.0f,1.0f,0.0f);

      glTranslatef(30.0f,0.0f,0.0f);
      //月球
      glutSolidSphere(5.0f,20,20);
      glLoadIdentity();
      glFlush();

      glutSwapBuffers();
    }

    /*
    在空闲时调用,动画效果
    */
    void myIdle(void)
    {
      fEarth += 0.03f;//增加旋转步长,产生动画效果
      if (fEarth>360.0f)
      {
        fEarth = 2.0f;
      }

      fMoon += 0.24f;
      if (fMoon>360.0f)
      {
         fMoon = 24.0f;
      }
      Display();
    }

    int main(int argc,char* argv[])
    {
      glutInit(&argc,argv);
      //窗口使用RGB色,双缓存和深度缓存
      glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
      glutInitWindowPosition(200,100);//窗口位置

      //窗口尺寸
      glutInitWindowSize(600,460);
      glutCreateWindow("基于Opengl的太阳系动画");
      glutReshapeFunc(Reshape);

      glutDisplayFunc(Display);
      glutIdleFunc(&myIdle);
      Init();

      glutMainLoop();//
      return 0;
    }

    运行效果:

  • 相关阅读:
    x240 uefi ubuntu 12.04.4
    配置管理系统和总体变更系统有什么差别与联系
    C#-利用ZPL语言完毕条形码的生成和打印
    Java Web系统经常使用的第三方接口
    C++类型转换
    JAVA实现HTTPserver端
    Java 实现迭代器(Iterator)模式
    tomcat源代码Catalina
    【剑指offer】二叉搜索树转双向链表
    linux下C语言中的flock函数使用方法 .
  • 原文地址:https://www.cnblogs.com/herd/p/8372131.html
Copyright © 2011-2022 走看看