OpenGL 画太阳,地球,月亮

#include <windows.h>
#include <gl/glut.h>
#include <math.h>
#define GL_PI 3.1415f  static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f; GLfloat  whiteLight[]={0.2f,0.2f,0.2f,1.0f};
GLfloat  lightPos[]={0.0f,0.0f,0.0f,1.0f};  void RenderScene(void)
{  static float fMoonRot = 0.0f;  static float fEarthRot= 0.0f;  glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);  glPushMatrix();   glTranslatef(0.0f,0.0f,-300.0f);    //绘制太阳glColor3ub(255,255,0);  glDisable(GL_LIGHTING);   //关闭光源  glutSolidSphere(20.0f,20.0f,20.0f);  glEnable(GL_LIGHTING);    //启动光源glLightfv(GL_LIGHT0,GL_POSITION,lightPos);  //绘制地球  glColor3ub(0,0,255);  glRotatef(fEarthRot,0.0f,1.0f,0.0f);  glTranslatef(105.0f,0.0f,0.0f);    glutSolidSphere(15.0f,15.0f,15.0f);      //颜色,移动,旋转速度都是要在画之前决定的  //根据基于地球的坐标进行旋转,并绘制月球  glColor3ub(200,200,200);  glRotatef(fMoonRot,0.0f,1.0f,0.0f);  glTranslatef(30.0f,0.0f,0.0f);fMoonRot += 15.0f;  if(fMoonRot >= 365.0f)  fMoonRot = 0.0f;  glutSolidSphere(6.0f,15.0f,15.0f);  //旋转角度确定好后才画的月球。glPopMatrix(); fEarthRot += 5.0f;  if(fEarthRot>=365.0f)  fEarthRot=0.0f;  glutSwapBuffers();
}
void ChangeSize(GLsizei w,GLsizei h)
{  GLfloat fAspect;  if(h==0) h=1; glViewport(0,0,w,h);  fAspect = (GLfloat)w/(GLfloat)h;  glMatrixMode(GL_PROJECTION);   glLoadIdentity();  gluPerspective(60.0f,fAspect ,1.0,4000);  glMatrixMode(GL_MODELVIEW);  glLoadIdentity();
}  void SetupRC(void)
{    glEnable(GL_DEPTH_TEST);     glEnable(GL_COLOR_MATERIAL);    glClearColor(0.0f,0.0f,0.0f,1.0f);     glEnable(GL_LIGHTING);                             //启动光源  glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight); //使用whiteLght所指定的环境光  glLightfv(GL_LIGHT0,GL_POSITION,lightPos);         //0号光源的位置  glEnable(GL_LIGHT0);
}  void SpecialKeys(int key ,int x, int y)
{  if(key==GLUT_KEY_UP)  xRot -= 5.0f;  if(key==GLUT_KEY_DOWN)  xRot +=5.0f;  if(key == GLUT_KEY_LEFT)  yRot -=5.0f;  if(key == GLUT_KEY_RIGHT)  yRot +=5.0f;  xRot = (GLfloat)((const int)xRot %360);  yRot = (GLfloat)((const int)yRot %360);  glutPostRedisplay();
}
void TimerFunc(int value)
{  glutPostRedisplay();  glutTimerFunc(100,TimerFunc,1);
}
int main(int argc, char* argv[])
{  glutInit(&argc,argv);    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(800,600);  glutCreateWindow("Orthographic Projection");   glutDisplayFunc(RenderScene);                                glutReshapeFunc(ChangeSize);  glutSpecialFunc(SpecialKeys);//设置上下左右键对图形旋转的控制 SetupRC();                     glutTimerFunc(250,TimerFunc,1); //自动动画,计时器  glutMainLoop(); return 0;
}  

太阳系八大行星

