太阳系行星运行模拟C++程序语言之欧阳体创编Word文档格式.docx
《太阳系行星运行模拟C++程序语言之欧阳体创编Word文档格式.docx》由会员分享,可在线阅读,更多相关《太阳系行星运行模拟C++程序语言之欧阳体创编Word文档格式.docx(13页珍藏版)》请在冰点文库上搜索。
基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。
其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。
3.颜色模式设置:
OpenGL颜色模式有两种,即RGBA模式和颜色索引(ColorIndex)。
4.光照和材质和镜面光(SpecularLight)。
材质是用光反射率来表示。
场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
5:
纹理映射(TextureMapping)。
利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。
6:
位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。
以上三条可使被仿真物更具真实感,增强图形显示的效果。
7:
双缓存动画(DoubleBuffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
此外,利用OpenGL还能实现深度暗示(DepthCue)、运动模糊(MotionBlur)等特殊效果。
从而实现了消隐算法。
具体实现
利用VC6.0和OpenGL绘制太阳系模拟,以最简单的方式,新建一个win32consoleapplication,加入以下代码:
#include<
windows.h>
stdio.h>
stdlib.h>
#include"
gl/glut.h"
//行星
GLfloatrot0=30.0;
GLfloatrot1=0.0;
GLfloatrot2=0.0;
GLfloatrot3=0.0;
GLfloatrot4=0.0;
GLfloatrot5=0.0;
GLfloatrot6=0.0;
GLfloatrot7=0.0;
GLfloatrot8=0.0;
//卫星
GLfloatrot9=0.0;
GLfloatrot10=0.0;
GLfloatrot11=0.0;
voidinit()
{
glClearColor(0.0,0.0,0.0,0.0);
glClearDepth(1.0);
glShadeModel(GL_FLAT);
}
voiddisplay()
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glLoadIdentity();
//gluLookAt(0,10,10,0,0,0,0,1,0);
//glRotatef(45.0,0.0,0.0,1.0);
glTranslatef(0.0,0.0,-20.0);
glRotatef(90.0,1.0,0.0,0);
glPushMatrix();
//绘制太阳
glColor3f(1.0,0.0,0.0);
glutSolidSphere(2.0,32,32);
//绘制地球
glColor3f(0.0,0.0,1.0);
//绘制辅助轨道
glRotatef(90,1.0,0,0.0);
glutSolidTorus(0.02,5.0,10,64);
glRotatef(-90,1.0,0,0.0);
//设置地球公转速度
glRotatef(rot0,0.0,1.0,0.0);
//设置地球半径
glTranslatef(5.0,0.0,0.0);
//设置地球自转速度
//glRotatef(rot1,0.0,1.0,0.0);
//绘制地球
glutSolidSphere(0.4,32,32);
//绘制地球的卫星-月亮
glColor3f(0.5,0.6,0.5);
//抵消地球自转影响
//glRotatef(-rot1,0.0,1.0,0.0);
//设置月亮公转速度
glRotatef(rot9,0.0,1.0,0.0);
//设置月亮公转半径
glTranslatef(0.6,0.0,0.0);
//绘制月亮
glutSolidSphere(0.1,10,8);
glPopMatrix();
//绘制水星
glColor3f(0.0,1.0,1.0);
glutSolidTorus(0.02,2.5,10,64);
//设置水星公转速度
glRotatef(rot1,0.0,1.0,0.0);
//设置水星公转半径
glTranslatef(2.5,0.0,0.0);
//设置水星自传
glRotatef(rot3,0.0,1.0,0.0);
glutSolidSphere(0.2,32,32);
//绘制金星
glColor3f(0.0,1.0,0.0);
//绘制辅助轨道
glutSolidTorus(0.02,3.4,10,64);
//设置金星公转速度
glRotatef(rot2,0.0,3.0,0.0);
//设置金星公转半径
glTranslatef(3.4,0.0,0.0);
//设置金星自传
//绘制金星
glutSolidSphere(0.3,32,32);
//绘制火星
glutSolidTorus(0.02,6.6,10,64);
//设置火星公转速度
glRotatef(rot3,0.0,4.0,0.0);
//设置火星公转半径
glTranslatef(6.6,0.0,0.0);
//设置火星自传
glRotatef(rot7,0.0,2.0,0.0);
//绘制火星
glutSolidSphere(0.5,32,32);
//绘制木星
glColor3f(2.0,0.1,1.0);
glutSolidTorus(0.02,8.5,10,64);
//设置木星公转速度
glRotatef(rot4,0.0,0.4,0.0);
//设置木星公转半径
glTranslatef(8.5,0.0,0.0);
//设置木星自传
glRotatef(rot3,0.0,0.3,0.0);
//绘制木星
glutSolidSphere(1.0,32,32);
//绘制木星卫星-木卫1
glColor3f(0.4,0.3,0.5);
//设置木卫1公转速度
glRotatef(rot10,0.0,1.0,0.0);
//设置木卫1公转半径
glTranslatef(1.3,0.0,0.0);
//绘制木卫1
//绘制木星卫星-木卫2
glColor3f(0.5f,0.5f,0.5f);
//设置木卫2公转速度
glRotatef(rot11,0.0,1.0,0.0);
//设置木卫2公转半径
glTranslatef(1.2,0.0,0.0);
//绘制木卫2
glutSolidSphere(0.08,10,8);
//绘制土星
glColor3f(1.0f,1.0f,0.0f);
glutSolidTorus(0.02,12.5,10,64);
//设置土星公转速度
glRotatef(rot5,0.0,0.4,0.0);
//设置土星公转半径
glTranslatef(12.5,0.0,0.0);
//设置土星自传
//绘制土星
glutSolidSphere(0.85,32,32);
//绘制土星光环
glutSolidTorus(0.1,1.25,10,64);
glutSolidTorus(0.07,1.65,10,64);
//绘制天王星
glColor3f(0.0f,1.0f,1.0f);
glutSolidTorus(0.02,15.5,10,64);
//设置天王星公转速度
glRotatef(rot6,0.0,0.4,0.0);
//设置天王星公转半径
glTranslatef(15.5,0.0,0.0);
//设置天王星自传
glRotatef(rot1,0.0,0.3,0.0);
//绘制天王星
glutSolidSphere(0.15,32,32);
//绘制海王星
glColor3f(0.0f,0.0,8.0f);
glutSolidTorus(0.02,17.5,10,64);
//设置海王星公转速度
glRotatef(rot7,0.0,0.4,0.0);
//设置海王星公转半径
glTranslatef(17.5,0.0,0.0);
//设置海王星自传
//绘制海王星
glutSolidSphere(0.145,32,32);
//绘制冥王星
glColor3f(0.5f,0.5f,0.5f);
glutSolidTorus(0.02,19.5,10,64);
//设置冥王星公转速度
glRotatef(rot8,0.0,0.4,0.0);
//设置冥王星公转半径
glTranslatef(19.5,0.0,0.0);
//设置冥王星自传
glRotatef(rot2,0.0,0.3,0.0);
//绘制冥王星
glutSwapBuffers();
glFlush();
voididle()
rot0+=0.1;
if(rot0>
=360.0)
rot0-=360.0;
rot1+=0.416;
if(rot1>
rot1-=360.0;
rot2+=0.1631;
if(rot2>
rot2-=360.0;
rot3+=0.053;
if(rot3>
rot3-=360.0;
rot4+=0.0083;
if(rot4>
rot4-=360.0;
rot5+=0.0034;
if(rot5>
rot5-=360.0;
rot6+=0.00119;
if(rot6>
rot6-=360.0;
rot7+=0.00069;
if(rot7>
rot7-=360.0;
rot8+=0.0008;
if(rot8>
rot8-=360.0;
rot9+=1.0;
if(rot9>
rot9-=360.0;
rot10+=0.005;
if(rot10>
rot10-=360.0;
rot11+=0.01;
if(rot11>
rot11-=360.0;
glutPostRedisplay();
voidreshape(intw,inth)
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
gluPerspective(60.0,(GLdouble)w/(GLdouble)h,1.0,100.0);
glMatrixMode(GL_MODELVIEW);
voidmain(intargc,char**argv)
glutInit(&
argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(600,400);
glutInitWindowPosition(500,500);
glutCreateWindow("
planetsim"
);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(idle);
glutMainLoop();
return;
运行结果
总结
本次设计是基于VC++6.0平台和OpenGL,进行太阳系九大行星的运行模拟,虽说取得了比较好的效果,但是在某些方面还是不足:
1.运行的轨道是简化的圆形轨道,不是实际中的椭圆轨道,没遵循开普勒三大定律;
2.视角固定,没有实现任意视角观察;
3.由于对OpenGL不熟悉,时间不短,大部分代码是在参考别人的基础上写出;
4.没有实现纹理光照等效果。
通过这次设计,对OpenGL有了一定的了解,对计算机图形学的知识也有了更深一步的理解,发现自己的不足,有利于以后的学习与工作。
5.参考书目
1.《计算机图形学》DonaldHearnM.PaulineBaker著电子工业出版社
2.《OpenGl编程基础》安吉尔 著清华大学出版社