OpenGL (太阳,地球,月亮 +太阳系八大行星)
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 (太阳,地球,月亮 +太阳系八大行星)相关推荐
- OpenGl太阳地球月亮运动系统
在讲解这个运动系统,首先我们的来讲解OpenGl里有关几个图形变换的知识,这里就以球为例,我们需要知道将球平移,旋转的2个知识.因为系统必须用到平移和旋转. 1 平移变换: glTranslatef( ...
- 太阳系八大行星碰撞的视频_高中地理——太阳系与地球
知识点 (1)太阳系八大恒星,及其排列顺序. (2)行星公转的特点 (3)为什么,地球上可以存在生命? 考点详解 1.太阳系八大行星的顺序 金木水火土?No!!! 根据距离太阳由近至远的顺序,分别为: ...
- openGl编程实现一个太阳地球月亮的一个简单运动系统
一. 项目目的 使用openGl编程实现一个太阳地球月亮的一个简单运动系统,要求实现三维转动.点光源变化.纹理映射及阴影等效果 二. 任务实现 \1. 满足三者实际大小/距离的比例关系: \2. 满足 ...
- Python模拟太阳-地球-月亮运动模型
作者 | Charles,cv方向在读研究生.[Charles 的皮卡丘]专注于分享有趣好玩的Python小项目(AI.爬虫等等). 来源 | Charles 的皮卡丘 编辑 | Jane [导语]春 ...
- Python模拟登录,matplotlib模块,Python模拟太阳-地球-月亮运动模型
前言 利用python模拟太阳-地球-月亮运动模型. 让我们愉快地开始吧~ 开发工具 **Python版本:**3.6.4 相关模块: pygame模块: matplotlib模块: numpy模块: ...
- 太阳系八大行星碰撞的视频_火星的身世:从太阳系的起源说起
大约46亿年前 盘状的太阳星云 从一大片又冷又暗的 气体云中诞生 太阳自己并没有任何暴露确切年龄的线索,我们之所以能够知道太阳系的"生日",是因为迄今从陨石中找到的最古老固体物质, ...
- webgl 绘制太阳 地球 月亮
目录 1.开发环境 2.内容说明 1.计算球体的坐标和纹理 2.求顶点索引 3.数据加载到缓存中 4.绘制球体 5.其他 3.运行结果及代码下载 1.开发环境 浏览器 : 火狐 firefox(配置参 ...
- CSS太阳地球月亮转圈圈loading
一个css例子 css太阳 月亮 地球转转转 知识点总结: justify-content: center; justify-content 用于设置或检索弹性盒子元 素在主轴(横轴)方向上的对齐方式 ...
- three.js旋转,材质,灯光使用 —— 太阳地球月亮运动
import * as THREE from 'three' //引入控制器 import { OrbitControls } from 'three/examples/jsm/controls/Or ...
- Unity学生作业:太阳地球月亮自转和公转
1.第一步 打开Unity. 2.第二步 在场景中创建3个Sphere球体并分别命名为Moon, Sun和Earth. 在命名完之后调整3个球的大小和位置,并贴上贴图.将Moon作为Earth的子物体 ...
最新文章
- 车牌识别算法_PC端车牌识别SDK融入好算法
- 基于WF4的新平台-表单格式
- Web前端优化需要注意的点
- Maven编译项目时报错:不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。
- html5边框闪烁,HTML – CSS框阴影动画像素艺术闪烁
- java判断浏览器杂项_杂 项 - HelloJava菜鸟社区
- STM32F103代码远程升级(六)基于小米IoT开发者平台远程升级代码的实现
- 109 个实用 shell 脚本
- USB STM32配置
- GIS招聘 | 云南省自然资源厅所属事业单位
- 为什么JAVA对象需要实现序列化?
- 整合+策略:微网通联的GMP平台如何帮助企业搭建统一智慧通信架构
- bootstrap table 超链接的添加 a标签
- Java学习 之 画图板 立方体
- 中国计算机大赛游戏,我校在第10届全国大学生计算机设计大赛第暨4届中国大学生动漫游戏设计大赛,“星雨杯”福建省级赛的表现优异...
- edge如何玩4399小游戏
- 显示IP属地之后,有的人慌了!而有的人却发了?
- 跳跃的青蛙,C语言实现版本
- iphone天气定位功能
- 嵌入式Linux上没有wlan0
热门文章
- HTML基础学习(全)
- Linux程序设计(常用Linux命令)
- 博主自传——蒟蒻的OI之路
- 计算机系统具有运行可靠性,计算机系统的可靠性技术
- celery英语,celery英语_celery什么意思_celery用法翻译_celery英语读音_解释 - 英语宝典...
- 睡眠麻痹 CSP HSP
- MD5的认识,建议所有菜菜都看下
- Bootstrap入门基础(二)
- C语言 6习题13 编一程序,将两个字符串连接起来,不要用strcat函数。
- Android 讯飞语音合成、语音播报(详细步骤+源码)