miércoles, 10 de octubre de 2012
jueves, 4 de octubre de 2012
Pelota Que rebota
#include <GL/glut.h>
float angX=0.0f,angY=0.0f;
int ResX=600,ResY=600;
float angB=0.0f,angC=0.0f,angDE=0.0f;
float aceX=0.0f,aceY=-0.0001f;
float velX=0.001f,velY=0.0f;
float posX=0.0f,posY=10.0f;
GLfloat material [4] = {-1.0f, -1.0f, 1.f };
GLfloat Pblanca [4] = {1.0f, 1.0f, 1.0f};
GLfloat Tverde [4] = {-1.0, 1.0, 1.0, 1.f };
void Ejes()
{
glNewList(1,GL_COMPILE);
glBegin (GL_LINES);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, Tverde );
glVertex3f ( 0.0, .0,-20.0);
glVertex3f ( 0.0, 0.0,20.0);
glEnd();
glEndList();
}
void pEJE(){
glNewList(2,GL_COMPILE);
glPushMatrix();
glutSolidSphere(0.9f,100,100);
glPopMatrix();
glEndList();
}
void RenderScene(void){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity( );
glTranslatef(1.0f,0.0f,-10.0f);
glRotatef(angY,1.0f,0.0f,0.0f);
glRotatef(angX,0.0f,1.0f,0.0f);
glLineWidth(20);
glCallList(1);
glPushMatrix();
glScalef(1,1,1);
glTranslatef(1.0f,1.0f,1.0f);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, Pblanca );
glPushMatrix();
glTranslatef(posX,posY,0.0f);
glCallList(2);
glPopMatrix();
glutSwapBuffers();
}
void idle(void){
velY+=aceY; posY+=velY;
velX+=aceX; posX+=velX;
if(posY<0.0f){posY=0.0f; velY*=-0.8f;
if(velY<0.01f){velX=0.0f; velY=0.0f;}
}
glutPostRedisplay();
}
int main(int a, char *b[]){
glutInit(&a,b);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(ResX,ResY);
glutInitWindowPosition(100,100);
glutCreateWindow("Pelota Rebote");
glutDisplayFunc(RenderScene);
glutIdleFunc(idle);
glViewport( 0, 0, ResX, ResY );
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );
glFrustum(-(float)ResX/ResY, (float)ResX/ResY, -1.0, 2.0, 1, 1000000.0);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
Ejes();
pEJE();
glutMainLoop();
return 0;
}
Corrida del programa pelota que rebota
miércoles, 26 de septiembre de 2012
Proyecciones 3d (Hologramas)
NVIDIA 3D soluciones gráficas profesionales NVIDIA® Quadro®
proporcionan a diseñadores, ingenieros, artistas digitales y científicos el
entorno 3D estereocópico más avanzado del mercado para que puedan ver y
compartir su trabajo en auténtico 3D y con la máxima calidad.
CAVE es un entorno de realidad
virtual inmersiva. Se trata de una sala en forma de cubo en la que hay
proyectores orientados hacia las diferentes paredes, suelo y techo.
Obturador
activo 3d Puedes
ver tu contenido 3D GoPro de las siguientes maneras y Los TVs
obturador activo usan gafas con obturador electrónico que están sincronizadas.
obturador activo usan gafas con obturador electrónico que están sincronizadas.
Pantalla holográfica 3D palpable consiste
en imágenes flotantes holográficas por medio de la proyección de una imagen de
un proyector LCD en un espejo cóncavo (Provision Holo), un simple sistema de tracking (seguimiento)
mediante el uso de Wiimotes y una “pantalla” ecográfica ultrasónica para
producir la sensación de presión por medio de aire Presión de radiación acústica cuando un objeto interrumpe la propagación de ultrasonido, campo de presión es ejercida sobre la superficie del objeto
interfaz Obscura VisionAire
Sistema que puede hacer como si fueran real los objetos
luftscreen Es la tecnología que hace posible ver
lo que solo podíamos ver en las películas a un costo no tan elevado según la
empresa.
Proyección de Hologramas en 3d
una
demostración de una proyección de hologramas en 3D sobre el suelo y que es
interactiva, los hechos que suceden sobre las imagenes proyectadas tienen
efectos en los peces que nadan en la proyección, incluso se producen ondas
sobre el agua virtual.
Holografia es una técnica avanzada de fotgrafía,
que consiste en crear imágenes tridimensionales. Para esto se utiliza un rayo láer,
que graba microscópicamente una película fotosensible. Ésta, al recibir la
luz desde la perspectiva adecuada, proyecta una imagen en tres dimensiones.
viernes, 21 de septiembre de 2012
Conceptos orthogonal y perspectiva con ejemplos
Proyección en opengl (ortogonal y perspectiva)
Una proyección ortogonal define un volumen de la vista de tipo
paralelepipédico tal y como se muestra en la siguiente figura. La principal
característica de esta proyección es que el tamaño de los objetos es
independiente de la distancia a la que estén del observador, por ejemplo, dos
cilindros del mismo tamaño, uno a cinco unidades y el otro a diez unidades de
distancia del observador se proyectarán con el mismo tamaño.
Aunque
OpenGL dispone de pilas para
Las
matrices GL_MODELVIEW y GL_PROJECTION, sólo se suele utilizar la pila de
GL_MODELVIEW.
Para
definir una proyección ortogonal en OpenGL hay que dar los siguiente pasos:
glMatrix(GL_PROJECTION); /* Voy a manejar la matriz de proyección */
glLoadIdentity(); /* Cargo inicialmente la identidad */
/* Y ahora defino la proyección ortogonal */
void glOrtho(izquierda, derecha, abajo, arriba, cerca, lejos);
Si lo que deseamos es trabajar con una proyección ortogonal 2D:
void gluOrtho2D(izquierda, derecha, abajo, arriba);
que no es más que una proyección ortogonal donde el plan delantero está en -1 y el trasero en 1.
glMatrix(GL_PROJECTION); /* Voy a manejar la matriz de proyección */
glLoadIdentity(); /* Cargo inicialmente la identidad */
/* Y ahora defino la proyección ortogonal */
void glOrtho(izquierda, derecha, abajo, arriba, cerca, lejos);
Si lo que deseamos es trabajar con una proyección ortogonal 2D:
void gluOrtho2D(izquierda, derecha, abajo, arriba);
que no es más que una proyección ortogonal donde el plan delantero está en -1 y el trasero en 1.
Por ejemplo, la ilustración 1.2 es un render de un coche con
proyección ortográfica, visto desde delante.
El código utilizado para esta proyección ha sido
glOrtho(-0.5f, 0.5f, -0.5f, 0.5f, 0.01f, 20.0f
Proyección perspectiva
La proyección ortogonal no da sensación de
profundidad porque el tamaño de los objetos no depende de su distancia al
observador. Para conseguir este efecto necesitamos definir una proyección
perspectiva. Esta proyección define un volumen de la vista que es una prisma
truncado de base rectangular, como el de la siguiente figura:
|
la
función OpenGL que establece este tipo de perspectiva es:
void glFrustum(izquierda, derecha, abajo, arriba, cerca, lejos);
este modo de definir la proyección perspectiva no es demasiado intuitivo, es más sencillo establecerla con un esquema como el que se muestra en la siguiente figura:
void glFrustum(izquierda, derecha, abajo, arriba, cerca, lejos);
este modo de definir la proyección perspectiva no es demasiado intuitivo, es más sencillo establecerla con un esquema como el que se muestra en la siguiente figura:
y la función OpenGL que la establece es:
La
función OpenGL que establece el tamaño del vierport es:
void glViewport(GLint x, GLint y, GLsizei ancho, GLsizei alto);
void glViewport(GLint x, GLint y, GLsizei ancho, GLsizei alto);
La ilustración 1.3 muestra la escena del coche de la sección
anterior, esta vez con una proyección en perspectiva:
Ilustracion 1.3
El código utilizado para definir la proyección ha sido:
gluPerspective(45.0f,(GLfloat)(width/height),0.01f,100.0f);
Se usan 45º de ángulo, la relación entre el ancho y alto de
la pantalla (width y height son el ancho y alto actual de la ventana) y las
distancias a los planos de corte znear y zfar son 0.01 y 100 respectivamente.
Un poco mas complejo es este
// Le digo a OpenGL que voy a cambiar la matriz de
proyeccion
glMatrixMode(GL_PROJECTION);
// Le digo a OpenGL que use proyeccion perspectiva. Uso el
ancho
// y alto de mi viewport para calcular el segundo parametro
gluPerspective(60.0f,
(float)rect.right/(float)rect.bottom, 0.5f, 50.0f);
// Muevo para atras el objeto. El punto de vista esta
// en la posicion 0,0,0 porque no lo he cambiado, asi que
// alejo el objeto para poder verlo.
glTranslatef(0,0,-4.0f);
// Giro el objeto 30 grados en el eje x, luego otros
// 30 en el eje y. Es para que quede bonito.
glRotatef(30,1,0,0);
glRotatef(30,0,1,0);
// y pinto el objeto con coordenadas genericas alrededor
// del eje de coordenadas. Estas coordenadas que pongo
// ahora son modificadas por las modificaciones que
// hemos hecho en la matriz modelview (glTranslate,
glRotate).
// Le digo a OpenGL que voy a pintar y con cuadrados:
glBegin(GL_QUADS);
// Cara de arriba
glColor3f(1,0,0); // rojo
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
// Cara de abajo
glColor3f(1,0,0); // rojo
glVertex3f( 1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);
// Cara frontal
glColor3f(0,0,1); // azul
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f,
1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f,
1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
// Cara trasera
glColor3f(0,0,1); // azul
glVertex3f( 1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,
1.0f,-1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
// Cara izquierda
glColor3f(0,1,0); // verde
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f,
1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
// Cara derecha
glColor3f(0,1,0); // verde
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f(
1.0f, 1.0f, 1.0f);
glVertex3f(
1.0f,-1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);
glEnd();
Transformaciones
Geométricas (EJEMPLOS DE TRASLACION, ROTACION Y ESCALADO)
Traslacion
void dibujar_triangulo(){
glBegin(GL_TRIANGLES)
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glVertex3f(0,1,0);
glEnd();
}
// dibuja el triangulo en la posición original
Dibujar_triángulo();
// dibuja el triangulo desplazado
glTranslate(10,0,0);
Dibujar_triángulo();
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
Rotacion y escalacionglMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotate(45,0,0,1);
glTranslate(10,0,0)
glScale(2,2,2)
Dibujar_triangulo();
glLoadIdentity();
glRotate(45,0,0,1);
glTranslate(0,10,0)
glScale(2,2,2)
Dibujar_cuadrado();
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
Dibujar_cuadrado();
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
Manejo de matrices en opengl para Para proyeccion y para
modelado
Proyeccion
La matriz de proyección especifica el tamaño y la forma del
volumen de visualización. El volumen de visualización es aquel cuyo contenido
es el que se representa en pantalla. Está delimitado por una serie de planos de
trabajo. De estos planos, los más importantes son los planos de corte, que son
los que nos acotan el volumen de visualización por delante y por detrás. En el
plano más cercano a la cámara (znear) es donde se proyecta la escena para luego
pasarla a la pantalla.
Modelado
La matriz del modelador es una matriz 4x4 que representa el
sistema de coordenadas transformado que se está usando para colocar y orientar
los objetos. Si se multiplica la matriz del vértice (de tamaño 1x4) por ésta se
obtiene otra matriz 1x4 con los vértices transformados sobre ese sistema de
coordenadas.
RESUMEN
PIla de Matrices
En la función display() se encuentran las llamadas a dos
funciones de matrices que todavía no han sido comentadas. Se trata de
glPushMatrix() y glPopMatrix(). Para comprender su funcionamiento, primero se
va a experimentar que es lo que ocurre cuando no están dichas llamadas. Para
ello se comentan en la función display() ambas llamadas:
void display(void) {
// glPushMatrix();
glTranslatef(0.0, 0.0, .5);
...
// glPopMatrix();
glutSwapBuffers();
}
La
razón de este movimiento es que en la función display está incluida una llamada
a glTranslatef() que se utiliza para posicionar uno de los objetos. Como se ha
explicado anteriormente, las funciones de traslación multiplican la matriz
actual por una matriz de traslación creada con los argumentos que se le pasan,
por tanto, sucesivas llamadas a la función display() provocan sucesivas
multiplicaciones de la matriz actual con el efecto que se observa de incrementar
la traslación. Para solucionar este problema OpenGL dispone de unos stacks o
pilas de matrices, que permiten almacenar y recuperar una matriz anterior.
aunque opengl dispone de pilas para las matrices gl_modelview y gl_projection,
sólo se suele utilizar la pila de gl_modelview. Una pila es un almacén con
funcionamiento LIFO, el último en entrar es el primero en salir, por lo que
suele comparar a una pila de platos en la que sólo se puede dejar uno encima de
la pila o coger el superior que es el último depositado. La pila de matrices
tiene el mismo funcionamiento sustituyendo los platos por matrices. La matriz
superior de la pila es sobre la que se aplican las distintas transformaciones,
multiplicándola por la matriz que generan las disntintas
funciones.
La
función glpushmatrix() realiza una copia de la matriz superior y la pone encima
de la pila, de tal forma que las dos matrices superiores son iguales.. Las
siguientes transformaciones que se realizan se aplican sólo a la matriz superior
de la pila, quedando la anterior con los valores que tenía en el momento de
llamar a la función glpushmatrix(). La función glpopmatrix() elimina la matriz
superior, quedando en la parte superior de la pila la matriz que estaba en el
momento de llamar a la función glpushmatrix().
Necesitaremos
realizar tres operaciones: calcular la coordenadas donde se encuentra la
tortuga, almacenar dicha coordenada y dibujar el rastro. Para almacenar los
puntos se utiliza una variable para indicar el número de puntos y tres vectores
para las coordenadas x, y, z.
int np = 0;
float px [10000];
float py [10000];
float
pz [10000];
Para
calcular las coordenadas de la tortuga es necesario conocer la matriz de
transformación de modelado. Debido a que en OpenGL, la matriz de modelado se
almacena junto con la de visualización en la matriz GL_MODELVIEW, es necesario
guardar de modo independiente esta matriz de modelado. Para ello definimos la
variable mModel, como una variable global, ya que va a ser accedida en distinos
puntos de la aplicación.
glmatrixmode(gl_modelview);
glpushmatrix();
glLoadIdentity();
glgetdoublev (gl_modelview_matrix, mmodel);
glPopMatrix();
En
este código se realizan las siguientes operaciones:
<!--[if !supportLists]-->·
<!--[endif]-->œ
se indica primeramente sobre que matriz se van a realizar las opereraciones con
glMatrixMode();
<!--[if !supportLists]-->·
<!--[endif]-->œ
se crea una nueva matriz con glPushMatrix();
<!--[if !supportLists]-->·
<!--[endif]-->œ
se carga la matriz identidad con glLoadIdentity();
<!--[if !supportLists]-->·
<!--[endif]-->œ
se almacena la matriz superior de la pila en el vector mModel con la función
glGetDoublev();
<!--[if !supportLists]-->·
<!--[endif]-->œ
y finalmente se elimina la matriz superior de la pila con glPopMatrix() para
dejar la
que
estaba antes de este proceso.
En
realidad todo este proceso lo que ha hecho ha sido inicializar la matriz que
represena
mModel
con la matriz identidad. La función glMultMatrixd() multiplica la matriz
superior de la pila por la matriz que tiene como argumento. Al multiplicar en
este caso por la matriz identidad, la matriz que queda en la posición superior
de la pila es mModel. La llamada a addPointToTrace() se introduce despues de las
llamadas a gltranslatef() en las instrucciones correspondientes al forward y
back. addPointToTrace();
La
llamada a displayTrace() se realiza en la función display(). El dibujo del
objeto que representa la tortuga se debe realizar despues de multiplicar la
matriz actual (la matriz de visualización) por la matriz de modelado que se
almacena en mModel. Dibujar un rastro que consista en unas superficie en lugar
de una línea. Para ello se puede utilizar glBegin(GL_QUAD_STRIP) que dibuja una
sucesión de rectángulos para cada pareja de puntos que
recibe.
Mostrar el texto
Las
instrucciones introducidas se muestran en la ventana MSDOS. Se pueden mostrar en
la ventana gráfica. Para ello es necesario cambiar las matrices de
transformación. La siguiente función realiza la representación del
texto:
void text(GLuint x, GLuint y, GLfloat scale, char* format, ...)
{
va_list args;
char buffer[255], *p;
GLfloat font_scale = 119.05f + 33.33f;
va_start(args, format);
vsprintf(buffer, format, args);
va_end(args);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, glutGet(GLUT_WINDOW_WIDTH), 0,
glutGet(GLUT_WINDOW_HEIGHT));
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glTranslatef(x, y, 0.0);
glScalef(scale/font_scale, scale/font_scale,
scale/font_scale);
for(p = buffer; *p; p++)
glutStrokeCharacter(GLUT_STROKE_ROMAN, *p);
glPopAttrib();
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
Para
mostrar el texto se llama desde la función display() con la
sentencia:
if (command) {
glColor3f(1.0,1.,0.0) ;
text(5, 5, 20, "->%s", strCommand);
PUNTOS
A REALIZAR
Utilizando
los comandos de logo representar una esfera compuesta por
un
conjunto
de circunferencias en el espacio.
Utilizando
los comandos de logo
realizar
la representación de una
helicoidal.
La transformación de puerto de vista:
Esta transformación define el tamaño y la posición de la imagen final (como la impresión de una fotografía), se usa el comando glViewPort() y es necesario modificar el puerto de vista cada que la ventana se modifica.
Una vez que todas estas transformaciones son aplicadas a cada uno de los vértices, la imagen puede ser desplegada dentro de la ventana.
La sintaxis de los comandos de transformación es la siguiente:
glTranslate {fd} (TYPE x, TYPE y TYPE z);
glRotate {fd} (TYPE ángulo,TYPE x, TYPE y, TYPE z);
glScale {fd} (TYPE x, TYPE y, TYPE z);
En donde TYPE es float o int, dependiendo del comando que se escogió.
10.- Normales, Color e Iluminación:
glColor3 {b,s,i,f,d} (TYPE rojo,
TYPE verde, TYPE azul)
Un ejemplo de esto es el siguiente:
glBegin(GL_POLYGON);
glNormal3fv(n0); /* n0 es
un arreglo que contiene los datos */
glVertex3fv(v0);
glNormal3fv(n1);
glVertex3fv(v1);
glNormal3fv(n2);
glVertex3fv(v2);
glEnd();
Cubo y Piramide Modificada
#include <GL/glut.h>
GLfloat anguloCuboX = 0.0f;
GLfloat anguloCuboY = 0.0f;
GLfloat anguloEsfera = 0.0f;
GLint ancho=600;
GLint alto=600;
int hazPerspectiva = 0;
void reshape(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(hazPerspectiva)
gluPerspective(60.0f, (GLfloat)width/(GLfloat)height, 1.0f, 20.0f);
else
glOrtho(-4,4, -4, 4, 1, 10);
glMatrixMode(GL_MODELVIEW);
ancho = width;
alto = height;
}
void drawCube(void)
{
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_QUADS); //cara frontal
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_QUADS); //cara trasera
glVertex3f( 1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f);
glEnd();
glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS); //cara lateral izq
glVertex3f(-1.0f,-1.0f, -1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
glColor3f(1.0f, 1.0f, 0.0f);
glBegin(GL_QUADS); //cara lateral dcha
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glEnd();
glColor3f(0.0f, 1.0f, 1.0f);
glBegin(GL_QUADS); //cara arriba
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
glColor3f(1.0f, 0.0f, 1.0f);
glBegin(GL_QUADS); //cara abajo
glVertex3f( 1.0f,-1.0f, -1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, -1.0f);
glEnd();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
glTranslatef(-3,0,0);
glRotatef(anguloCuboX, 1.0f, 0.0f, 0.0f);
glRotatef(anguloCuboY, 0.0f, 1.0f, 0.0f);
glScalef(0.5f, 0.5f, 0.5f);
drawCube();
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
glRotatef(anguloEsfera, 0.0f, 1.0f, 0.0f);
glTranslatef(3.0f, 0.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glutWireSphere(0.5f, 8, 8);
glFlush();
glutSwapBuffers();
anguloCuboX+=0.1f;
anguloCuboY+=0.1f;
anguloEsfera+=0.2f;
}
void init()
{
glClearColor(0,0,0,0);
glEnable(GL_DEPTH_TEST);
ancho = 600;
alto = 600;
}
void idle()
{
display();
}
void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case 'p':
case 'P':
hazPerspectiva=1;
reshape(ancho,alto);
break;
case 'o':
case 'O':
hazPerspectiva=0;
reshape(ancho,alto);
break;
case 27: // escape
// exit(0);
break;
}
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(ancho, alto);
glutCreateWindow("Cubo 1");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
Corrida
martes, 18 de septiembre de 2012
miércoles, 12 de septiembre de 2012
Presentacion Transformaciones Geometricas
Rotaciones 2D
La rotación de un objeto en 2D se lleva a cabo alrededor de
un punto, que es el eje puntual (cero-dimensional) de rotación. Las rotaciones
principales 2D son aquellas que se llevan a cabo alrededor del origen, las
rotaciones sobre cualquier otro punto arbitrario se llaman rotaciones
generales 2D. En
esta Sección 3.5
, se analizan
sólo las rotaciones principales para
todas las dimensiones,
en la Sección
3.6 se discuten las
rotaciones generales.
Para generar una rotación, se especifica el ángulo de
rotación 0, y el punto de rotación (pivote) sobre el cual el objeto será
rotado. Los ángulos de rotación positivos definen una rotación en sentido
contrario a las manecillas del reloj sobre el punto pivote (del eje X1 al eje
X2), entonces los ángulos de rotación negativos producen una rotación en el
sentido de las manecillas (del eje X2 al eje X1). [Hearn 95] describe la
rotación 2D como el giro sobre el eje de rotación que es perpendicular al plano
X1X2 (mejor conocido como plano XY) y que pasa a través del punto pivote.
Aplicando algunas propiedades trigonométricas:
x1 ' = r cos(Ø + 0 ) = r cosØ cos0 − r sin Ø sin0
x2 ' = r sin(Ø + 0 ) = r cosØ sin0 + r sin Ø cos 0
Substituyendo los
valores de x1 = r cos(Ø ) y x2 =
r sin(Ø ) se obtienen las ecuaciones para rotar un punto p = (x1, x2 ) alrededor del origen dado un
ángulo Ø:
x1 ' = x1 cos
0 − x2 sin 0
x2 '= x1 sin
0+ x2 cos0
muestra el efecto de rotación de una figura con 0 = 45°
Translación 2D
La
translación 2D implica el desplazamiento de un polígono, donde cada
punto p = (x1 , x2 ) es trasladado d1 unidades en el eje X1 y d2 unidades en el
eje X2, de esta forma, las coordenadas del nuevo punto p' = (x1 ', x2 ' ) , se
obtienen como:
x1 ' = x1 + d1
x2 ' = x2 + d 2
Sea
d = (d1 , d 2 ) el vector de distancias, y T(d) la matriz de
translación, en coordenadas homogéneas la translación de un punto p en 2D se
puede expresar como el producto matricial p' = p ⋅ T
(d ) , es decir:
La
Figura 3.3 muestra el efecto de translación de una figura con d1 = 1 y d2 =
2.
Escalamiento en 2D
El
escalamiento permite cambiar el tamaño de un objeto expandiéndolo o
contrayéndolo en sus dimensiones.
Sea
s = (s1, s2) el vector de factores de escalamiento, y S(s)
la matriz de escalamiento, en coordenadas homogéneas el escalamiento de un
punto p en 2D se puede expresar como el producto matricial p' = p ⋅ S
(s), es decir:
2.2. Coordenadas homogéneas y representación matricial
En las aplicaciones de diseño y de creación de imágenes,
realizamos traslaciones, rotaciones y escalaciones para ajustar los componentes
de la imagen en sus posiciones apropiadas. En este tema consideramos cómo se
pueden volver a formular las representaciones de la matriz de modo que se
pueden procesar de manera eficiente esas secuencias de transformación. Es
posible expresar cada una de las transformaciones básicas en la forma de matriz
general con las posiciones de coordenadas P y P’ representadas como columnas de
vector.2.15.P'=M1·P+M
Suscribirse a:
Entradas (Atom)



























