// Solar.c
// OpenGL SuperBible
// Demonstrates OpenGL nested coordinate transformations
// and perspective
// Program by Richard S. Wright Jr.

/*原作者: Richard S. Wright Jr, 我在这里学习翻译一下  */

#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff
#include <math.h>

// Lighting values
GLfloat  whiteLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat  sourceLight[] = { 0.8f, 0.8f, 0.8f, 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);

// 保存矩阵
 glMatrixMode(GL_MODELVIEW);
 glPushMatrix();

//向远移动场景 -移动到300 处,为地球绕太阳旋转腾出空间 
 glTranslatef(0.0f, 0.0f, -300.0f); 
 
 //设置材料,颜色
 // 太阳
    glDisable(GL_LIGHTING);
 glColor3ub(255, 255, 0);
 //在屏幕中心画球体半径15
 glutSolidSphere(15.0f, 30, 17);
    glEnable(GL_LIGHTING);

//画完太阳,把光源置于屏幕中心!
 glLightfv(GL_LIGHT0,GL_POSITION,lightPos);

//沿y=1旋转坐标系统 fEarthRot 角度
 glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);

//画地球
 glColor3ub(0,0,255);
 //在距离太阳105处画半径15地球
 glTranslatef(105.0f,0.0f,0.0f);
 glutSolidSphere(15.0f, 30, 17);

//画围绕地球旋转的月亮
 glColor3ub(200,200,200);
 //沿着y=1旋转 fMoonRot 角度
 glRotatef(fMoonRot,0.0f, 1.0f, 0.0f);
 //在距离地球30地方画半径为6月亮
 glTranslatef(30.0f, 0.0f, 0.0f);
 //月球旋转角度增量
 fMoonRot+= 15.0f;
 if(fMoonRot > 360.0f)
  fMoonRot = 0.0f;

glutSolidSphere(6.0f, 30, 17);

//还原矩阵
 glPopMatrix(); // Modelview matrix

//地球旋转角度增量
 fEarthRot += 5.0f;
 if(fEarthRot > 360.0f)
  fEarthRot = 0.0f;

//显示图像
 glutSwapBuffers();
 }

// 渲染初始化函数,上下文环境设置.
void SetupRC()
 {
 //设置灯光和坐标
 //启用深度测试,有遮挡的效果
 glEnable(GL_DEPTH_TEST);
 //逆时针为多边形正面
 glFrontFace(GL_CCW);
 //启用剔除效果,多边形背面不用光照处理
 glEnable(GL_CULL_FACE);

//启动灯光效果
 glEnable(GL_LIGHTING);

//设置灯泡0
 //环境光颜色
 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);
 //散射光强度
 glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);
 //光源位置
 glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
 //开灯
 glEnable(GL_LIGHT0);

//使用颜色材质
 glEnable(GL_COLOR_MATERIAL);
 
 //设置材料反射属性, 以相同的强度反射环境光和散射光
 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

//黑色背景
 glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
    }

void TimerFunc(int value)
    {
    glutPostRedisplay();
    glutTimerFunc(100, TimerFunc, 1);
    }

void ChangeSize(int w, int h)
    {
    GLfloat fAspect;

//防止被0除
    if(h == 0)
        h = 1;

//设置视口大小
    glViewport(0, 0, w, h);

//计算屏幕比例
    fAspect = (GLfloat)w/(GLfloat)h;

//指定投影矩阵为当前矩阵
    glMatrixMode(GL_PROJECTION);
 //把坐标系重置为视觉坐标,即屏幕中心
    glLoadIdentity();

//设置眼睛睁开的大小(摄像机焦距一般45合适,看到最近1,最远425处的东西),
    gluPerspective(45.0f, fAspect, 1.0, 425.0);

//制定模型视图矩阵为当前矩阵
    glMatrixMode(GL_MODELVIEW);
 //把坐标系重置为视觉坐标,即屏幕中心
    glLoadIdentity();
    }

int main(int argc, char* argv[])
 {
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(800, 600);
 glutCreateWindow("Earth/Moon/Sun System");
 glutReshapeFunc(ChangeSize);
 glutDisplayFunc(RenderScene);
        glutTimerFunc(250, TimerFunc, 1);
 SetupRC();
 glutMainLoop();

return 0;
 }

