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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  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. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <math.h>
  8. #include <GL/gl.h>
  9. #include <GL/glu.h>
  10. #include <GL/glut.h>
  11. #include <Inventor/SoDB.h>
  12. #include <Inventor/nodes/SoComplexity.h>
  13. #include <Inventor/nodes/SoFont.h>
  14. #include <Inventor/nodes/SoGroup.h>
  15. #include <Inventor/nodes/SoSeparator.h>
  16. #include <Inventor/nodes/SoSphere.h>
  17. #include <Inventor/nodes/SoText2.h>
  18. #include <Inventor/nodes/SoTexture2.h>
  19. #include <Inventor/nodes/SoTranslation.h>
  20. #include <Inventor/nodes/SoTexture2Transform.h>
  21. #include <Inventor/SoInput.h>
  22. #include <Inventor/SbViewportRegion.h>
  23. #include <Inventor/nodes/SoSeparator.h>
  24. #include <Inventor/actions/SoGLRenderAction.h>
  25. #include <Inventor/nodes/SoCylinder.h>
  26. #include <Inventor/nodes/SoDirectionalLight.h>
  27. #include <Inventor/nodes/SoEventCallback.h>
  28. #include <Inventor/nodes/SoMaterial.h>
  29. #include <Inventor/nodes/SoPerspectiveCamera.h>
  30. #include <Inventor/nodes/SoRotationXYZ.h>
  31. #include <Inventor/nodes/SoTransform.h>
  32. #include <Inventor/nodes/SoTranslation.h>
  33. /* Some <math.h> files do not define M_PI... */
  34. #ifndef M_PI
  35. #define M_PI 3.14159265358979323846
  36. #endif
  37. int W = 300, H = 300;
  38. int spinning = 0;
  39. GLubyte *image = NULL;
  40. SoSeparator *root;
  41. SoRotationXYZ *globeSpin;
  42. float angle = 0.0;
  43. int moving  = 0;
  44. int begin;
  45. void
  46. reshape(int w, int h)
  47. {
  48.   glViewport(0, 0, w, h);
  49.   W = w;
  50.   H = h;
  51.   if (image)
  52.     free(image);
  53.   image = (GLubyte *) malloc(W * H * 3);
  54. }
  55. void
  56. renderScene(void)
  57. {
  58.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  59.   SbViewportRegion myViewport(W, H);
  60.   SoGLRenderAction myRenderAction(myViewport);
  61.   myRenderAction.apply(root);
  62. }
  63. void
  64. redraw(void)
  65. {
  66.   renderScene();
  67.   glutSwapBuffers();
  68. }
  69. void
  70. globeScene(void)
  71. {
  72.    root = new SoSeparator;
  73.    root->ref();
  74.    // Add a camera and light
  75.    SoPerspectiveCamera *myCamera = new SoPerspectiveCamera;
  76.    myCamera->position.setValue(0., 0., 2.2);
  77.    myCamera->heightAngle = M_PI/2.5; 
  78.    myCamera->nearDistance = 0.5;
  79.    myCamera->farDistance = 10.0;
  80.    root->addChild(myCamera);
  81.    root->addChild(new SoDirectionalLight);
  82.    SoRotationXYZ *globalRotXYZ = new SoRotationXYZ;
  83.    globalRotXYZ->axis = SoRotationXYZ::X;
  84.    globalRotXYZ->angle = M_PI/9;
  85.    root->addChild(globalRotXYZ);
  86.    // Set up the globe transformations
  87.    globeSpin = new SoRotationXYZ;
  88.    root->addChild(globeSpin);
  89.    globeSpin->angle = angle;
  90.    globeSpin->axis = SoRotationXYZ::Y;  // rotate about Y axis
  91.    // Add the globe, a sphere with a texture map.
  92.    // Put it within a separator.
  93.    SoSeparator *sphereSep = new SoSeparator;
  94.    SoTexture2  *myTexture2 = new SoTexture2;
  95.    SoComplexity *sphereComplexity = new SoComplexity;
  96.    sphereComplexity->value = 0.55;
  97.    root->addChild(sphereSep);
  98.    sphereSep->addChild(myTexture2);
  99.    sphereSep->addChild(sphereComplexity);
  100.    sphereSep->addChild(new SoSphere);
  101.    myTexture2->filename = "globe.rgb";
  102. }
  103. void
  104. updateModels(void)
  105. {
  106.   globeSpin->angle = angle;
  107.   glutPostRedisplay();
  108. }
  109. void
  110. animate(void)
  111. {
  112.   angle += 0.1;
  113.   updateModels();
  114. }
  115. void
  116. setAnimation(int enable)
  117. {
  118.   if(enable) {
  119.     spinning = 1;
  120.     glutIdleFunc(animate);
  121.   } else {
  122.     spinning = 0;
  123.     glutIdleFunc(NULL);
  124.     glutPostRedisplay();
  125.   }
  126. }
  127. /* ARGSUSED */
  128. void
  129. keyboard(unsigned char ch, int x, int y)
  130. {
  131.   if(ch == ' ') {
  132.     setAnimation(0);
  133.     animate();
  134.   }
  135. }
  136. void
  137. menuSelect(int item)
  138. {
  139.    switch(item) {
  140.    case 1:
  141.      animate();
  142.      break;
  143.    case 2:
  144.       if(!spinning) {
  145.             setAnimation(1);
  146.        } else {
  147.             setAnimation(0);
  148.        }
  149.       break;
  150.    }
  151. }
  152. void
  153. vis(int visible)
  154. {
  155.   if (visible == GLUT_VISIBLE) {
  156.     if (spinning)
  157.       glutIdleFunc(animate);
  158.   } else {
  159.     if (spinning)
  160.       glutIdleFunc(NULL);
  161.   }
  162. }
  163. /* ARGSUSED */
  164. void
  165. mouse(int button, int state, int x, int y)
  166. {
  167.   if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  168.     setAnimation(0);
  169.     moving = 1;
  170.     begin = x;
  171.   }
  172.   if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
  173.     moving = 0;
  174.     glutPostRedisplay();
  175.   }
  176. }
  177. /* ARGSUSED */
  178. void
  179. motion(int x, int y)
  180. {
  181.   if (moving) {
  182.     angle = angle + .01 * (x - begin);
  183.     begin = x;
  184.     updateModels();
  185.   }
  186. }
  187. int
  188. main(int argc, char **argv)
  189. {
  190.   glutInit(&argc, argv);
  191.   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
  192.   SoDB::init();
  193.   globeScene();
  194.   glutInitWindowSize(W, H);
  195.   glutCreateWindow("As the world turns");
  196.   glutDisplayFunc(redraw);
  197.   glutReshapeFunc(reshape);
  198.   glutCreateMenu(menuSelect);
  199.   glutAddMenuEntry("Step", 1);
  200.   glutAddMenuEntry("Toggle spinning", 2);
  201.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  202.   glutKeyboardFunc(keyboard);
  203.   glutMouseFunc(mouse);
  204.   glutMotionFunc(motion);
  205.   glutVisibilityFunc(vis);
  206.   /* Enable depth testing for Open Inventor. */
  207.   glEnable(GL_DEPTH_TEST);
  208.   glutMainLoop();
  209.   return 0;             /* ANSI C requires main to return int. */
  210. }