Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 23rd, 2012  |  syntax: None  |  size: 7.58 KB  |  hits: 15  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /*
  2.   Lampe
  3.   Kai Poeritz
  4.   s0526572
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <GL/glut.h>
  9.  
  10. #include "glm.h" // fuer .obj model
  11. #include "gltx.h" // fuer texture
  12.  
  13.  
  14. int window;
  15.  
  16. GLfloat rot_steps = 2.5f;
  17. GLfloat joint_1_steps = 2.0f;
  18. GLfloat joint_2_steps = 2.0f;
  19.  
  20. GLfloat distance = -8.0f;
  21. GLfloat rot_x    = 0.0f;
  22. GLfloat rot_y    = 0.0f;
  23.  
  24. GLfloat angle_1 = 35.0f;
  25. GLfloat angle_2 = 55.0f;
  26.  
  27. GLMmodel  *model = 0;
  28. GLTXimage *image = 0;
  29.  
  30. GLuint textures; // handler fuer texture
  31.  
  32. GLUquadric *base, *joint_1, *joint_2; // objekte, durch GLU definiert
  33.  
  34. // Lighting
  35. GLfloat light_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };
  36. GLfloat light_1_color[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  37. GLfloat light_1_pos[]   = { 0.0f, 1.0f, 0.0f, 0.0f};
  38.  
  39. // Material
  40. GLfloat mat_spec[]      = { 1.0f, 1.0f, 1.0f, 1.0f };
  41. GLfloat mat_shin[]      = { 70.0f };
  42.  
  43.  
  44. void draw_arm(void){
  45.   glBegin(GL_QUADS);
  46.  
  47.   // hintere Seite
  48.   glNormal3f( 0.0f, 0.0f, -1.0f);
  49.   glVertex3f(-0.05f, 0.0f, 0.0f);
  50.   glVertex3f( 0.05f, 0.0f, 0.0f);
  51.   glVertex3f( 0.05f, 1.5f, 0.0f);
  52.   glVertex3f(-0.05f, 1.5f, 0.0f);
  53.  
  54.   // vordere Seite
  55.   glNormal3f( 0.0f, 0.0f,  1.0f);
  56.   glVertex3f(-0.05f, 0.0f, 0.20f);
  57.   glVertex3f( 0.05f, 0.0f, 0.20f);
  58.   glVertex3f( 0.05f, 1.5f, 0.20f);
  59.   glVertex3f(-0.05f, 1.5f, 0.20f);
  60.  
  61.   // rechte Seite
  62.   glNormal3f( 1.0f, 0.0f, 0.0f);
  63.   glVertex3f( 0.05f, 0.0f, 0.0f);
  64.   glVertex3f( 0.05f, 0.0f, 0.2f);
  65.   glVertex3f( 0.05f, 1.5f, 0.2f);
  66.   glVertex3f( 0.05f, 1.5f, 0.0f);
  67.  
  68.   // linke Seite
  69.   glNormal3f(-1.0f, 0.0f, 0.0f);
  70.   glVertex3f(-0.05f, 0.0f, 0.0f);
  71.   glVertex3f(-0.05f, 0.0f, 0.2f);
  72.   glVertex3f(-0.05f, 1.5f, 0.2f);
  73.   glVertex3f(-0.05f, 1.5f, 0.0f);
  74.  
  75.   // ende des armes
  76.   glNormal3f(-1.0f,0.0f, 0.0f);
  77.   glVertex3f(-0.05f, 1.5f, 0.2f);
  78.   glVertex3f(-0.05f, 1.5f, 0.0f);
  79.   glVertex3f( 0.05f, 1.5f, 0.0f);
  80.   glVertex3f( 0.05f, 1.5f, 0.2f);
  81.  
  82.   glEnd();
  83. }
  84.  
  85. void draw_joint(GLUquadric *joint){
  86.   glTranslatef( 0.0f, 0.0f, 0.1f); // gelenk zentrieren
  87.   gluSphere(joint, 0.2, 100, 100); // kugel malen
  88.   glTranslatef( 0.0f, 0.0f,-0.1f); // zurueck
  89. }
  90.  
  91. void draw() {
  92.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // sauber machen
  93.   glMatrixMode(GL_MODELVIEW); // beginne zu modellieren
  94.   glLoadIdentity(); // setzen der kamera
  95.  
  96.   glTranslatef( 0.0f, -2.0f, distance); // versetzt die szene nach unten fuer besseren blick + handle der distance
  97.   glRotatef(rot_x, 1.0f, 0.0f, 0.0f);
  98.   glRotatef(rot_y, 0.0f, 1.0f, 0.0f);
  99.  
  100.   glPushMatrix(); // speichern der aktuellen position
  101.  
  102.   glTranslatef( 0.0f, 0.0f,0.1f); // zurueck zur mitte
  103.   gluSphere(base,0.5f, 100,100); // male kreis
  104.   glTranslatef( 0.0f, 0.0f,-0.1f); // zurueck, vor dem Kreis zeichnen
  105.  
  106.   glBegin(GL_QUADS); // malen der tischplatte
  107.   glNormal3f(-1.0f,1.0f, 0.0f );
  108.   glVertex3f(-4.0f, 0.0f, 4.0f);
  109.   glNormal3f( 1.0f,1.0f, 0.0f);
  110.   glVertex3f( 4.0f, 0.0f, 4.0f);
  111.   glNormal3f( 1.0f,1.0f, 0.0f);
  112.   glVertex3f( 4.0f, 0.0f,-4.0f);
  113.   glNormal3f(-1.0f,1.0f, 0.0f);
  114.   glVertex3f(-4.0f, 0.0f,-4.0f);
  115.  
  116.   glEnd();
  117.  
  118.   draw_arm();
  119.   glTranslatef( 0.0f, 1.6f, 0.0f);
  120.   glRotatef(angle_1, 0.0f, 0.0f, 1.0f);
  121.  
  122.   draw_arm();
  123.   draw_joint(joint_1);
  124.   glTranslatef( 0.0f, 1.6f, 0.0f);
  125.   glRotatef(angle_2, 0.0f, 0.0f, 1.0f);
  126.  
  127.   draw_arm();
  128.   draw_joint(joint_2);
  129.   glTranslatef( -0.5f, 1.5f, 0.0f); // gehe zur Lichtposition
  130.  
  131.   // light osition - initialisieren
  132.   glLightfv(GL_LIGHT0, GL_DIFFUSE, light_1_color);
  133.   glLightfv(GL_LIGHT0, GL_POSITION,light_1_pos);
  134.  
  135.   glPopMatrix(); // zurueck zur position auf der tischplatte (setzt auch alle drehungen zurueck)
  136.   glTranslatef(2.5f, 1.0f, 0.0f); // hoehe des hauses
  137.   glEnable(GL_TEXTURE_2D); // hier soll texture sein
  138.   glBindTexture(GL_TEXTURE_2D, textures); // welche texture
  139.   glmDraw(model, GLM_SMOOTH | GLM_TEXTURE); // male objekt "model" mit textur und schatten
  140.   glDisable(GL_TEXTURE_2D); // ausschalten
  141.  
  142.   glutSwapBuffers(); // male, leg los!!!
  143. }
  144.  
  145. // wenn fenster groesse enderung dann reshape all
  146. void reshape(int width, int height) {
  147.   if(height==0)
  148.   height=1;
  149.  
  150.   glViewport(0,0,width,height);
  151.  
  152.   glMatrixMode(GL_PROJECTION);
  153.   glLoadIdentity();
  154.   gluPerspective(45.0f, (GLfloat)width /(GLfloat)height, 1.0f, 300.0f);
  155.   glMatrixMode(GL_MODELVIEW);
  156. }
  157.  
  158. void keyboard(unsigned char key, int x, int y) {
  159.   switch (key){
  160.   case 27:  // Escape
  161.     glutDestroyWindow(window);
  162.     break;
  163.  
  164.   //  drehen der welt
  165.   case 119: // w
  166.     if( rot_x < 360)
  167.       rot_x += rot_steps;
  168.     else
  169.       rot_x = 0.0f;
  170.     break;
  171.   case 97:  //# a
  172.     if( rot_y > 0)
  173.       rot_y -= rot_steps;
  174.     else
  175.       rot_y = 360.0f;
  176.     break;
  177.   case 115: // s
  178.     if( rot_x > 0)
  179.       rot_x -= rot_steps;
  180.     else
  181.       rot_x = 360.0f;
  182.     break;
  183.   case 100: // d
  184.     if ( rot_y < 360)
  185.       rot_y += rot_steps;
  186.     else
  187.       rot_y = 0.0f;
  188.     break;
  189.  
  190.   //  distanz aendern
  191.   case 43:  // +
  192.     distance += 1.0f;
  193.     break;
  194.   case 45:  // -
  195.     distance -= 1.0f;
  196.     break;
  197.   case 114:   //  reset
  198.     distance = -8.0f;
  199.     rot_x = 0.0f;
  200.     rot_y = 0.0f;
  201.     break;
  202.  
  203.   //  arm bewegung
  204.   case 106:  // j
  205.     if ( angle_1 < 80 )
  206.       angle_1 += joint_1_steps;
  207.     else
  208.       angle_1 = 80.0f;
  209.     break;
  210.   case 107:  // k
  211.     if ( angle_1 > 0 )
  212.       angle_1 -= joint_1_steps;
  213.     else
  214.       angle_1 = 0.0f;
  215.     break;
  216.   case 108:  // l
  217.     if ( angle_2 < 80)
  218.       angle_2 += joint_2_steps;
  219.     else
  220.       angle_2 = 80.0f;
  221.     break;
  222.   case 246:  // oe
  223.     if ( angle_2 > 0)
  224.       angle_2 -= joint_2_steps;
  225.     else
  226.       angle_2 = 0.0f;
  227.     break;
  228.   }
  229. }
  230.  
  231. void init (int width, int height) {
  232.   glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // schwarzer hintergrung
  233.   glClearDepth(1.0f); // woodoo
  234.   glDepthFunc(GL_LESS); // wie wird verdeckt
  235.   glEnable(GL_DEPTH_TEST); // verdecken aktiv
  236.   glEnable(GL_NORMALIZE); // wenn normalen genutzt werden, mache sie laenge 1
  237.   //glEnable(GL_COLOR_MATERIAL); // farbe auf material aktivieren
  238.   glEnable(GL_LIGHTING);
  239.   glEnable(GL_LIGHT0);
  240.   glShadeModel(GL_SMOOTH); // weiche schatten
  241.   reshape(width,height); // viewpoint setzen
  242.  
  243.   base = gluNewQuadric();
  244.   joint_1 = gluNewQuadric();
  245.   joint_2 = gluNewQuadric();
  246.  
  247.   glMatrixMode(GL_MODELVIEW); // zeichne licht
  248.   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_ambient);
  249.  
  250.   model = glmReadOBJ("haus.obj");
  251.   image = gltxReadRGB("haus.rgb");
  252.  
  253.   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  254.  
  255.   glGenTextures(1, &textures); // generiere eine textur mit dem handler textures (das ist die erste)
  256.   glBindTexture(GL_TEXTURE_2D, textures);
  257.  
  258.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  259.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  260.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  261.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  262.  
  263.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->width, image->height, 0, GL_RGB, GL_UNSIGNED_BYTE, image->data ); // erstenn ldr zextur aus dem bild
  264.  
  265.   glMaterialfv(GL_FRONT, GL_SPECULAR, mat_spec); // setzt material
  266.   glMaterialfv(GL_FRONT, GL_SHININESS, mat_shin); // setzt reflektion
  267. }
  268.  
  269. void update(int value) {
  270.   glutPostRedisplay();
  271.   glutTimerFunc(25,update,0); // bild refresh alle 25 ms
  272. }
  273.  
  274. int main(int argc, char *argv[])
  275. {
  276.   glutInit(&argc,argv);
  277.   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
  278.   glutInitWindowSize(640,480);
  279.   glutInitWindowPosition(0,0);
  280.   window = glutCreateWindow("Lampe, Navigation über [w,s,a,d,+,-,j.k.l.ö]");
  281.  
  282.   glutDisplayFunc(&draw);
  283.   glutReshapeFunc(&reshape);
  284.   glutKeyboardFunc(&keyboard);
  285.  
  286.   update(0);
  287.   init(640,480);
  288.  
  289.   glutMainLoop();
  290.   return 0;
  291. }