1.项目描述
实现太阳系的模拟,包括天体的公转和自转。
2. 实现思路
3. 功能实现
打开VS2010,新建C++ Win32控制台空项目;新建Plant.cpp文件;添加文件夹Data,将位图文件拷贝到文件夹中并添加到Data中。
工程属性->配置(设为‘所有配置’)->配置属性->C/C++->预处理器定义(设为GLUT_BUILDING_LIB)
链接器->输入->附加依赖项中添加glu32.lib;glut32.lib;glut.lib;GLaux.lib;opengl32.lib
添加Plant.cpp代码:
1 #include <windows.h> 2 #include <stdio.h> 3 #include <math.h> 4 #include <GL/gl.h> 5 #include <GL/glu.h> 6 #include <GL/glut.h> 7 #include "gl/glaux.h" 8 #define PI 3.141592654 9 #define DEG2RAD(angle) angle*(PI/180) 10 11 static GLdouble viewPoint[]= {1.6,8.5,-0.3}; 12 static double Eyear = 0,Vyear=0,Meryear=0,Maryear=0, Jyear=0,Syear=0,Uyear=0,Nyear=0, 13 month=0, 14 Eday = 0,Merday=0,Vday=360,Marday=0,Jday=0,Sday=0,Uday=0,Nday=0, 15 angle,r; 16 static double MerDSpeed=0.72,VDSpeed=0.15,EDSpeed=36.0,MarDSpeed=35.0,JDSpeed=90.0,SDSpeed=81.0,UDSpeed=49.6,NDSpeed=53.6, 17 monSpeed=12, 18 MerYSpeed=4,VYSpeed=1.6,EYSpeed=1,MarYSpeed=0.5,JYSpeed=0.09,SYSpeed=0.03,UYSpeed=0.01,NYSpeed=0.006; 19 GLuint texture[10]; 20 21 22 void AutoRun(void) 23 { /*自转控制*/ 24 Merday += MerDSpeed; 25 if( Merday > 360.0 ) Merday -= 360.0; 26 Vday-=VDSpeed; 27 if( Vday <= 0 ) Vday += 360.0; // 金星是逆向自转 28 Eday += EDSpeed; 29 if( Eday > 360.0 ) Eday -= 360.0; 30 Marday+=MarDSpeed; 31 if( Marday > 360.0 ) Marday -= 360.0; 32 Jday+=JDSpeed; 33 if( Jday > 360.0 ) Jday -= 360.0; 34 Sday+=SDSpeed; 35 if( Sday > 360.0 ) Sday -= 360.0; 36 Uday+=UDSpeed; 37 if( Uday > 360.0 ) Uday -= 360.0; 38 Nday+=NDSpeed; 39 if( Nday > 360.0 ) Nday -= 360.0; 40 /*公转控制*/ 41 Meryear+=MerYSpeed; 42 if( Meryear > 360.0 ) Meryear -= 360.0; 43 Vyear += VYSpeed; 44 if( Vyear > 360.0 ) Vyear -= 360.0; 45 Eyear += EYSpeed; 46 if( Eyear > 360.0 ) Eyear -= 360.0; 47 Maryear += MarYSpeed; 48 if( Maryear > 360.0 ) Maryear -= 360.0; 49 Jyear += JYSpeed; 50 if( Jyear > 360.0 ) Jyear -= 360.0; 51 Syear += SYSpeed; 52 if( Syear > 360.0 ) Syear -= 360.0; 53 Uyear += UYSpeed; 54 if( Uyear > 360.0 ) Uyear -= 360.0; 55 Nyear += NYSpeed; 56 if( Nyear > 360.0 ) Nyear -= 360.0; 57 58 month += monSpeed; 59 if( month > 360.0 ) month -= 360.0; 60 glutPostRedisplay(); 61 } 62 63 /*绘制球体*/ 64 void gltDrawSphere(GLfloat fRadius, GLint iSlices, GLint iStacks) 65 { 66 GLfloat drho = (GLfloat)(3.141592653589) / (GLfloat) iStacks; 67 GLfloat dtheta = 2.0f * (GLfloat)(3.141592653589) / (GLfloat) iSlices; 68 GLfloat ds = 1.0f / (GLfloat) iSlices; 69 GLfloat dt = 1.0f / (GLfloat) iStacks; 70 GLfloat t = 1.0f; 71 GLfloat s = 0.0f; 72 GLint i, j; 73 74 for (i = 0; i < iStacks; i++) 75 { 76 GLfloat rho = (GLfloat)i * drho; 77 GLfloat srho = (GLfloat)(sin(rho)); 78 GLfloat crho = (GLfloat)(cos(rho)); 79 GLfloat srhodrho = (GLfloat)(sin(rho + drho)); 80 GLfloat crhodrho = (GLfloat)(cos(rho + drho)); 81 82 glBegin(GL_TRIANGLE_STRIP); 83 s = 0.0f; 84 for ( j = 0; j <= iSlices; j++) 85 { 86 GLfloat theta = (j == iSlices) ? 0.0f : j * dtheta; 87 GLfloat stheta = (GLfloat)(-sin(theta)); 88 GLfloat ctheta = (GLfloat)(cos(theta)); 89 90 GLfloat x = stheta * srho; 91 GLfloat y = ctheta * srho; 92 GLfloat z = crho; 93 94 glTexCoord2f(s, t); 95 glNormal3f(x, y, z); 96 glVertex3f(x * fRadius, y * fRadius, z * fRadius); 97 98 x = stheta * srhodrho; 99 y = ctheta * srhodrho; 100 z = crhodrho; 101 glTexCoord2f(s, t - dt); 102 s += ds; 103 glNormal3f(x, y, z); 104 glVertex3f(x * fRadius, y * fRadius, z * fRadius); 105 } 106 glEnd(); 107 108 t -= dt; 109 } 110 } 111 112 /*从文件获取BMP图片*/ 113 AUX_RGBImageRec *LoadBMP(char *Filename) // 载入位图图象 114 { 115 FILE *File=NULL; // 文件句柄 116 if (!Filename) // 确保文件名已提供 117 { 118 return NULL; //如果没提供,返回 NULL 119 120 } 121 File=fopen(Filename,"r"); //尝试打开文件 122 if (File) // 文件存在与否 123 { 124 fclose(File); // 关闭句柄 125 return auxDIBImageLoad(Filename); //载入位图并返回指针 126 } 127 return NULL; // 如果载入失败,返回 NULL 128 } 129 int LoadGLTextures() // 载入位图并转换成纹理 130 { 131 int Status=FALSE; // Status 状态指示器 132 int i; 133 AUX_RGBImageRec *TextureImage[10]; // 创建纹理的存储空间 134 char bmp[10][30]={ 135 "Data/Sun.bmp", 136 "Data/Mercury.bmp", 137 "Data/Venus.bmp", 138 "Data/earth.bmp", 139 "Data/moon.bmp", 140 "Data/Mars.bmp", 141 "Data/Jutiper.bmp", 142 "Data/Saturn.bmp", 143 "Data/Uranus.bmp", 144 "Data/Neptune.bmp", 145 146 }; 147 TextureImage[0]= LoadBMP(bmp[0]); 148 TextureImage[1]=LoadBMP(bmp[1]); 149 TextureImage[2]=LoadBMP(bmp[2]); 150 TextureImage[3]=LoadBMP(bmp[3]); 151 TextureImage[4]=LoadBMP(bmp[4]); 152 TextureImage[5]=LoadBMP(bmp[5]); 153 TextureImage[6]=LoadBMP(bmp[6]); 154 TextureImage[7]=LoadBMP(bmp[7]); 155 TextureImage[8]=LoadBMP(bmp[8]); 156 TextureImage[9]=LoadBMP(bmp[9]); 157 for(i=0;i<10;i++) 158 { 159 memset(TextureImage[i],0,sizeof(void *)*1); // 将指针设置为Null 160 /* 载入BMP图片,并查错*/ 161 if (TextureImage[i]=LoadBMP(bmp[i])) 162 { 163 Status=TRUE; // 将状态设置为TRUE 164 glGenTextures(1, &texture[i]); // 创建纹理 165 glBindTexture(GL_TEXTURE_2D, texture[i]); // 根据不同Bitmap图片的数据产生不同的纹理 166 /*定义纹理*/ 167 glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[i]->sizeX, TextureImage[i]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[i]->data); 168 /* 控制滤波*/ 169 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 170 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 171 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 172 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 173 } 174 if (TextureImage[i]) // 判断纹理是否存在 175 { 176 if (TextureImage[i]->data) // 判断纹理图像是否存在 177 { 178 free(TextureImage[i]->data); // 释放纹理图像占用的内存 179 } 180 free(TextureImage[i]); // 释放图像结构 181 } 182 } 183 184 return Status; // 返回状态 185 } 186 187 void display(void) 188 { /*材质参数*/ 189 GLfloat sun_mat_ambient[4]={1.0,1.0,1.0,0.0}; 190 GLfloat sun_mat_diffuse[4]={1.0,1.0,0.5,1.0}; 191 GLfloat sun_mat_specular[4]={1.0,1.0,1.0,1.0}; 192 GLfloat sun_mat_shininess[]={10.0}; 193 GLfloat sun_mat_emission[4]={0.1,0.1,0.1,1.0}; 194 195 GLfloat mat_ambient[4]={0.2,0.2,0.2,1.0}; 196 GLfloat mat_diffuse[4]={1.0,1.0,1.0,1.0}; 197 GLfloat mat_specular[4]={0.5,0.5,0.5,1.0}; 198 GLfloat mat_shininess[]={5.0}; 199 200 GLfloat light_position[] = { 0.0, 0.0, 0.0, 1.0 }; // 光源位置设置 201 202 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清空屏幕和深度缓存 203 glLoadIdentity(); // 重置当前的模型观察矩阵 204 205 gluLookAt(0,viewPoint[0],viewPoint[1],0,0,0,viewPoint[2],1,0); // 观察点设置 206 207 /* draw sun */ 208 glPushMatrix(); 209 glLightfv(GL_LIGHT0, GL_POSITION, light_position); // 创建光源 210 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,sun_mat_ambient); // 材质设定 211 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,sun_mat_diffuse); 212 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,sun_mat_specular); 213 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,sun_mat_shininess); 214 glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,sun_mat_emission); 215 glBindTexture(GL_TEXTURE_2D, texture[0]); // 绑定纹理 216 glRotatef((GLfloat) Eyear, 0.0, 1.0, 0.0); 217 glRotatef(90,1,0.0,0.0); 218 gltDrawSphere(1.0,200,200); //绘制球体 219 glPopMatrix(); 220 221 /* draw Mercury */ 222 glPushMatrix(); 223 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定 224 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); 225 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); 226 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); 227 glBindTexture(GL_TEXTURE_2D, texture[1]); // 绑定纹理 228 glRotatef((GLfloat) Meryear, 0.0, 1.0, 0.0); //公转 229 glTranslatef (0.0, 0.0, 1.8); //与太阳的距离 230 glRotatef((GLfloat) Merday, 0.0, 1.0, 0.0); //自转 231 glRotatef(90,1.0,0.0,0.0); 232 gltDrawSphere(0.2,200,200); 233 glPopMatrix(); 234 235 /*画水星轨道*/ 236 glDisable(GL_TEXTURE_2D); 237 glBegin(GL_LINE_LOOP); 238 glColor3f(1.0,1.0,1.0); 239 for(angle=0;angle<=360;angle++) 240 glVertex3f(1.8*sin(DEG2RAD(angle)),0,1.8*cos(DEG2RAD(angle))); 241 glEnd(); 242 glEnable(GL_TEXTURE_2D); 243 244 /* draw Venus */ 245 glPushMatrix(); 246 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定 247 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); 248 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); 249 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); 250 glBindTexture(GL_TEXTURE_2D, texture[2]); // 绑定纹理 251 glRotatef((GLfloat) Vyear, 0.0, 1.0, 0.0); 252 glTranslatef (0.0, 0.0, 2.5); //与太阳的距离 253 glRotatef((GLfloat) Vday, 0.0, 1.0, 0.0); 254 glRotatef(90,1.0,0.0,0.0); 255 gltDrawSphere(0.22,200,200); 256 glPopMatrix(); 257 258 /*画金星轨道*/ 259 glDisable(GL_TEXTURE_2D); 260 glBegin(GL_LINE_LOOP); 261 glColor3f(1.0,1.0,1.0); 262 for(angle=0;angle<=360;angle++) 263 glVertex3f(2.5*sin(DEG2RAD(angle)),0,2.5*cos(DEG2RAD(angle))); 264 glEnd(); 265 glEnable(GL_TEXTURE_2D); 266 267 /* draw Earth */ 268 glPushMatrix(); 269 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定 270 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); 271 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); 272 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); 273 glBindTexture(GL_TEXTURE_2D, texture[3]); // 绑定纹理 274 glRotatef((GLfloat) Eyear, 0.0, 1.0, 0.0); 275 glTranslatef (0.0, 0.0, 3.2); //与太阳的距离 276 glRotatef((GLfloat) Eday, 0.0, 1.0, 0.0); 277 glRotatef(90,1.0,0.0,0.0); 278 gltDrawSphere(0.2,200,200); 279 glPopMatrix(); 280 281 /*画地球轨道*/ 282 glDisable(GL_TEXTURE_2D); 283 glBegin(GL_LINE_LOOP); 284 glColor3f(1.0,1.0,1.0); 285 for(angle=0;angle<=360;angle++) 286 glVertex3f(3.2*sin(DEG2RAD(angle)),0,3.2*cos(DEG2RAD(angle))); 287 glEnd(); 288 glEnable(GL_TEXTURE_2D); 289 290 /* draw moon */ 291 glPushMatrix(); 292 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定 293 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); 294 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); 295 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); 296 glBindTexture(GL_TEXTURE_2D, texture[4]); // 绑定纹理 297 glRotatef((GLfloat) Eyear, 0.0, 1.0, 0.0); 298 glTranslatef (0.0, 0.0, 3.2); //与太阳的距离 299 glRotatef((GLfloat) month, 0.0, 1.0, 0.0); 300 glTranslatef (0.0, 0.0, 0.3); //与地球的距离 301 glRotatef((GLfloat) Eday, 0.0, 1.0, 0.0); 302 glRotatef(90,1.0,0.0,0.0); 303 glColor3f (1.0, 1.0, 1.0); 304 gltDrawSphere(0.06,100,100); 305 glPopMatrix(); 306 307 /* draw Mars */ 308 glPushMatrix(); 309 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定 310 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); 311 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); 312 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); 313 glBindTexture(GL_TEXTURE_2D, texture[5]); // 绑定纹理 314 glRotatef((GLfloat) Maryear, 0.0, 1.0, 0.0); 315 glTranslatef (0.0, 0.0, 3.9); //与太阳的距离 316 glRotatef((GLfloat) Marday, 0.0, 1.0, 0.0); 317 glRotatef(90,1.0,0.0,0.0); 318 gltDrawSphere(0.15,200,200); 319 glPopMatrix(); 320 321 /*画火星轨道*/ 322 glDisable(GL_TEXTURE_2D); 323 glBegin(GL_LINE_LOOP); 324 glColor3f(1.0,1.0,1.0); 325 for(angle=0;angle<=360;angle++) 326 glVertex3f(3.9*sin(DEG2RAD(angle)),0,3.9*cos(DEG2RAD(angle))); 327 glEnd(); 328 glEnable(GL_TEXTURE_2D); 329 330 /* draw Jupiter*/ 331 glPushMatrix(); 332 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定 333 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); 334 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); 335 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); 336 glBindTexture(GL_TEXTURE_2D, texture[6]); // 绑定纹理 337 glRotatef((GLfloat) Jyear, 0.0, 1.0, 0.0); 338 glTranslatef (0.0, 0.0, 4.5); //与太阳的距离 339 glRotatef((GLfloat) Jday, 0.0, 1.0, 0.0); 340 glRotatef(90,1.0,0.0,0.0); 341 gltDrawSphere(0.3,200,200); 342 glPopMatrix(); 343 344 /*画木星轨道*/ 345 glDisable(GL_TEXTURE_2D); 346 glBegin(GL_LINE_LOOP); 347 glColor3f(1.0,1.0,1.0); 348 for(angle=0;angle<=360;angle++) 349 glVertex3f(4.5*sin(DEG2RAD(angle)),0,4.5*cos(DEG2RAD(angle))); 350 glEnd(); 351 glEnable(GL_TEXTURE_2D); 352 353 /* draw Saturn*/ 354 glPushMatrix(); 355 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定 356 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); 357 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); 358 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); 359 glBindTexture(GL_TEXTURE_2D, texture[7]); // 绑定纹理 360 glRotatef((GLfloat) Syear, 0.0, 1.0, 0.0); 361 glTranslatef (0.0, 0.0, 5.5); //与太阳的距离 362 glRotatef((GLfloat) Sday, 0.0, 1.0, 0.0); 363 glRotatef(90,1.0,0.0,0.0); 364 gltDrawSphere(0.26,200,200); 365 glPopMatrix(); 366 367 /*画土星的光环*/ 368 glPushMatrix(); 369 glRotatef((GLfloat) Syear, 0.0, 1.0, 0.0); 370 glTranslatef (0.0, 0.0, 5.5); 371 glBegin(GL_LINE_LOOP); 372 for(r=0.32;r<=0.4;r+=0.006) 373 for(angle=0;angle<=360;angle++) 374 glVertex3f(r*sin(DEG2RAD(angle)),0,r*cos(DEG2RAD(angle))); 375 glEnd(); 376 glPopMatrix(); 377 378 /*画土星轨道*/ 379 glDisable(GL_TEXTURE_2D); 380 glBegin(GL_LINE_LOOP); 381 glColor3f(1.0,1.0,1.0); 382 for(angle=0;angle<=360;angle++) 383 glVertex3f(5.5*sin(DEG2RAD(angle)),0,5.5*cos(DEG2RAD(angle))); 384 glEnd(); 385 glEnable(GL_TEXTURE_2D); 386 387 /* draw Uranus*/ 388 glPushMatrix(); 389 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定 390 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); 391 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); 392 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); 393 glBindTexture(GL_TEXTURE_2D, texture[8]); // 绑定纹理 394 glRotatef((GLfloat) Uyear, 0.0, 1.0, 0.0); 395 glTranslatef (0.0, 0.0, 6.3); //与太阳的距离 396 glRotatef((GLfloat) Uday, 0.0, 1.0, 0.0); 397 glRotatef(90,1.0,0.0,0.0); 398 gltDrawSphere(0.24,200,200); 399 glPopMatrix(); 400 401 /*画天王星轨道*/ 402 glDisable(GL_TEXTURE_2D); 403 glBegin(GL_LINE_LOOP); 404 glColor3f(1.0,1.0,1.0); 405 for(angle=0;angle<=360;angle++) 406 glVertex3f(6.3*sin(DEG2RAD(angle)),0,6.3*cos(DEG2RAD(angle))); 407 glEnd(); 408 glEnable(GL_TEXTURE_2D); 409 410 /* draw Neptune*/ 411 glPushMatrix(); 412 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定 413 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse); 414 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular); 415 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess); 416 glBindTexture(GL_TEXTURE_2D, texture[9]); // 绑定纹理 417 glRotatef((GLfloat) Nyear, 0.0, 1.0, 0.0); 418 glTranslatef (0.0, 0.0, 7); //与太阳的距离 419 glRotatef((GLfloat) Nday, 0.0, 1.0, 0.0); 420 glRotatef(90,1.0,0.0,0.0); 421 gltDrawSphere(0.23,200,200); 422 glPopMatrix(); 423 424 /*画海王星轨道*/ 425 glDisable(GL_TEXTURE_2D); 426 glBegin(GL_LINE_LOOP); 427 glColor3f(1.0,1.0,1.0); 428 for(angle=0;angle<=360;angle++) 429 glVertex3f(7*sin(DEG2RAD(angle)),0,7*cos(DEG2RAD(angle))); 430 glEnd(); 431 glEnable(GL_TEXTURE_2D); 432 433 glutSwapBuffers(); 434 glFlush(); 435 } 436 437 void myinit(void) 438 { 439 440 GLfloat light_ambient[]={1.0, 1.0, 1.0, 1.0}; //环境光 441 GLfloat light_diffuse[]={1.0, 1.0, 1.0, 1.0}; //漫反射光 442 GLfloat light_specular[]={1.0, 1.0, 1.0, 1.0}; //镜面反射光 443 444 //glClearColor(0.5f, 0.5f, 0.5f, 1.0f); //设置背景颜色 445 glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); 446 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); 447 glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); 448 449 if (LoadGLTextures()) // 调用纹理载入子例程 450 glEnable(GL_LIGHTING); // 开启光照效果 451 glEnable(GL_LIGHT0); 452 glEnable(GL_TEXTURE_2D); //启动纹理映射 453 glShadeModel(GL_SMOOTH); // 启用阴影平滑 454 455 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); // 说明映射方式 456 glDepthFunc(GL_LESS); 457 glClearDepth(1.0f); // 深度缓存创建 458 glEnable(GL_DEPTH_TEST); // 开启深度测试 459 glDepthFunc(GL_LEQUAL); 460 461 } 462 463 464 void myReshape(GLsizei w, GLsizei h) 465 { 466 glViewport(0, 0, w, h); 467 glMatrixMode(GL_PROJECTION); 468 glLoadIdentity(); 469 gluPerspective(800.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); 470 glMatrixMode(GL_MODELVIEW); 471 glLoadIdentity(); 472 glTranslatef (0.0, 0.0, -5.0); 473 } 474 475 void View_SpeedControl(unsigned char key ,int x,int y) 476 { 477 switch(key) 478 { 479 480 case'z': 481 viewPoint[0]+= 0.1; 482 break; 483 484 case'x': 485 viewPoint[0]-= 0.1; 486 break; 487 488 case'c': 489 viewPoint[1]+=0.1; 490 break; 491 492 case'v': 493 viewPoint[1]-=0.1; 494 break; 495 496 case'b': 497 viewPoint[2]+=0.1; 498 break; 499 500 case'n': 501 viewPoint[2]-=0.1; 502 break; 503 504 case'=': 505 { MerDSpeed*=1.5,VDSpeed*=1.5,EDSpeed*=1.5,MarDSpeed*=1.5,JDSpeed*=1.5,SDSpeed*=1.5,UDSpeed*=1.5,NDSpeed*=1.5, 506 monSpeed*=2, 507 MerYSpeed*=2,VYSpeed*=2,EYSpeed*=2,MarYSpeed*=2,JYSpeed*=2,SYSpeed*=2,UYSpeed*=2,NYSpeed*=2;}; 508 break; 509 case'-': 510 { MerDSpeed/=1.5,VDSpeed/=1.5,EDSpeed/=1.5,MarDSpeed/=1.5,JDSpeed/=1.5,SDSpeed/=1.5,UDSpeed/=1.5,NDSpeed/=1.5, 511 monSpeed/=1.5, 512 MerYSpeed/=2,VYSpeed/=2,EYSpeed/=2,MarYSpeed/=2,JYSpeed/=2,SYSpeed/=2,UYSpeed/=2,NYSpeed/=2;}; 513 break; 514 515 default: 516 break; 517 518 } 519 display(); 520 } 521 int main(int argc, char** argv) 522 { 523 glutInit(&argc,argv); 524 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB | GLUT_DEPTH); 525 glutInitWindowSize(800,600); 526 glutCreateWindow("solar system"); 527 myinit(); 528 glutDisplayFunc(display); 529 glutReshapeFunc(myReshape); 530 glutKeyboardFunc(View_SpeedControl); 531 glutIdleFunc(AutoRun); 532 glutMainLoop(); 533 534 }
运行结果: