opengl: 太阳地球和月亮
// 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: 太阳地球和月亮相关推荐
- OpenGl太阳地球月亮运动系统
在讲解这个运动系统,首先我们的来讲解OpenGl里有关几个图形变换的知识,这里就以球为例,我们需要知道将球平移,旋转的2个知识.因为系统必须用到平移和旋转. 1 平移变换: glTranslatef( ...
- openGL绘制带纹理太阳、地球、月亮,并且地球自转并且围绕太阳旋转。月亮自转也会围绕地球旋转
openGL系列文章目录 前言 使用openGL绘制太阳.地球.月亮,太阳自转,地球自转并且围绕太阳旋转.月亮自转也会围绕地球旋转,其实月亮也会围绕太阳旋转的. 一.效果 还是有不满意的地方: 1.没 ...
- 【OpenGL】太阳、地球、月亮实例(一)
准备把自己这几天的学习opengl的经验写下来,自己是这方面的小白,希望大神可以对有问题以及可以优化的地方提出来.也欢迎指出不足和吐槽.希望帮到小白. 自己参考得比较多的网站是这个: http://w ...
- openGl编程实现一个太阳地球月亮的一个简单运动系统
一. 项目目的 使用openGl编程实现一个太阳地球月亮的一个简单运动系统,要求实现三维转动.点光源变化.纹理映射及阴影等效果 二. 任务实现 \1. 满足三者实际大小/距离的比例关系: \2. 满足 ...
- OpenGL “太阳、地球和月亮”天体运动动画 例子
http://oulehui.blog.163.com/blog/static/7961469820119186616743/ OpenGL "太阳.地球和月亮"天体运动动画 例子 ...
- openGL编程学习(3):太阳、地球、月亮(含自转和公转)和航天飞机
太阳.地球和月亮的显示 sphere.h #include <cmath> #include <vector> #include <glm\glm.hpp> cla ...
- OpenGL:绘制太阳地球例子
#include <GL/freeglut.h> //本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h> //但GLUT的头文件中已经自动将这 ...
- 第一个动画——太阳、地球和月亮(教程例题)
搜索到了一个比较容易的初级OpenGL教程,对初学者比较友好.讲解,练习都比较详细,入门门槛比较低.看了好几节可了,把一个练习题做了一遍.现在贴上来.特别初级的爱好者水平,大神就绕道了. 这个是完整代 ...
- MATLAB-实现太阳、地球、月亮三者之间运转关系的模拟
例题:宇宙中存在着诸多的天体,以行星地球为例,地球绕着太阳进行公转,同时自身进行着自转.同样的,月亮在围绕地球旋转的同时自身也在自转.为了问题的简单化,假设太阳处于固定位置,且自身只有自转,只考虑太阳 ...
最新文章
- 【转】Loadrunner入门(《软件性能测试过程详解与案例剖析》)
- leetcode 542. 01 Matrix | 542. 01 矩阵(图解,广度优先搜索)
- C#如何生成缩略图、水印
- python怎么填充画布_如何在kivy中用图像填充画布?
- fedora 27 mysql_无法在Fedora27上的Python2 virtualenv中使用mysqldb
- 8软件遇到的问题及解决方法_Excel工作表中的8个常见问题,你一定遇到过,附解决方法...
- 开到朝鲜的国产十元店,一年如何卖出190亿?
- LY.JAVA面向对象编程.内存图
- 计算机组成与结构学的是什么内容,计算机组成与体系结构教学大纲.doc
- 实战项目 仿写小米商城 网页框架
- html静态网页实例一(附完整代码)
- ant design table样式修改合集
- 快速排序(萝卜填坑算法)【必会知识】
- 5G的遮羞布被撕下了,双十一最畅销的手机竟然是4G手机
- 在c语言中 if语句后的一对原括号,c语言中if语句后的一对圆括号中
- SpringCloud Alibaba系列——7Dubbo的服务暴露和注册
- codevs 2806 红与黑
- oracle 三表关联查询
- B站自定义视频播放速度
- Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法