- /*
- Lampe
- Kai Poeritz
- s0526572
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <GL/glut.h>
- #include "glm.h" // fuer .obj model
- #include "gltx.h" // fuer texture
- int window;
- GLfloat rot_steps = 2.5f;
- GLfloat joint_1_steps = 2.0f;
- GLfloat joint_2_steps = 2.0f;
- GLfloat distance = -8.0f;
- GLfloat rot_x = 0.0f;
- GLfloat rot_y = 0.0f;
- GLfloat angle_1 = 35.0f;
- GLfloat angle_2 = 55.0f;
- GLMmodel *model = 0;
- GLTXimage *image = 0;
- GLuint textures; // handler fuer texture
- GLUquadric *base, *joint_1, *joint_2; // objekte, durch GLU definiert
- // Lighting
- GLfloat light_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };
- GLfloat light_1_color[] = { 1.0f, 1.0f, 1.0f, 1.0f };
- GLfloat light_1_pos[] = { 0.0f, 1.0f, 0.0f, 0.0f};
- // Material
- GLfloat mat_spec[] = { 1.0f, 1.0f, 1.0f, 1.0f };
- GLfloat mat_shin[] = { 70.0f };
- void draw_arm(void){
- glBegin(GL_QUADS);
- // hintere Seite
- glNormal3f( 0.0f, 0.0f, -1.0f);
- glVertex3f(-0.05f, 0.0f, 0.0f);
- glVertex3f( 0.05f, 0.0f, 0.0f);
- glVertex3f( 0.05f, 1.5f, 0.0f);
- glVertex3f(-0.05f, 1.5f, 0.0f);
- // vordere Seite
- glNormal3f( 0.0f, 0.0f, 1.0f);
- glVertex3f(-0.05f, 0.0f, 0.20f);
- glVertex3f( 0.05f, 0.0f, 0.20f);
- glVertex3f( 0.05f, 1.5f, 0.20f);
- glVertex3f(-0.05f, 1.5f, 0.20f);
- // rechte Seite
- glNormal3f( 1.0f, 0.0f, 0.0f);
- glVertex3f( 0.05f, 0.0f, 0.0f);
- glVertex3f( 0.05f, 0.0f, 0.2f);
- glVertex3f( 0.05f, 1.5f, 0.2f);
- glVertex3f( 0.05f, 1.5f, 0.0f);
- // linke Seite
- glNormal3f(-1.0f, 0.0f, 0.0f);
- glVertex3f(-0.05f, 0.0f, 0.0f);
- glVertex3f(-0.05f, 0.0f, 0.2f);
- glVertex3f(-0.05f, 1.5f, 0.2f);
- glVertex3f(-0.05f, 1.5f, 0.0f);
- // ende des armes
- glNormal3f(-1.0f,0.0f, 0.0f);
- glVertex3f(-0.05f, 1.5f, 0.2f);
- glVertex3f(-0.05f, 1.5f, 0.0f);
- glVertex3f( 0.05f, 1.5f, 0.0f);
- glVertex3f( 0.05f, 1.5f, 0.2f);
- glEnd();
- }
- void draw_joint(GLUquadric *joint){
- glTranslatef( 0.0f, 0.0f, 0.1f); // gelenk zentrieren
- gluSphere(joint, 0.2, 100, 100); // kugel malen
- glTranslatef( 0.0f, 0.0f,-0.1f); // zurueck
- }
- void draw() {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // sauber machen
- glMatrixMode(GL_MODELVIEW); // beginne zu modellieren
- glLoadIdentity(); // setzen der kamera
- glTranslatef( 0.0f, -2.0f, distance); // versetzt die szene nach unten fuer besseren blick + handle der distance
- glRotatef(rot_x, 1.0f, 0.0f, 0.0f);
- glRotatef(rot_y, 0.0f, 1.0f, 0.0f);
- glPushMatrix(); // speichern der aktuellen position
- glTranslatef( 0.0f, 0.0f,0.1f); // zurueck zur mitte
- gluSphere(base,0.5f, 100,100); // male kreis
- glTranslatef( 0.0f, 0.0f,-0.1f); // zurueck, vor dem Kreis zeichnen
- glBegin(GL_QUADS); // malen der tischplatte
- glNormal3f(-1.0f,1.0f, 0.0f );
- glVertex3f(-4.0f, 0.0f, 4.0f);
- glNormal3f( 1.0f,1.0f, 0.0f);
- glVertex3f( 4.0f, 0.0f, 4.0f);
- glNormal3f( 1.0f,1.0f, 0.0f);
- glVertex3f( 4.0f, 0.0f,-4.0f);
- glNormal3f(-1.0f,1.0f, 0.0f);
- glVertex3f(-4.0f, 0.0f,-4.0f);
- glEnd();
- draw_arm();
- glTranslatef( 0.0f, 1.6f, 0.0f);
- glRotatef(angle_1, 0.0f, 0.0f, 1.0f);
- draw_arm();
- draw_joint(joint_1);
- glTranslatef( 0.0f, 1.6f, 0.0f);
- glRotatef(angle_2, 0.0f, 0.0f, 1.0f);
- draw_arm();
- draw_joint(joint_2);
- glTranslatef( -0.5f, 1.5f, 0.0f); // gehe zur Lichtposition
- // light osition - initialisieren
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_1_color);
- glLightfv(GL_LIGHT0, GL_POSITION,light_1_pos);
- glPopMatrix(); // zurueck zur position auf der tischplatte (setzt auch alle drehungen zurueck)
- glTranslatef(2.5f, 1.0f, 0.0f); // hoehe des hauses
- glEnable(GL_TEXTURE_2D); // hier soll texture sein
- glBindTexture(GL_TEXTURE_2D, textures); // welche texture
- glmDraw(model, GLM_SMOOTH | GLM_TEXTURE); // male objekt "model" mit textur und schatten
- glDisable(GL_TEXTURE_2D); // ausschalten
- glutSwapBuffers(); // male, leg los!!!
- }
- // wenn fenster groesse enderung dann reshape all
- void reshape(int width, int height) {
- if(height==0)
- height=1;
- glViewport(0,0,width,height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45.0f, (GLfloat)width /(GLfloat)height, 1.0f, 300.0f);
- glMatrixMode(GL_MODELVIEW);
- }
- void keyboard(unsigned char key, int x, int y) {
- switch (key){
- case 27: // Escape
- glutDestroyWindow(window);
- break;
- // drehen der welt
- case 119: // w
- if( rot_x < 360)
- rot_x += rot_steps;
- else
- rot_x = 0.0f;
- break;
- case 97: //# a
- if( rot_y > 0)
- rot_y -= rot_steps;
- else
- rot_y = 360.0f;
- break;
- case 115: // s
- if( rot_x > 0)
- rot_x -= rot_steps;
- else
- rot_x = 360.0f;
- break;
- case 100: // d
- if ( rot_y < 360)
- rot_y += rot_steps;
- else
- rot_y = 0.0f;
- break;
- // distanz aendern
- case 43: // +
- distance += 1.0f;
- break;
- case 45: // -
- distance -= 1.0f;
- break;
- case 114: // reset
- distance = -8.0f;
- rot_x = 0.0f;
- rot_y = 0.0f;
- break;
- // arm bewegung
- case 106: // j
- if ( angle_1 < 80 )
- angle_1 += joint_1_steps;
- else
- angle_1 = 80.0f;
- break;
- case 107: // k
- if ( angle_1 > 0 )
- angle_1 -= joint_1_steps;
- else
- angle_1 = 0.0f;
- break;
- case 108: // l
- if ( angle_2 < 80)
- angle_2 += joint_2_steps;
- else
- angle_2 = 80.0f;
- break;
- case 246: // oe
- if ( angle_2 > 0)
- angle_2 -= joint_2_steps;
- else
- angle_2 = 0.0f;
- break;
- }
- }
- void init (int width, int height) {
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // schwarzer hintergrung
- glClearDepth(1.0f); // woodoo
- glDepthFunc(GL_LESS); // wie wird verdeckt
- glEnable(GL_DEPTH_TEST); // verdecken aktiv
- glEnable(GL_NORMALIZE); // wenn normalen genutzt werden, mache sie laenge 1
- //glEnable(GL_COLOR_MATERIAL); // farbe auf material aktivieren
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glShadeModel(GL_SMOOTH); // weiche schatten
- reshape(width,height); // viewpoint setzen
- base = gluNewQuadric();
- joint_1 = gluNewQuadric();
- joint_2 = gluNewQuadric();
- glMatrixMode(GL_MODELVIEW); // zeichne licht
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_ambient);
- model = glmReadOBJ("haus.obj");
- image = gltxReadRGB("haus.rgb");
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glGenTextures(1, &textures); // generiere eine textur mit dem handler textures (das ist die erste)
- glBindTexture(GL_TEXTURE_2D, textures);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- 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
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat_spec); // setzt material
- glMaterialfv(GL_FRONT, GL_SHININESS, mat_shin); // setzt reflektion
- }
- void update(int value) {
- glutPostRedisplay();
- glutTimerFunc(25,update,0); // bild refresh alle 25 ms
- }
- int main(int argc, char *argv[])
- {
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
- glutInitWindowSize(640,480);
- glutInitWindowPosition(0,0);
- window = glutCreateWindow("Lampe, Navigation über [w,s,a,d,+,-,j.k.l.ö]");
- glutDisplayFunc(&draw);
- glutReshapeFunc(&reshape);
- glutKeyboardFunc(&keyboard);
- update(0);
- init(640,480);
- glutMainLoop();
- return 0;
- }