sixviews.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:6k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1998.  */
  2. /* This program is freely distributable without licensing fees
  3.    and is provided without guarantee or warrantee expressed or
  4.    implied. This program is -not- in the public domain. */
  5. /* cubeview.c - shows 6 cube face views and eye view */
  6. #include <math.h>
  7. #include <stdio.h>
  8. #include <GL/glut.h>
  9. GLfloat up[3] = { 0, 1, 0 };
  10. GLfloat eye[3] = { 0, 0, -20 };
  11. GLfloat obj[3] = { 0, 0, 0 };
  12. static int W, H, w3, h3;
  13. int angle = 0;
  14. int downx, downy;
  15. void
  16. reshape(int w, int h)
  17. {
  18. W = w;
  19. H = h;
  20. w3 = W/3;
  21. h3 = H/3;
  22. }
  23. void
  24. drawView(int drawCenterObject)
  25. {
  26. /* right green small cube (+5,0,-8) */
  27. glPushMatrix();
  28.   glTranslatef(5.0, 0.0, -8.0);
  29.   glRotatef(-45, 1.0, 0.0, 1.0);
  30.   glColor3f(0.0, 1.0, 0.0);
  31.   glutSolidCube(2.0);
  32. glPopMatrix();
  33. /* left red cube (-5,0,-8) */
  34. glPushMatrix();
  35.   glTranslatef(-5.0, 0.0, -8.0);
  36.   glRotatef(45, 1.0, 0.0, 1.0);
  37.   glColor3f(1.0, 0.0, 0.0);
  38.   glutSolidCube(6.0);
  39. glPopMatrix();
  40. /* left blue cube (-7,0,0); */
  41. glPushMatrix();
  42.   glTranslatef(-7.0, 0.0, 0.0);
  43.   glColor3f(0.0, 0.0, 1.0);
  44.   glutSolidCube(5.0);
  45. glPopMatrix();
  46. /* right cyan big cube (+7,0,0) */
  47. glPushMatrix();
  48.   glTranslatef(7.0, 0.0, 0.0);
  49.   glRotatef(30, 1.0, 1.0, 0.0);
  50.   glColor3f(0.0, 1.0, 1.0);
  51.   glutSolidCube(5.0);
  52. glPopMatrix();
  53. /* distant yellow sphere (0,0,+10) */
  54. glPushMatrix();
  55.   glTranslatef(0.0, 0.0, 10.0);
  56.   glColor3f(1.0, 1.0, 0.0);
  57.   glutSolidSphere(7.0, 8, 8);
  58. glPopMatrix();
  59. /* top white sphere (0,+5,0) */
  60. glPushMatrix();
  61.   glTranslatef(0.0, 5.0, 0.0);
  62.   glColor3f(1.0, 1.0, 1.0);
  63.   glutSolidSphere(2.0, 8, 8);
  64. glPopMatrix();
  65. /* bottom magenta big sphere (0,-6,0) */
  66. glPushMatrix();
  67.   glTranslatef(0.0, -6.0, 0.0);
  68.   glColor3f(1.0, 0.0, 1.0);
  69.   glutSolidSphere(4.0, 8, 8);
  70. glPopMatrix();
  71. if (drawCenterObject) {
  72. glPushMatrix();
  73. glScalef(3.0, 3.0, 3.0);
  74. glColor3f(1.0, 1.0, 1.0);
  75. glutSolidIcosahedron();
  76. glPopMatrix();
  77. }
  78. }
  79. void
  80. setViewArea(GLint x, GLint y, GLsizei w, GLsizei h)
  81. {
  82.     glViewport(x, y, w, h);
  83. glScissor(x, y, w, h);
  84. }
  85. void
  86. positionLights(void)
  87. {
  88. static GLfloat light1Pos[4] = { -41.0, 41.0, -41.0, 1.0 };
  89. static GLfloat light2Pos[4] = { +41.0, 0.0, -41.0, 1.0 };
  90. static GLfloat light3Pos[4] = { -41.0, 0.0, +41.0, 1.0 };
  91. static GLfloat light4Pos[4] = { +41.0, 0.0, +41.0, 1.0 };
  92. glLightfv(GL_LIGHT0, GL_POSITION, light1Pos);
  93. glLightfv(GL_LIGHT1, GL_POSITION, light2Pos);
  94. glLightfv(GL_LIGHT2, GL_POSITION, light3Pos);
  95. glLightfv(GL_LIGHT3, GL_POSITION, light4Pos);
  96. }
  97. struct {
  98. GLfloat angle;
  99. GLfloat x, y, z;
  100. } faceInfo[6] = {
  101. {   0.0, +1.0,  0.0,  0.0 },  /* front */
  102. {  90.0, -1.0,  0.0,  0.0 },  /* top */
  103. {  90.0, +1.0,  0.0,  0.0 },  /* bottom */
  104. {  90.0,  0.0, -1.0,  0.0 },  /* left */
  105. {  90.0,  0.0, +1.0,  0.0 },  /* right */
  106. { 180.0, -1.0,  0.0,  0.0 }   /* back */
  107. };
  108. void
  109. configFace(int i)
  110. {
  111. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  112. glMatrixMode(GL_MODELVIEW);
  113. glLoadIdentity();
  114. glRotatef(faceInfo[i].angle,
  115. faceInfo[i].x, faceInfo[i].y, faceInfo[i].z);
  116. gluLookAt(obj[0], obj[1], obj[2],  /* "eye" at object */
  117.       eye[0], eye[1], eye[2],  /* looking at eye */
  118.   up[0], up[1], up[2]);
  119. positionLights();
  120. }
  121. void
  122. display(void)
  123. {
  124. /* initial clear */
  125. glViewport(0, 0, W, H);
  126. glClearColor(0.5, 0.5, 0.5, 0.5);  /* clear to gray */
  127. glDisable(GL_SCISSOR_TEST);
  128. glClear(GL_COLOR_BUFFER_BIT);
  129. glEnable(GL_SCISSOR_TEST);
  130. glClearColor(0.0, 0.0, 0.0, 0.0);
  131. /* eye view (bottom right) */
  132. setViewArea(2*w3+4, 4, w3 - 8, h3 - 8);
  133. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  134. glMatrixMode(GL_PROJECTION);
  135. glLoadIdentity();
  136. gluPerspective(60.0, 1.0, 0.5, 40.0);
  137. glMatrixMode(GL_MODELVIEW);
  138. glLoadIdentity();
  139. gluLookAt(eye[0], eye[1], eye[2],  /* eye at eye */
  140.       obj[0], obj[1], obj[2],  /* looking at object */
  141.   up[0], up[1], up[2]);
  142. positionLights();
  143. drawView(1);
  144. /* six views from object... */
  145. /* Projection has 90 degree field of view (6 make a cube). */
  146. glMatrixMode(GL_PROJECTION);
  147. glLoadIdentity();
  148. gluPerspective(90.0, 1.0, 0.5, 40.0);
  149. /* front view (center) */
  150. setViewArea(w3, h3, w3, h3);
  151. configFace(0);
  152. drawView(0);
  153. /* top view */
  154. setViewArea(w3, 2*h3, w3, h3);
  155. configFace(1);
  156. drawView(0);
  157. /* bottom view */
  158. setViewArea(w3, 0, w3, h3);
  159. configFace(2);
  160. drawView(0);
  161. /* left view */
  162. setViewArea(0, h3, w3, h3);
  163. configFace(3);
  164. drawView(0);
  165. /* right view */
  166. setViewArea(2*w3, h3, w3, h3);
  167. configFace(4);
  168. drawView(0);
  169. /* back view (top left) */
  170. setViewArea(4, 2*h3 + 4, w3 - 8, h3 - 8);
  171. configFace(5);
  172. drawView(0);
  173. glutSwapBuffers();
  174. }
  175. void
  176. menu(int value)
  177. {
  178. switch (value) {
  179. case 1:
  180. glEnable(GL_LIGHTING);
  181. printf("enablen");
  182. break;
  183. case 2:
  184. glDisable(GL_LIGHTING);
  185. printf("disablen");
  186. break;
  187. }
  188. glutPostRedisplay();
  189. }
  190. void
  191. motion(int x, int y)
  192. {
  193. /* Pretty weak viewing model.  Eye gets located */
  194. /* on cylinder on the out skirts of the scene. */
  195. angle += (x - downx);
  196. angle = angle % 360;
  197. eye[0] = sin(angle * 3.14159/180.0) * -20;
  198. eye[2] = cos(angle * 3.14159/180.0) * -20;
  199. eye[1] = eye[1] + 0.1 * (y - downy);
  200. if (eye[1] > +15) eye[1] = +15;
  201. if (eye[1] < -15) eye[1] = -15;
  202. glutPostRedisplay();
  203. downx = x;
  204. downy = y;
  205. }
  206. void
  207. mouse(int button, int state, int x, int y)
  208. {
  209. if (button == GLUT_LEFT_BUTTON) {
  210. if (state == GLUT_DOWN) {
  211. downx = x;
  212. downy = y;
  213. }
  214. }
  215. }
  216. void
  217. initGraphicsState(void)
  218. {
  219.     GLfloat lightColor[4] = { 0.6, 0.6, 0.6, 1.0 };  /* white */
  220. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
  221. glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
  222. glLightfv(GL_LIGHT1, GL_DIFFUSE, lightColor);
  223. glLightfv(GL_LIGHT2, GL_DIFFUSE, lightColor);
  224. glLightfv(GL_LIGHT3, GL_DIFFUSE, lightColor);
  225. glEnable(GL_LIGHTING);
  226. glEnable(GL_LIGHT0);
  227. glEnable(GL_LIGHT1);
  228. glEnable(GL_LIGHT2);
  229. glEnable(GL_LIGHT3);
  230. glEnable(GL_DEPTH_TEST);
  231. glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
  232. glEnable(GL_COLOR_MATERIAL);
  233. glEnable(GL_NORMALIZE);
  234. }
  235. int
  236. main(int argc, char **argv)
  237. {
  238. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  239. glutCreateWindow("sixviews");
  240. glutDisplayFunc(display);
  241. glutReshapeFunc(reshape);
  242. initGraphicsState();
  243. glutCreateMenu(menu);
  244. glutAddMenuEntry("light on", 1);
  245. glutAddMenuEntry("light off", 2);
  246. glutAttachMenu(GLUT_RIGHT_BUTTON);
  247. glutMouseFunc(mouse);
  248. glutMotionFunc(motion);
  249. glutMainLoop();
  250. return 0;
  251. }