Exemplo n.º 1
0
void key(unsigned char key, int x, int y){
	bool need_redisplay = true;
	switch (key) {
		case 27:  /* Escape key */
			//continue_in_main_loop = false; // (**)
			//Freeglut's sentence for stopping glut's main loop (*)
			glutLeaveMainLoop (); 
		break;		 			 
		// ----------------
		
		 // linea de debug::: 	cout<< angleX << " "<< angleY << " " <<angleZ << " ";
		case 't': 
			escena->obRotate(5,0);
			break;
		case 'y': 
			escena->obRotate(-5,0);
			break;
		// ----------------
		case 'g':
			escena->obRotate(5,1);
			break;
		case 'h': 
			escena->obRotate(-5,1);
			break;
		// ----------------
		case 'b': 
			escena->obRotate(5,-1);
			break;
		case ',': 
			escena->obRotate(-5,-1);
			break;
		// ----------------
			
		// ------ Roll
		case 'u':
			acumRoll += 0.09;
			camera.roll(acumRoll);
			break;
		case 'i':
			acumRoll += -0.09;
			camera.roll(acumRoll);
			break;
		// ------ Yaw
		case 'j':
			acumYaw += 0.01;
			acumRoll = 0;
			acumPitch = 0;
			camera.yaw(acumYaw);
			break;
		case 'k':
			acumYaw += -0.01;
			acumRoll = 0;
			acumPitch = 0;
			camera.yaw(acumYaw);
			break;
		// ------ Pitch
		case 'n':
			acumPitch += 0.01;
			acumRoll = 0;
			acumYaw = 0;
			camera.pitch(acumPitch);
			break;
		case 'm':
			acumPitch += -0.01;
			acumRoll = 0;
			acumYaw = 0;
			camera.pitch(acumPitch);
			break;
		// ------ Recorrido X
		case 'e':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.recorridoEje(10.0,0.0,0.0);
			break;
		case 'r':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.recorridoEje(-10.0,0.0,0.0);
			break;
		// ------ Recorrido Y
		case 'd':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.recorridoEje(0.0,10.0,0.0);
			break;
		case 'f':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.recorridoEje(0.0,-10.0,0.0);
			break;
		// ------ Recorrido Z
		case 'c':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.recorridoEje(0.0,0.0,10.0);
			break;
		case 'v':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.recorridoEje(0.0,0.0,-10.0);
			break;
		// ------ Desplazar X
		case 'q':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.desplazar(2.0,0.0,0.0);
			break;
		case 'w':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.desplazar(-2.0,0.0,0.0);
			break;
		// ------ Desplazar Y
		case 'a':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.desplazar(0.0,2.0,0.0);
			break;
		case 's':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.desplazar(0.0,-2.0,0.0);
			break;
		// ------ Desplazar Z
		case 'z':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.desplazar(0.0,0.0,2.0);
			break;
		case 'x':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.desplazar(0.0,0.0,-2.0);
			break;
		// ------ Ortogonal
		case 'o':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.ortogonal(xLeft,xRight,yBot,yTop,N,F);
			break;
		// ------ Perspectiva
		case 'p':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.perspectiva(xLeft,xRight,yBot,yTop,N,F);
			break;
		// ------ Oblicua
		case 'l':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.oblicua(aux.clone(),xLeft,xRight,yBot,yTop,N,F);
			break;
		// ------ Gira X
		case '1':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.giraX(0.1);
			break;
		// ------ Gira Y
 		case '2':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.giraY(0.1);
			break;
		// ------ Gira Z
		case '3':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.giraZ(0.1);
			break;
		// ------ Vista Lateral
		case '4':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.lateral();
			break;
		// ------ Vista Frontal
		case '5':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.frontal();
			break;
		// ------ Vista Cenital
		case '6':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.cenital();
			break;
		// ------ Vista Esquina
		case '7':
			acumRoll = 0;
			acumPitch = 0;
			acumYaw = 0;
			camera.esquina();
			break;
		default:
			need_redisplay = false;
			cout<<key<<endl;
			break;
	}
	if (need_redisplay)
		glutPostRedisplay();
}
Exemplo n.º 2
0
void key(unsigned char key, int x, int y){
	float angleLamp;

	bool need_redisplay = true;
	switch (key) {
		case 27:  /* Escape key */
			//continue_in_main_loop = false; // (**)
			//Freeglut's sentence for stopping glut's main loop (*)
			glutLeaveMainLoop (); 
			break;	

		/*case 'a': //Eje X
			angleX += 1.0;
			break;
		case 'z': //Eje X
			angleX -= 1.0;
			break;

		case 's': //Eje Y
			angleY += 1.0;
			break;
		case 'x': //Eje Y
			angleY -= 1.0;
			break;

		case 'd': //Eje Z
			angleZ += 1.0;
			break;
		case 'c': //Eje Z
			angleZ -= 1.0;
			break;*/
		case 'u': //roll
			camera.roll(0.09); //0.09 radianes = 5 grados
			break;
		case 'i':
			camera.roll(-0.09);
			break;

		case 'j': //yaw
			camera.yaw(0.01);
			break;
		case 'k':
			camera.yaw(-0.01);
			break;

		case 'n': //pitch
			camera.pitch(0.01);
			break;
		case 'm':
			camera.pitch(-0.01);
			break;

		case 'e': //Along axis X
			recorridoX = 10.0;
			recorridoY = 0.0;
			recorridoZ = 0.0;
			camera.recorridoEje(recorridoX, recorridoY, recorridoZ);
			break;
		case 'r':
			recorridoX = -10.0;
			recorridoY = 0.0;
			recorridoZ = 0.0;
			camera.recorridoEje(recorridoX, recorridoY, recorridoZ);
			break;

		case 'd': //Along axis Y
			recorridoY = 10.0;
			recorridoX = 0.0;
			recorridoZ = 0.0;
			camera.recorridoEje(recorridoX, recorridoY, recorridoZ);
			break;
		case 'f':
			recorridoY = -10.0;
			recorridoX = 0.0;
			recorridoZ = 0.0;
			camera.recorridoEje(recorridoX, recorridoY, recorridoZ);
			break;

		case 'c': //Along axis Z
			recorridoZ = 10.0;
			recorridoX = 0.0;
			recorridoY = 0.0;
			camera.recorridoEje(recorridoX, recorridoY, recorridoZ);
			break;
		case 'v':
			recorridoZ = -10.0;
			recorridoX = 0.0;
			recorridoY = 0.0;
			camera.recorridoEje(recorridoX, recorridoY, recorridoZ);
			break;

		case 's': //Desplazar
			desplazaY = 2.0; 
			camera.desplazar(0.0, desplazaY, 0.0);
			break;
		case 'x':
			desplazaY = -2.0;
			camera.desplazar(0.0, desplazaY, 0.0);
			break;

		case '1': //Gira X
			//angleGiraX += 0.1;
			camera.giraX(0.1);
			break;

		case '2': //Gira Y
			//angleGiraY += 0.1;
			camera.giraY(0.1);
			break;

		case '3': //Gira Z
			//angleGiraZ += 0.1;
			camera.giraZ(0.1);
			break;

		case '4': //Lateral
			camera.lateral();
			break;

		case '5': //Frontal
			camera.frontal();
			break;

		case '6': //Cenital
			camera.cenital();
			break;

		case '7': //Esquina
			camera.esquina();
			break;

		case 'o': //Ortogonal
			glMatrixMode(GL_PROJECTION);
			glLoadIdentity();
			glOrtho(xLeft, xRight, yBot, yTop, N, F);
			break;
		case 'p': //Perspectiva
			glMatrixMode(GL_PROJECTION);
			glLoadIdentity();
			gluPerspective(45, 1, N, F);
			break;
		case 'l': //Oblicua
			glMatrixMode(GL_PROJECTION);
			glLoadIdentity();
			
			d.normaliza();

			if(d.getZ() != 0.0 && (d.getX() != 0 || d.getY() != 0 || d.getZ() != 1)){
				GLfloat m[16] = {	
						1, 0, 0, 0,
						0, 1, 0, 0,
						0, 0, 1, 0,
						0, 0, 0, 1
					};
				m[8] = -(d.getX()) / d.getZ();
				m[9] = -(d.getY()) / d.getZ();
				m[12] = -N * (d.getX() / d.getZ());
				m[13] = -N * (d.getY() / d.getZ());

				glOrtho(xLeft, xRight, yBot, yTop, N, F);
				glMultMatrixf(m);
			}
			break;

		case 'y': //Trasladar escena
			escena->traslacionEscena(1, 0, 0);
			break;
		case 'h':
			escena->traslacionEscena(-1, 0, 0);
			break;

		case 'g': //Escalacion escena
			escena->escalacionEscena(1, 2, 1);
			break;
		case 'b':
			escena->escalacionEscena(1, 0.5, 1);
			break;

		case '8': //Rotacion escena
			escena->rotacionEscena(2,0,1,0);
			break;
		case '9':
			escena->rotacionEscena(-2,0,1,0);
			break;

		case 't': //Encender/apagar luz ambiente global
			if(globalOn){
				globalOn = false;
				glDisable(GL_LIGHT0);
				glDisable(GL_LIGHT1);
				glDisable(GL_LIGHT2);
				GLfloat amb[] = {0.0,0.0,0.0,1.0};
				glLightModelfv(GL_LIGHT_MODEL_AMBIENT, amb);
			} else {
				globalOn = true;
				glEnable(GL_LIGHT0);
				glEnable(GL_LIGHT1);
				glEnable(GL_LIGHT2);
				GLfloat amb[] = {0.2,0.2,0.2,1.0};
				glLightModelfv(GL_LIGHT_MODEL_AMBIENT, amb);
			}
			break;

		case 'a': //Escalar lámpara
			escena->getHijo(15)->getTAfin()->escalacion(1, 1.1, 1);
			escena->getHijo(15)->getTAfin()->traslacion(0, -1, 0);
			lampHeight *= 1.1;
			angleLamp = calculateLampAngle(0.5, lampHeight);
			glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, angleLamp);
			break;
		case 'z':
			escena->getHijo(15)->getTAfin()->escalacion(1, 0.9, 1);
			escena->getHijo(15)->getTAfin()->traslacion(0, 1, 0);
			lampHeight *= 0.9;
			angleLamp = calculateLampAngle(0.5, lampHeight);
			glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, angleLamp);
			break;

		case 'q': //Encender/apagar lámpara
			if(lamparaOn){
				lamparaOn = false;
				glDisable(GL_LIGHT1);
			} else {
				lamparaOn = true;
				glEnable(GL_LIGHT1);
			}
			break;

		case 'w': // Activar/desactivar luz remota del este
			if(luzRemotaOn){
				luzRemotaOn = false;
				glDisable(GL_LIGHT2);
			} else {
				luzRemotaOn = true;
				glEnable(GL_LIGHT2);
			}
			break;
		
		case '0': // Activar/desactivar niebla
			if(nieblaOn){
				nieblaOn = false;
				glDisable(GL_FOG);
			} else {
				nieblaOn = true;
				glEnable(GL_FOG);
			}
			break;

		default:
			need_redisplay = false;
			break;
	}

	if (need_redisplay)
		glutPostRedisplay();
}