domingo, 22 de septiembre de 2013

Actividad #4 Unidad II Programa Transformaciones geométricas

Transformaciones geométricas

Actividad:

Investigar como se manipulan las transformaciones geométricas en opengl.

Con la imagen de su pirámide y las transformaciones geométricas diseñe un programa que rote su pirámide sobre el eje "x" y el eje "y", se mueva de izquierda a derecha y de derecha a izquierda, y reduzca o amplié la piramide.

Se utilizan las siguientes lineas de código en opengl para:

  • Trasladar: glTranslatef("x", "y"," z"); 
Si queremos trasladar una figura a 10 unidades en el plano de las z seria:
glTranslatef(0.0f, 0.0f, 10.0f);

La “f” añadida a la función indica que se usarán flotantes. Los parámetros de glTranslate son las unidades a desplazar en el eje x, y y z, respectivamente. Pueden ser valores negativos, para trasladar en el sentido contrario.

  • Rotar: glRotatef(Anguloº, "X","Y","Z"); 
Para rotar, tenemos también una función de alto nivel que construye la matriz de transformación y la multiplica por la matriz activa, glRotate. Lleva como parámetros el ángulo a rotar (en grados, sentido horario), y después x, y y z del vector sobre el cual se quiere rotar el objeto.
Una rotación simple, sobre el eje x, de 10º sería:
glRotatef(10, 1.0f, 0.0f, 0.0f);
  • Escalar: glScalef("X","Y","Z"); 
Una transformación de escala incrementa el tamaño de nuestro objeto expandiendo todos los vértices a lo largo de los tres ejes por los factores especificados. La función glScale lleva como parámetros la escala en x, y y z, respectivamente. El valor 1.0f es la referencia de la escala, de tal forma que la siguiente línea:
glScalef(1.0f, 1.0f, 1.0f);

Código:




#include "stdafx.h"
#include <stdlib.h>
#include <GL/glut.h>

GLfloat x1= 1.5f;
GLfloat y1 = 1.5f;
GLfloat escalar = 1.5f;

int banderax; // bandera = 1;- en +X,bandera = 0;- en -X
int banderay;// bandera = 1;- en +Y,bandera = 0;- en -Y

GLfloat angulox = 0.0f; // variable para el angulo x
GLfloat anguloy = 0.0f; // variable para el angulo y
//GLfloat anguloz = 0.0f; // variable para el angulo z

void reshape(int width, int height)/*Esta acción afecta en principio directamente al render, puesto que se está cambiando el tamaño del plano de proyección.*/
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-10,10,-10,10,-10,10);/*define la proyección definida por los ejes x,y,z. Estos parámetros demilitan el volumen de vista y son, por este orden: x_mínima, x_máxima, y_mínima, y_máxima, z_mínima, z_máxima,*/
glMatrixMode(GL_MODELVIEW);

}

void piramide(void)
{
//Lado 4 - atras, blanco
glBegin(GL_TRIANGLES);/*glBegin(GL_TRIANGLES);Funcion para puntos, El inicio se une con el final*/
glColor3f(1,1,1);
glVertex3f(0.0f,-3.0f,-1.5f); //Vertice a Formando Lado 4
glVertex3f(-1.5f,0.0f,0.0f); //Vertice b Formando Lado 4
glVertex3f(1.5f,0.0f,0.0f); //Vertice c Formando Lado 4
glEnd();

//Lado 3 - base, amarillo
glBegin(GL_TRIANGLES);/*glBegin(GL_TRIANGLES);Funcion para puntos, El inicio se une con el final*/
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(-1.5f,0.0f,0.0f); //Vertice b Formando Lado 3
glVertex3f(1.5f,0.0f,0.0f); //Vertice c Formando Lado 3
glVertex3f(0.0f,-1.5f,1.5f); //Vertice d Formando Lado 3
glEnd();


//Lado 2 - derecho, azul
glBegin(GL_TRIANGLES);/*glBegin(GL_LINE_LOOP);Funcion para puntos, El inicio se une con el final*/
glColor3f(0,0,1);//color azul
glVertex3f(0.0f,-3.0f,-1.5f); //Vertice a Formando Lado 2
glVertex3f(1.5f,0.0f,0.0f); //Vertice c Formando Lado 2
glVertex3f(0.0f,-1.5f,1.5f);//(0,12,1.5); //Vertice d Formando Lado 2
glEnd();

//Lado1 - izquierdo, verde
glBegin(GL_TRIANGLES);/*glBegin(GL_LINE_LOOP);Funcion para puntos, El inicio se une con el final*/
glColor3f(0.0f, 1.0f, 0.0f);//color verde
glVertex3f(0.0f,-3.0f,-1.5f); //Vertice a Formando Lado 1
glVertex3f(0.0f,-1.5f,1.5f);//(0,12,1.5); //Vertice d Formando Lado 1
glVertex3f(-1.5f,0.0f,0.0f); //Vertice b Formando Lado 1
glEnd();
}


