1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > OpenGL (太阳 地球 月亮 +太阳系八大行星)

OpenGL (太阳 地球 月亮 +太阳系八大行星)

时间:2019-08-19 02:52:18

相关推荐

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.363fMoonRot = 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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。