效果如下:

opengl: 太阳地球和月亮相关推荐

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

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

  2. openGL绘制带纹理太阳、地球、月亮,并且地球自转并且围绕太阳旋转。月亮自转也会围绕地球旋转

    openGL系列文章目录 前言 使用openGL绘制太阳.地球.月亮,太阳自转,地球自转并且围绕太阳旋转.月亮自转也会围绕地球旋转,其实月亮也会围绕太阳旋转的. 一.效果 还是有不满意的地方: 1.没 ...

  3. 【OpenGL】太阳、地球、月亮实例(一)

    准备把自己这几天的学习opengl的经验写下来,自己是这方面的小白,希望大神可以对有问题以及可以优化的地方提出来.也欢迎指出不足和吐槽.希望帮到小白. 自己参考得比较多的网站是这个: http://w ...

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

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

  5. OpenGL “太阳、地球和月亮”天体运动动画 例子

    http://oulehui.blog.163.com/blog/static/7961469820119186616743/ OpenGL "太阳.地球和月亮"天体运动动画 例子 ...

  6. openGL编程学习(3):太阳、地球、月亮(含自转和公转)和航天飞机

    太阳.地球和月亮的显示 sphere.h #include <cmath> #include <vector> #include <glm\glm.hpp> cla ...

  7. OpenGL:绘制太阳地球例子

    #include <GL/freeglut.h> //本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h> //但GLUT的头文件中已经自动将这 ...

  8. 第一个动画——太阳、地球和月亮(教程例题)

    搜索到了一个比较容易的初级OpenGL教程,对初学者比较友好.讲解,练习都比较详细,入门门槛比较低.看了好几节可了,把一个练习题做了一遍.现在贴上来.特别初级的爱好者水平,大神就绕道了. 这个是完整代 ...

  9. MATLAB-实现太阳、地球、月亮三者之间运转关系的模拟

    例题:宇宙中存在着诸多的天体,以行星地球为例,地球绕着太阳进行公转,同时自身进行着自转.同样的,月亮在围绕地球旋转的同时自身也在自转.为了问题的简单化,假设太阳处于固定位置,且自身只有自转,只考虑太阳 ...

最新文章

  1. 【转】Loadrunner入门(《软件性能测试过程详解与案例剖析》)
  2. leetcode 542. 01 Matrix | 542. 01 矩阵(图解,广度优先搜索)
  3. C#如何生成缩略图、水印
  4. python怎么填充画布_如何在kivy中用图像填充画布?
  5. fedora 27 mysql_无法在Fedora27上的Python2 virtualenv中使用mysqldb
  6. 8软件遇到的问题及解决方法_Excel工作表中的8个常见问题,你一定遇到过,附解决方法...
  7. 开到朝鲜的国产十元店,一年如何卖出190亿?
  8. LY.JAVA面向对象编程.内存图
  9. 计算机组成与结构学的是什么内容,计算机组成与体系结构教学大纲.doc
  10. 实战项目 仿写小米商城 网页框架
  11. html静态网页实例一(附完整代码)
  12. ant design table样式修改合集
  13. 快速排序(萝卜填坑算法)【必会知识】
  14. 5G的遮羞布被撕下了,双十一最畅销的手机竟然是4G手机
  15. 在c语言中 if语句后的一对原括号,c语言中if语句后的一对圆括号中
  16. SpringCloud Alibaba系列——7Dubbo的服务暴露和注册
  17. codevs 2806 红与黑
  18. oracle 三表关联查询
  19. B站自定义视频播放速度
  20. Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法

热门文章

  1. 蛙蛙推荐:一个程序员2012年技术学习总结 - 蛙蛙王子 - 博客园
  2. VMWare删除虚拟机
  3. 微信公众号授权登录之二(tp5)
  4. iThenticate查重系统的使用及如何去除参考文献
  5. 虚幻4连接mysql蓝图教程_ue4商城资源MySQL Integration数据库集成插件
  6. 致这一段无悔的大学青春
  7. 多线程应用_左圆右方
  8. 锐捷交换机处理环路问题
  9. MySQL查看当前数据库
  10. MATLAB画旋转曲面1