void display()/*Aquí se define el primer callback. La función pasada como parámetro será llamada cada vez que GLUT determine oportuno que la ventana debe ser redibujada, como al maximizarse, poner otras ventanas por encima y después quitarlas, etc.*/
{

glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
//glColor3f(1,1,1);/*Define el color glColor3f(0.5,0.0,1.0);*/
glLoadIdentity();

glTranslatef(x1,y1,0.0f);//Se trastala en los ejes: x , y
glScalef(escalar, escalar, escalar);//Para aunmentar y disminuir la escala
glRotatef(angulox, 1.0f, 0.0f, 0.0f);//rotar en x
glRotatef(anguloy, 0.0f, 1.0f, 0.0f);//rotar en y
// glRotatef(anguloz, 0.0f, 0.0f, 1.0f);
piramide();
glFlush();/*vacía todos los comandos en estos buffers y las fuerzas de todos los comandos pendientes voluntad de ser ejecutadas inmediatamente y sin topes de espera están llenas.*/
glutSwapBuffers();/*promueve el contenido de la memoria intermedia posterior de la capa en el uso de la ventana actual para convertirse en el contenido del búfer frontal. */
angulox+=0.1f;
anguloy+=0.1f;
// anguloz+=0.1f;


GLfloat angulox = 0.0f; // variable para el angulo x
//GLfloat anguloy = 0.0f; // variable para el angulo y
//GLfloat anguloz = 0.0f; // variable para el angulo z


}
void init()
{
glClearColor(0,0,0,0);
glEnable(GL_DEPTH_TEST);// tapa las lineas que estan debajo de ellas
}

void idle()
{
display();
}

void ArrowKey(int key, int x, int y){ //funcion para trasladar en -x,x,-y,y

switch (key){
case GLUT_KEY_RIGHT:
if( x1<8.0 ){x1 = x1 + 0.5;}//para moverse en la coordenada +x
if(x1>0.1 && x1<3){escalar = x1;}
break;


case GLUT_KEY_LEFT:
if( x1>-8.0 ){x1 = x1 - 0.5;}//para moverse en la coordenada -x
if(x1>0.1 && x1<3){escalar = x1;}
break;


case GLUT_KEY_UP:
if( y1<8.0 ){y1 = y1 + 0.5;}//para moverse en la coordenada +y
break;


case GLUT_KEY_DOWN:
if( y1>-8.0 ){y1 = y1 - 0.5;}//para moverse en la coordenada -y
break;
}
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
}
}
int main(int argc, char **argv) //Funcion para crear ventana
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);/*GLUT_DOUBLE para que glutSwapBuffers() tenga efecto, CON GLUT_SINGLE no hay efecto;GLUT_SINGLE para que glFlush() tenga efecto */
glutInitWindowPosition(500,60);//Posicion de la ventana
glutInitWindowSize(600,500);//tamaño de la ventana
glutCreateWindow("Piramide 3D");//Mensaje de la ventana
init();/*activa, define una serie de estados de ogl, antes de pasar el control del programa a la GLUT.*/
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(idle);
glutKeyboardFunc(keyboard);
glutSpecialFunc(ArrowKey);
glutMainLoop();


}


Fuente: http://sabia.tic.udc.es/gc/Tutorial%20OpenGL/tutorial/cap4.htm#_Toc535127350





No hay comentarios:

Publicar un comentario