lab4.cpp
上传用户:zflamp
上传日期:2008-10-15
资源大小:662k
文件大小:13k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // lab4.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. using namespace std;
  5. // 窗口大小
  6. GLsizei winWidth = 600, winHeight = 500;
  7. // 观察点及裁剪窗口等
  8. // GLfloat eyex = 0, eyey = 100, eyez = 70;
  9. // GLfloat xref = 0.0, yref = 100, zref = 0;
  10. // GLfloat Vx = 0, Vy = 1, Vz = 0;
  11. // GLfloat xwMin = -1600, ywMin = -90, xwMax = 160, ywMax = 90;
  12. GLfloat dnear =1, dfar = 100;
  13. // 光照参数
  14. GLfloat light_position[] = { 200.0, 200.0, 100.0, 1.0 };
  15. GLfloat ambientLight[] = { 0.3, 0.3, 0.3, 1.0 };
  16. GLfloat diffuseLight[] = { 0.7, 0.7, 0.7, 1.0 };
  17. GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };
  18. GLfloat  specref[] =  { 1.0f, 1.0f, 1.0f, 1.0f };
  19. GLuint f[4];
  20. GLuint tobjects;
  21. GLUquadricObj *cylinder;
  22. BYTE *pBytes;
  23. int nWidth, nHeight;
  24. int rotTheta = 30;
  25. int state = 1;
  26. int angle = 45;
  27. float xang = 0, yang = 0, zang = 0;
  28. //////////////////////////////////////////////////////////////////////////
  29. // 读取bmp文件 (24-bit 彩色bmp)
  30. BYTE * gltResourceBMPBits( UINT nResource, int *nWidth, int *nHeight )
  31. {
  32. HINSTANCE hInstance; // 初始化句柄
  33. HANDLE hBitmap; // bmp文件句柄
  34. BITMAPINFO bmInfo;
  35. BYTE *pData;
  36. // 打开bmp文件
  37. hInstance = GetModuleHandle( NULL );
  38. hBitmap = LoadBitmap( hInstance, MAKEINTRESOURCE( nResource ) );
  39. if( hBitmap == NULL )
  40. {
  41. return NULL;
  42. }
  43. GetObject( hBitmap, sizeof( BITMAPINFO ), &bmInfo );
  44. DeleteObject( hBitmap );
  45. hBitmap = LoadResource( hInstance, FindResource( hInstance, MAKEINTRESOURCE( nResource ), RT_BITMAP ) );
  46. if( hBitmap == NULL )
  47. {
  48. return NULL;
  49. }
  50. pData = ( BYTE * )LockResource( hBitmap );
  51. pData += sizeof( BITMAPINFO )-1;
  52. *nWidth = bmInfo.bmiHeader.biWidth; 
  53. *nHeight = bmInfo.bmiHeader.biHeight;
  54. return pData;
  55. }
  56. //////////////////////////////////////////////////////////////////////////
  57. //////////////////////////////////////////////////////////////////////////
  58. void init( void )
  59. {
  60. //光照
  61. glLightfv( GL_LIGHT0, GL_POSITION, light_position );
  62. glLightfv( GL_LIGHT0, GL_AMBIENT, ambientLight );
  63. glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseLight);
  64. glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
  65. glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE );
  66. glEnable( GL_LIGHTING );
  67. //深度
  68. glDepthFunc( GL_LEQUAL );
  69. glEnable( GL_DEPTH_TEST );
  70. glEnable( GL_CULL_FACE );
  71. //表面
  72. glEnable( GL_COLOR_MATERIAL );
  73. glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
  74. glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, specref );
  75. //纹理
  76. glEnable( GL_TEXTURE_2D );
  77. glGenTextures( 1, &tobjects );
  78. pBytes = gltResourceBMPBits( IDB_BITMAP1, &nWidth, &nHeight );
  79. glBindTexture( GL_TEXTURE_2D, tobjects );
  80. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
  81. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
  82. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
  83. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
  84. gluBuild2DMipmaps( GL_TEXTURE_2D, 3,  nWidth, nHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes );
  85. // glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, nWidth, nHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, pBytes );
  86. glClearColor( 0, 0, 0, 1.0f );
  87.   glColor3ub( 255,255,255 );
  88. //   gluLookAt( eyex, eyey, eyez, xref, yref, zref, Vx, Vy, Vz );
  89. f[0] = glGenLists(1);
  90. // 底座
  91. glNewList( f[0], GL_COMPILE );
  92. glEnable( GL_TEXTURE_2D );
  93. // 后向面
  94.   glNormal3f( 0, 0, -1 );
  95.   glBegin( GL_QUADS );
  96.   glTexCoord2f( 0.0, 0.0 );
  97.   glVertex3f( -200.0, 0.0, -25.0 );
  98.   glTexCoord2f( 1.0, 0.0 );
  99.   glVertex3f( -200.0, 10.0, -25.0 );
  100.   glTexCoord2f( 1.0, 1.0 );
  101.   glVertex3f( 200.0, 10.0, -25.0 );
  102.   glTexCoord2f( 0.0, 1.0 );
  103.   glVertex3f( 200.0, 0.0, -25.0 );
  104.   glEnd();
  105.  
  106.   // 右侧面
  107.   glNormal3f( 1, 0, 0 );
  108.   glBegin( GL_QUADS );
  109.   glTexCoord2f( 0.0, 0.0 );
  110.   glVertex3f( 200.0, 0.0, -25.0 );
  111.   glTexCoord2f( 0.0, 1.0 );
  112.   glVertex3f( 200.0, 10.0, -25.0 );
  113.   glTexCoord2f( 1.0, 1.0 );
  114.   glVertex3f( 200.0, 10.0, 25.0 );
  115.   glTexCoord2f( 1.0, 0.0 );
  116.   glVertex3f( 200.0, 0.0, 25.0 );
  117.   glEnd();
  118.  
  119.   // 左侧面
  120.   glNormal3f( -1, 0, 0 );
  121.   glBegin( GL_QUADS );
  122.   glTexCoord2f( 0.0, 0.0 );
  123.   glVertex3f( -200.0, 10.0, -25.0 );
  124.   glTexCoord2f( 0.0, 1.0 );
  125.   glVertex3f( -200.0, 0.0, -25.0 );
  126.   glTexCoord2f( 1.0, 1.0 );
  127.   glVertex3f( -200.0, 0.0, 25.0 );
  128.   glTexCoord2f( 1.0, 0.0 );
  129.   glVertex3f( -200.0, 10.0, 25.0 );
  130.   glEnd();
  131.  
  132.   // 前侧面
  133.   glNormal3f( 0, 0, 1 );
  134.   glBegin( GL_QUADS );
  135.   glTexCoord2f( 0.0, 0.0 );
  136.   glVertex3f( -200.0, 10.0, 25.0 );
  137.   glTexCoord2f( 0.0, 1.0 );
  138.   glVertex3f( -200.0, 0.0, 25.0 );
  139.   glTexCoord2f( 1.0, 1.0 );
  140.   glVertex3f( 200.0, 0.0, 25.0 );
  141.   glTexCoord2f( 1.0, 0.0 );
  142.   glVertex3f( 200.0, 10.0, 25.0 );
  143.   glEnd();
  144.  
  145.   // 上侧面
  146.   glNormal3f( 0, 1, 0 );
  147.   glBegin( GL_QUADS );
  148.   glTexCoord2f( 0.0, 0.0 );
  149.   glVertex3f( -200.0, 10.0, -25.0 );
  150.   glTexCoord2f( 0.0, 1.0 );
  151.   glVertex3f( -200.0,10.0, 25.0 );
  152.   glTexCoord2f( 1.0, 1.0 );
  153.   glVertex3f( 200.0, 10.0, 25.0 );
  154.   glTexCoord2f( 1.0, 0.0 );
  155.   glVertex3f( 200.0, 10.0, -25.0 );
  156.   glEnd();
  157. // 下侧面
  158. glNormal3f( 0, -1, 0 );
  159. glBegin( GL_QUADS );
  160. glTexCoord2f( 0.0, 0.0 );
  161. glVertex3f( -200.0, 0.0, 25.0 );
  162. glTexCoord2f( 0.0, 1.0 );
  163. glVertex3f( -200.0, 0.0, -25.0 );
  164. glTexCoord2f( 1.0, 1.0 );
  165. glVertex3f( 200.0, 0.0, -25.0 );
  166. glTexCoord2f( 1.0, 0.0 );
  167. glVertex3f( 200.0, 0.0, 25.0 );
  168. glEnd();
  169. glEndList();
  170. f[1] = glGenLists(1);
  171. // 侧柱
  172. glNewList( f[1], GL_COMPILE );
  173. glEnable( GL_TEXTURE_2D );
  174. // 右侧面
  175. glNormal3f( 1, 0, 0 );
  176. glBegin( GL_QUADS );
  177. glTexCoord2f( 0.0, 0.0 );
  178. glVertex3f( 5.0, 250.0, 5.0 );
  179. glTexCoord2f( 0.0, 1.0 );
  180. glVertex3f( 5.0, 0.0, 5.0 );
  181. glTexCoord2f( 1.0, 1.0 );
  182. glVertex3f( 5.0, 0.0, -5.0 );
  183. glTexCoord2f( 1.0, 0.0 );
  184. glVertex3f( 5.0, 250.0, -5.0 );
  185. glEnd();
  186.   
  187.    // 左侧面
  188.    glNormal3f( -1, 0, 0 );
  189.    glBegin( GL_QUADS );
  190.    glTexCoord2f( 0.0, 0.0 );
  191.    glVertex3f( -5.0, 0.0, 5.0 );
  192.    glTexCoord2f( 0.0, 1.0 );
  193.    glVertex3f( -5.0, 250.0, 5.0 );
  194.    glTexCoord2f( 1.0, 1.0 );
  195.    glVertex3f( -5.0, 250.0, -5.0 );
  196.    glTexCoord2f( 1.0, 0.0 );
  197.    glVertex3f( -5.0, 0.0, -5.0 );
  198.    glEnd();
  199. // 前侧面
  200.   glNormal3f( 0, 0, 1 );
  201.   glBegin( GL_QUADS );
  202.   glTexCoord2f( 0.0, 0.0 );
  203.   glVertex3f( -5.0, 250.0, 5.0 );
  204.   glTexCoord2f( 0.0, 1.0 );
  205.   glVertex3f( -5.0, 0.0, 5.0 );
  206.   glTexCoord2f( 1.0, 1.0 );
  207.   glVertex3f( 5.0, 0.0, 5.0 );
  208.   glTexCoord2f( 1.0, 0.0 );
  209.   glVertex3f( 5.0, 250.0, 5.0 );
  210.   glEnd();
  211. // 后侧面
  212. glNormal3f( 0, 0, -1 );
  213. glBegin( GL_QUADS );
  214. glTexCoord2f( 0.0, 0.0 );
  215. glVertex3f( -5.0, 0.0, -5.0 );
  216. glTexCoord2f( 0.0, 1.0 );
  217. glVertex3f( -5.0, 250.0, -5.0 );
  218. glTexCoord2f( 1.0, 1.0 );
  219. glVertex3f( 5.0, 250.0, -5.0 );
  220. glTexCoord2f( 1.0, 0.0 );
  221. glVertex3f( 5.0, 0.0, -5.0 );
  222. glEnd();
  223. glEndList();
  224. f[2] = glGenLists(1);
  225. // 顶柱
  226. glNewList( f[2], GL_COMPILE );
  227. glEnable( GL_TEXTURE_2D );
  228. // 前侧面
  229.   glNormal3f( 0, 0, 1 );
  230.         glBegin( GL_QUADS );
  231.         glTexCoord2f( 0.0, 0.0 );
  232.         glVertex3f( 200.0, 0.0, 5.0 );
  233.         glTexCoord2f( 0.0, 1.0 );
  234.         glVertex3f( 200.0, 10.0, 5.0 );
  235.         glTexCoord2f( 1.0, 1.0 );
  236.         glVertex3f( -200.0, 10.0, 5.0 );
  237.         glTexCoord2f( 1.0, 0.0 );
  238.         glVertex3f( -200.0, 0.0, 5.0 );
  239.         glEnd();
  240.      
  241.         glNormal3f( 0, 0, -1 );
  242.         glBegin( GL_QUADS );
  243.          glTexCoord2f( 0.0, 0.0 );
  244.          glVertex3f( 200.0, 10.0, -5.0 );
  245.          glTexCoord2f( 0.0, 1.0 );
  246.          glVertex3f( 200.0, 0.0, -5.0 );
  247.          glTexCoord2f( 1.0, 1.0 );
  248.          glVertex3f( -200.0, 0.0, -5.0 );
  249.          glTexCoord2f( 1.0, 0.0 );
  250.          glVertex3f( -200.0, 10.0, -5.0 );
  251.         glEnd();
  252.       
  253.   glNormal3f( 0, -1, 0 );
  254.   glBegin( GL_QUADS );
  255.   glTexCoord2f( 0.0, 0.0 );
  256.   glVertex3f( 190.0, 0.0, -5.0 );
  257.   glTexCoord2f( 0.0, 1.0 );
  258.   glVertex3f( 190.0, 0.0, 5.0 );
  259.   glTexCoord2f( 1.0, 1.0 );
  260.   glVertex3f( -190.0, 0.0, 5.0 );
  261.   glTexCoord2f( 1.0, 0.0 );
  262.   glVertex3f( -190.0, 0.0, -5.0 );
  263.   glEnd();
  264.  
  265.   glNormal3f( 0, 1, 0 );
  266.   glBegin( GL_QUADS );
  267.   glTexCoord2f( 0.0, 0.0 );
  268.   glVertex3f( 200.0, 10.0, 5.0 );
  269.   glTexCoord2f( 0.0, 1.0 );
  270.   glVertex3f( 200.0, 10.0, -5.0 );
  271.   glTexCoord2f( 1.0, 1.0 );
  272.   glVertex3f( -200.0, 10.0, -5.0 );
  273.   glTexCoord2f( 1.0, 0.0 );
  274.   glVertex3f( -200.0, 10.0, 5.0 );
  275.   glEnd();
  276. glEndList();
  277. f[3] = glGenLists(1);
  278. glNewList( f[3], GL_COMPILE );
  279.   glPushMatrix();
  280. glDisable( GL_TEXTURE_2D );
  281. glRotatef( -82.67, 1, 0, 0 );
  282.   glColor3f( 1.0, 1.0, 1.0 );
  283.   cylinder = gluNewQuadric();
  284.   gluQuadricDrawStyle( cylinder, GLU_FILL );
  285. // gluQuadricNormals( cylinder, GL_SMOOTH );
  286.   gluCylinder( cylinder, 1, 1, 147, 5, 142 );
  287. glEnable( GL_TEXTURE_2D );
  288.   glPopMatrix();
  289. glPushMatrix();
  290. glDisable( GL_TEXTURE_2D );
  291. glRotatef( 262.67, 1, 0, 0 );
  292. glColor3f( 1.0, 1.0, 1.0 );
  293. cylinder = gluNewQuadric();
  294. gluQuadricDrawStyle( cylinder, GLU_FILL );
  295. gluCylinder( cylinder, 1, 1, 142, 5, 142 );
  296. glEnable( GL_TEXTURE_2D );
  297. glPopMatrix();
  298. glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 128.0 );
  299. glDisable( GL_TEXTURE_2D );
  300.   glColor3f( 1.0, 0, 0 );
  301. glutSolidSphere( 17, 50, 50 );
  302. glEnable( GL_TEXTURE_2D );
  303. glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 0 );
  304. glColor3f( 1.0, 1.0, 1.0 );
  305. glEndList();
  306. }
  307. void displayFcn( void )
  308. {
  309. glClear( GL_COLOR_BUFFER_BIT );
  310. glClear( GL_DEPTH_BUFFER_BIT );
  311.   glEnable( GL_LIGHT0 );
  312. glEnable( GL_TEXTURE_2D );
  313. glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 0.0 );
  314. // 底座
  315. glPushMatrix();
  316. glCallList( f[0] );
  317. glPopMatrix();
  318. // 侧柱
  319. glPushMatrix();
  320. glTranslatef( 195.0, 0.0, 20.0 );
  321. glCallList( f[1] );
  322. glPopMatrix();
  323. glPushMatrix();
  324. glTranslatef( 195.0, 0.0, -20.0 );
  325. glCallList( f[1] );
  326. glPopMatrix();
  327. glPushMatrix();
  328. glTranslatef( -195.0, 0.0, -20.0 );
  329. glCallList( f[1] );
  330. glPopMatrix();
  331. glPushMatrix();
  332. glTranslatef( -195.0, 0.0, 20.0 );
  333. glCallList( f[1] );
  334. glPopMatrix();
  335. // 顶柱
  336. glPushMatrix();
  337. glTranslatef( 0.0, 240.0, 20.0 );
  338.   glCallList( f[2] );
  339. glPopMatrix();
  340. glPushMatrix();
  341. glTranslatef( 0.0, 240.0, -20.0 );
  342. glCallList( f[2] );
  343. glPopMatrix();
  344. // 圆球
  345.    glPushMatrix();
  346.    glTranslatef( -17.0, 100.0, 0.0 );
  347.    glCallList( f[3] );
  348.    glPopMatrix();
  349.   
  350.      glPushMatrix();
  351.      glTranslatef( 17.0, 100.0, 0.0 );
  352.      glCallList( f[3] );
  353.      glPopMatrix();
  354.   
  355.    if ( rotTheta>=0 )
  356.    {
  357.    glPushMatrix();
  358.    glTranslatef( 51, 240, 0.0 );
  359.    glRotatef( rotTheta, 0, 0, 1 );
  360.    glTranslatef( 0, -140, 0 );
  361.    glCallList( f[3] );
  362.    glPopMatrix();
  363.   
  364.    glPushMatrix();
  365.    glTranslatef( -51, 100, 0.0 );
  366.    glCallList( f[3] );
  367.    glPopMatrix();
  368.    }
  369.   else
  370.   {
  371.   glPushMatrix();
  372.   glTranslatef( 51, 100, 0.0 );
  373.   glCallList( f[3] );
  374.   glPopMatrix();
  375.  
  376.   glPushMatrix();
  377.   glTranslatef( -51, 240, 0 );
  378.   glRotatef( rotTheta, 0, 0, 1 );
  379.   glTranslatef( 0, -140, 0 );
  380.   glCallList( f[3] );
  381.   glPopMatrix();
  382.   }
  383. glEnable( GL_LIGHT0 );
  384. glutSwapBuffers();
  385. glFlush();
  386. }
  387. void winReshapeFcn( GLint newWidth, GLint newHeight )
  388. {
  389. glViewport( 0, 0, newWidth, newHeight );
  390. winWidth = newWidth;
  391. winHeight = newHeight;
  392. glMatrixMode( GL_PROJECTION );
  393. glLoadIdentity();
  394. //  glFrustum( xwMin, xwMax, ywMin, ywMax, dnear, dfar );
  395. gluPerspective( angle, (float)winWidth / (float)winHeight, 1, 1000 );
  396. //  glOrtho( xwMin, xwMax, ywMin, ywMax, dnear, dfar );
  397. glMatrixMode( GL_MODELVIEW );
  398. glLoadIdentity();
  399. glTranslatef( 0, -100, -450 );
  400. glRotatef( yang, 0, 1, 0  );
  401. glClear( GL_COLOR_BUFFER_BIT );
  402. glClear( GL_DEPTH_BUFFER_BIT );
  403. }
  404. void play( void )
  405. {
  406. for ( long i=0; i<rotTheta * rotTheta * 20000; i++ );
  407. if ( state )
  408. {
  409. rotTheta -= 1;
  410. }
  411. else
  412. {
  413. rotTheta += 1;
  414. }
  415. if ( rotTheta > 30 )
  416. {
  417. state = 1;
  418. rotTheta = 29;
  419. }
  420. if ( rotTheta < -30 )
  421. {
  422. state = 0;
  423. rotTheta = -29;
  424. }
  425. glutPostRedisplay();
  426. }
  427. void specialKeyFcn( GLint specialKey, GLint xMouse, GLint yMouse )
  428. {
  429. if ( specialKey==GLUT_KEY_UP )
  430. {
  431. angle -= 1;
  432. if ( angle<10 )
  433. {
  434. angle = 10;
  435. }
  436. }
  437. if ( specialKey==GLUT_KEY_DOWN )
  438. {
  439. angle += 1;
  440. if ( angle > 170 )
  441. {
  442. angle = 170;
  443. }
  444. }
  445. if ( specialKey==GLUT_KEY_LEFT )
  446. {
  447. yang -=1;
  448. if ( yang<0 )
  449. {
  450.   yang += 360;
  451. }
  452. }
  453. if ( specialKey==GLUT_KEY_RIGHT )
  454. {
  455. yang += 1;
  456. if ( yang > 360 )
  457. {
  458.   yang += 360;
  459. }
  460. }
  461. glMatrixMode( GL_PROJECTION );
  462. glLoadIdentity();
  463. gluPerspective( angle, (float)winWidth / (float)winHeight, 1, 1000 );
  464. glMatrixMode( GL_MODELVIEW );
  465. glLoadIdentity();
  466. glTranslatef( 0, -100, -450 );
  467. glRotatef( yang, 0, 1, 0 );
  468. glClear( GL_COLOR_BUFFER_BIT );
  469. glClear( GL_DEPTH_BUFFER_BIT );
  470. glutIdleFunc( play );
  471. }
  472. int _tmain(int argc, _TCHAR* argv[])
  473. {
  474. glutInit( &argc, argv );
  475. glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
  476. glutInitWindowPosition( 100, 100 );
  477. glutInitWindowSize( winWidth, winHeight );
  478. glutCreateWindow( "ex4" );
  479. init();
  480. glutDisplayFunc( displayFcn );
  481. glutReshapeFunc( winReshapeFcn );
  482. //  glutMouseFunc( play );
  483. glutIdleFunc( play );
  484. glutSpecialFunc(  specialKeyFcn );
  485. glutMainLoop();
  486. return 0;
  487. }