#include <windows.h>
#include <gl/glut.h>
#include <math.h>
#define GL_PI 3.1415f         float fMoonRot =      0.0f;
float fAdamRot=       0.0f;
float fEarthRot=      0.0f;
float fMarsRot =      0.0f;
float fMarsatellite1 =0.0f;
float fMarsatellite2 =0.0f;
float fHesperRot =    0.0f;
float fJupiterRot  =  0.0f;
float fSaturnRot   =  0.0f;
float fSaturn1 =      0.0f;
float fUranusRot   =  0.0f;
float fNeptuneRot  =  0.0f;  GLfloat  whiteLight[]={0.2f,0.2f,0.2f,1.0f};
GLfloat  lightPos[]={0.0f,0.0f,0.0f,1.0f};      void sun()
{  //绘制太阳    glColor3ub(255,50,0);      glDisable(GL_LIGHTING);   //关闭光源      glutSolidSphere(25.0f,200.0f,200.0f);      glEnable(GL_LIGHTING);    //启动光源    glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
}
void Adam()
{  //绘制水星  glPushMatrix();   glColor3ub(0,0,255);      glRotatef(fAdamRot,0.0f,1.0f,0.0f);  glTranslatef(30.0f,0.0f,0.0f);    glutSolidSphere(2.0f,200.0f,200.0f);       //水星半径是地球的40% 即2  fAdamRot += 4.152f;                        //水星公转周期为地球24.08% ,即4.152  if(fAdamRot>=365.0f)       fAdamRot=0.0f;    glPopMatrix();
}
void Hesper()
{  //绘制金星  glPushMatrix();   glColor3ub(255,215,0);      glRotatef(fHesperRot,0.0f,1.0f,0.0f);  glTranslatef(40.0f,0.0f,0.0f);    glutSolidSphere(4.75f,200.0f,200.0f);       //金星半径是地球的95% 即4.75  fHesperRot += 1.62f;                        //金星公转周期为地球61.56% ,即1.62  if(fHesperRot>=365.0f)       fHesperRot=0.0f;    glPopMatrix();
}
void Earth_Moon()
{     //绘制地球,所有运行参数以地球为标准  glPushMatrix();   glColor3ub(0,0,255);      glRotatef(fEarthRot,0.0f,1.0f,0.0f);      glTranslatef(55.0f,0.0f,0.0f);           //设地球周期365  glutSolidSphere(5.0f,20.0f,20.0f);       //设地球半径5  //根据基于地球的坐标进行旋转,并绘制月球      glColor3ub(200,200,200);      glRotatef(fMoonRot,0.0f,1.0f,0.0f);      glTranslatef(5.0f,0.0f,0.0f);          // 不断平移fMoonRot += 13.3f;                     //月球的公转周期 27.3 天  365/27.3==13.3  if(fMoonRot >= 365.0f)                 // 月球半径是地球的3/11   即1.363     fMoonRot = 0.0f;      glutSolidSphere(1.363f,200.0f,200.0f);      glPopMatrix();                         //出栈后值变化,要在下一次循环中才有效   fEarthRot += 1.0f;      if(fEarthRot>=365.0f)      fEarthRot=0.0f;
}  void Mars()
{    //绘制火星glPushMatrix(); glColor3ub(255,0,0);    glRotatef(fMarsRot,0.0f,1.0f,0.0f);glTranslatef(65.0f,0.0f,0.0f);  glutSolidSphere(2.65f,200.0f,200.0f);       //火星半径是地球的53% 即2.65glPushMatrix(); //根据基于火星的坐标进行旋转,并绘制火卫一   glColor3ub(255,100,100);    glRotatef(fMarsatellite1,0.0f,1.0f,0.0f);    glTranslatef(2.0f,0.0f,2.0f);  fMarsatellite1 += 13.3f;                    if(fMarsatellite1 >= 365.0f)                   fMarsatellite1 = 0.0f;    glutSolidSphere(0.963f,200.0f,200.0f);    glPopMatrix();glPushMatrix(); //根据基于火星的坐标进行旋转,并绘制火卫二     glColor3ub(255,200,200);    glRotatef(fMarsatellite2,0.0f,1.0f,0.0f);    glTranslatef(-3.0f,0.0f,-3.0f);  fMarsatellite2 += 13.3f;                     if(fMarsatellite2 >= 365.0f)                    fMarsatellite2 = 0.0f;    glutSolidSphere(1.20f,200.0f,200.0f);    glPopMatrix();fMarsRot += 0.5f;                           //火星公转周期为地球2倍if(fMarsRot>=365.0f)     fMarsRot=0.0f;  glPopMatrix();
}void Jupiter()
{  //绘制木星  glPushMatrix();   glColor3ub(200,100,0);glRotatef(fJupiterRot,0.0f,1.0f,0.0f);  glTranslatef(100.0f,0.0f,0.0f);    glutSolidSphere(17.0f,200.0f,200.0f);       //木星半径是地球的11.21倍 即56.05  为了美观,定为17 glPushMatrix(); glColor3ub(250,180,0);  glRotatef(70.0f,1.0f,0.0f,0.0f);             //环旋转70度 glutSolidTorus(1.42,20,10,100);             //效果上看,第一个参数是圆环的宽度glPopMatrix();fJupiterRot += 0.15f;                     //木星公转周期为地球11.87倍 ,即0.084  为了明显,设为0.15if(fJupiterRot>=365.0f)       fJupiterRot=0.0f;    glPopMatrix();
}
void Saturn()
{  //绘制土星  glPushMatrix();   glColor3ub(73,60,32);      glRotatef( fSaturnRot,0.0f,1.0f,0.0f);  glTranslatef(148.0f,0.0f,0.0f);    glutSolidSphere(15.0f,200.0f,200.0f);       //土星半径是地球的9.45倍 即47.25 为了美观,定为15  //绘制土卫一glPushMatrix();   glColor3ub(255,200,200);    glRotatef(fSaturn1,0.0f,1.0f,0.0f);    glTranslatef(-17.0f,0.0f,-17.0f);  fSaturn1 += 6.4f;                     if(fSaturn1 >= 365.0f)                    fSaturn1 = 0.0f;    glutSolidSphere(1.20f,200.0f,200.0f);    glPopMatrix();glPushMatrix(); glColor3ub(200,200,100);  glRotatef(70.0f,1.0f,0.0f,0.0f);             //环旋转70度 glutSolidTorus(1.42,25,10,100);             //效果上看,第一个参数是圆环的宽度glPopMatrix();fSaturnRot += 0.03f;                        //土星公转周期为地球29.47倍 ,即0.03  if( fSaturnRot>=365.0f)       fSaturnRot=0.0f;    glPopMatrix();
}
void UranusRot()
{  //绘制天王星  glPushMatrix();   glColor3ub(0,180,100);  glRotatef( fUranusRot,0.0f,1.0f,0.0f);  glTranslatef(202.0f,0.0f,0.0f);    glutSolidSphere(15.0f,200.0f,200.0f);       //天王星半径是地球的倍 即4.01,即15    glPushMatrix(); glColor3ub(0,100,0);  glRotatef(150.0f,1.0f,0.0f,0.0f);             //环旋转度 glutSolidTorus(1.0,20,10,100);             //效果上看,第一个参数是圆环的宽度glPopMatrix();fUranusRot += 0.03f;                        //天王星公转周期为地球84.06倍 ,即0.0124  if( fUranusRot>=365.0f)       fUranusRot=0.0f;    glPopMatrix();
}  void Neptune()
{  //绘制海王星  glPushMatrix();   glColor3ub(0,0,215);       glRotatef( fNeptuneRot,0.0f,1.0f,0.0f);  glTranslatef(240.0f,0.0f,0.0f);    glutSolidSphere(19.45f,200.0f,200.0f);       //海王星半径是地球的倍 即3.89,即19.45    fNeptuneRot += 2.17f;                       //天王星公转周期为地球46%倍 ,即2.17  if( fUranusRot>=365.0f)       fNeptuneRot=0.0f;    glPopMatrix();
}
void RenderScene(void)
{       glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);      glPushMatrix();       glTranslatef(0.0f,0.0f,-300.0f);        sun();  Adam();  Hesper();  Earth_Moon();  Mars();  Jupiter();  Saturn();  UranusRot();  Neptune();  glPopMatrix();    glutSwapBuffers();
}
void ChangeSize(GLsizei w,GLsizei h)
{      GLfloat fAspect;      if(h==0) h=1;     glViewport(0,0,w,h);      fAspect = (GLfloat)w/(GLfloat)h;      glMatrixMode(GL_PROJECTION);       glLoadIdentity();      gluPerspective(60.0f,fAspect ,1.0,4000);      glMatrixMode(GL_MODELVIEW);      glLoadIdentity();
}      void SetupRC(void)
{        glEnable(GL_DEPTH_TEST);         glEnable(GL_COLOR_MATERIAL);        glClearColor(0.0f,0.0f,0.0f,1.0f);         glEnable(GL_LIGHTING);                             //启动光源      glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight); //使用whiteLght所指定的环境光      glLightfv(GL_LIGHT0,GL_POSITION,lightPos);         //0号光源的位置      glEnable(GL_LIGHT0);
}      void TimerFunc(int value)
{      glutPostRedisplay();      glutTimerFunc(100,TimerFunc,1);
}      int main(int argc, char* argv[])
{      glutInit(&argc,argv);        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);     glutInitWindowSize(800,600);      glutCreateWindow("Orthographic Projection");       glutDisplayFunc(RenderScene);                                    glutReshapeFunc(ChangeSize);      SetupRC();       glutTimerFunc(250,TimerFunc,1); //自动动画,计时器   glutMainLoop();     return 0;
}      

OpenGL (太阳,地球,月亮 +太阳系八大行星)相关推荐

  1. OpenGl太阳地球月亮运动系统

    在讲解这个运动系统,首先我们的来讲解OpenGl里有关几个图形变换的知识,这里就以球为例,我们需要知道将球平移,旋转的2个知识.因为系统必须用到平移和旋转. 1 平移变换: glTranslatef( ...

  2. 太阳系八大行星碰撞的视频_高中地理——太阳系与地球

    知识点 (1)太阳系八大恒星,及其排列顺序. (2)行星公转的特点 (3)为什么,地球上可以存在生命? 考点详解 1.太阳系八大行星的顺序 金木水火土?No!!! 根据距离太阳由近至远的顺序,分别为: ...

  3. openGl编程实现一个太阳地球月亮的一个简单运动系统

    一. 项目目的 使用openGl编程实现一个太阳地球月亮的一个简单运动系统,要求实现三维转动.点光源变化.纹理映射及阴影等效果 二. 任务实现 \1. 满足三者实际大小/距离的比例关系: \2. 满足 ...

  4. Python模拟太阳-地球-月亮运动模型

    作者 | Charles,cv方向在读研究生.[Charles 的皮卡丘]专注于分享有趣好玩的Python小项目(AI.爬虫等等). 来源 | Charles 的皮卡丘 编辑 | Jane [导语]春 ...

  5. Python模拟登录,matplotlib模块,Python模拟太阳-地球-月亮运动模型

    前言 利用python模拟太阳-地球-月亮运动模型. 让我们愉快地开始吧~ 开发工具 **Python版本:**3.6.4 相关模块: pygame模块: matplotlib模块: numpy模块: ...

  6. 太阳系八大行星碰撞的视频_火星的身世:从太阳系的起源说起

    大约46亿年前 盘状的太阳星云 从一大片又冷又暗的 气体云中诞生 太阳自己并没有任何暴露确切年龄的线索,我们之所以能够知道太阳系的"生日",是因为迄今从陨石中找到的最古老固体物质, ...

  7. webgl 绘制太阳 地球 月亮

    目录 1.开发环境 2.内容说明 1.计算球体的坐标和纹理 2.求顶点索引 3.数据加载到缓存中 4.绘制球体 5.其他 3.运行结果及代码下载 1.开发环境 浏览器 : 火狐 firefox(配置参 ...

  8. CSS太阳地球月亮转圈圈loading

    一个css例子 css太阳 月亮 地球转转转 知识点总结: justify-content: center; justify-content 用于设置或检索弹性盒子元 素在主轴(横轴)方向上的对齐方式 ...

  9. three.js旋转,材质,灯光使用 —— 太阳地球月亮运动

    import * as THREE from 'three' //引入控制器 import { OrbitControls } from 'three/examples/jsm/controls/Or ...

  10. Unity学生作业:太阳地球月亮自转和公转

    1.第一步 打开Unity. 2.第二步 在场景中创建3个Sphere球体并分别命名为Moon, Sun和Earth. 在命名完之后调整3个球的大小和位置,并贴上贴图.将Moon作为Earth的子物体 ...

最新文章

  1. 车牌识别算法_PC端车牌识别SDK融入好算法
  2. 基于WF4的新平台-表单格式
  3. Web前端优化需要注意的点
  4. Maven编译项目时报错:不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。
  5. html5边框闪烁,HTML – CSS框阴影动画像素艺术闪烁
  6. java判断浏览器杂项_杂 项 - HelloJava菜鸟社区
  7. STM32F103代码远程升级(六)基于小米IoT开发者平台远程升级代码的实现
  8. 109 个实用 shell 脚本
  9. USB STM32配置
  10. GIS招聘 | 云南省自然资源厅所属事业单位
  11. 为什么JAVA对象需要实现序列化?
  12. 整合+策略:微网通联的GMP平台如何帮助企业搭建统一智慧通信架构
  13. bootstrap table 超链接的添加 a标签
  14. Java学习 之 画图板 立方体
  15. 中国计算机大赛游戏,我校在第10届全国大学生计算机设计大赛第暨4届中国大学生动漫游戏设计大赛,“星雨杯”福建省级赛的表现优异...
  16. edge如何玩4399小游戏
  17. 显示IP属地之后,有的人慌了!而有的人却发了?
  18. 跳跃的青蛙,C语言实现版本
  19. iphone天气定位功能
  20. 嵌入式Linux上没有wlan0

热门文章

  1. HTML基础学习(全)
  2. Linux程序设计(常用Linux命令)
  3. 博主自传——蒟蒻的OI之路
  4. 计算机系统具有运行可靠性,计算机系统的可靠性技术
  5. celery英语,celery英语_celery什么意思_celery用法翻译_celery英语读音_解释 - 英语宝典...
  6. 睡眠麻痹 CSP HSP
  7. MD5的认识,建议所有菜菜都看下
  8. Bootstrap入门基础(二)
  9. C语言 6习题13 编一程序,将两个字符串连接起来,不要用strcat函数。
  10. Android 讯飞语音合成、语音播报(详细步骤+源码)