Diferencia entre revisiones de «ManuelRomero/grafica/escena1/objeto»

De WikiEducator
Saltar a: navegación, buscar
(Coordenadadas del objeto)
Línea 1: Línea 1:
 
{{:Usuario:ManuelRomero/grafica/escena1/nav}} <br>  
 
{{:Usuario:ManuelRomero/grafica/escena1/nav}} <br>  
  
=== Coordenadadas del objeto ===
+
=== Coordenadadas del objeto:La matriz escena ===
  
 
#Coordenadas globales o del mundo  
 
#Coordenadas globales o del mundo  
Línea 11: Línea 11:
 
&lt;/div&gt;  
 
&lt;/div&gt;  
 
<div class="slide">
 
<div class="slide">
 +
 
=== Coordenadadas del objeto  ===
 
=== Coordenadadas del objeto  ===
  

Revisión de 02:01 13 jun 2013



Coordenadadas del objeto:La matriz escena

  1. Coordenadas globales o del mundo
  2. Coordenadas locales o del objeto
  • Dibujamos un eje de coordenadas x,y,z.
  • Estará centrado en el punto 0,0,0

</div>

Coordenadadas del objeto

El código fuente
void dibujaCoordenadas(void){
	porFlechitas();
	glLineWidth(2);
	glBegin(GL_LINES);
	   glLineWidth(3);
	   glColor3f(1,0,0);//Eje X
	   glVertex3f(0,0,0);
	   glVertex3f(15,0,0);
 
	   glColor3f(0,1,0);//Eje Y
	   glVertex3f(0,0,0);
	   glVertex3f(0,15,0);
       glColor3f(0,0,1);//Eje Z
	   glVertex3f(0,0,0);
	   glVertex3f(0,0,15);
	   glLineWidth(1);
	glEnd();
	glFlush();
}

Coordenadadas del objeto

  • A OpenGL le especificamos bien por puntos o por vectores estos valores
  • OpenGL rederiza en la pantalla y visualiza dichos puntos según le especifiquemos

CoordenadasOpenGLBásico.png

Coordenadadas del objeto

giramos para ver mejor
  • Lo giramos para ver la coordenada z. Esta parte luego la veremos
  • Para conseguirlo he girado 40º en el eje de x y 40º en el eje de y
  .. .. ..
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();   
    glRotatef(40.0f,1,0,0);
    glRotatef(40.0f,0,1,0);
    glutPostRedisplay();
  .. .. ..

Coordenadas del objeto

CoordenadasOpenGL.png

  • Este eje de coordenadas que hemos dibujado representaría el eje de coordenadas del objeto
  • Ahora dibujamos un objeto en él, por ejemplo una tetera
  • con la barra espaciadora podemos cambiar su representación, sólida o de alambres
  • Representación sólida

RTENOTITLE

  • Represetnación en alambres

RTENOTITLE

  • Representación girada

RTENOTITLE

  • Ahora hemos dibujado la tetera respecto al eje de coordenadas del mundo

Eje de coordenadas del objeto

  • En realidad el objeto está en una posición del espacio con sus coordenadas
  • La idea es llevármelo a las coordenadas del mundo, para mi de referencia
  • Planteamos este nuevo eje de coordenadas
  • Podemos ver que respecto al eje de coordenadas del mundo (0,0,0), tiene los siguientes vectores
(10,10,10)- (15,15,10)
(10,10,10)- (5,15,10)
(10,10,10)- (10,10,15)
  • Gráficamente lo podemos ver en la imagen (siempre respecto al eje de coordenadas de nuestro mundo (0,0,0) como centro

RTENOTITLE

  • Lo giramos para ver el componente z (Se observa en diferente posición pues lo he rotado respecto a X e Y de las coordenadas del mundo no de ella misma

RTENOTITLE

  • Vemos los dos ejes de coordenadas

RTENOTITLE

  • Lo giramos para verlo un poco mejor
  • Vemos el objeto en el eje de coordenadas del mundo global y lo queremos pasar al eje de coordenadas del mundo local o del objeto

RTENOTITLE

===Vamos a ver como pasar el objeto a las coordenadas locales

  • Para ello vamos a multiplicar cada vétice del objeto por una matriz de escena
  • Esta matriz permite realizar operaciones de rotación traslación y escalado
  • En nuestro caso queremos coger la tetera y
  1. Trasladarla al punto 10,10,10.
    1. trasladar 10 unidades en X
    2. trasladar 10 unidades en Y
    3. trasladar 10 unidades en Z
  2. Rotar 45 grados
Son en total 4 operaciones RTENOTITLE
.. ... .. 
  //Roto la tetera para llegar al eje de coordenadas del objeto
		  glTranslatef(10,10,10);
		  glRotated(45,0,0,1);
		  glutWireTeapot(3);
		  glFlush();
.. .. ..


Icon summary.gif

Resumen

  • En la escena tengo unos objetos
  • Cada uno tiene sus coordenadas coordenadas del objeto
  • Paso estas coordenadas a las coordenadas del mundo
  • Para ello multiplico por la matriz M que llamaremos matriz de escena
  • Sistema de coordenadas en que se define la escena. Define cómo se colocan los diferentes objetos en la escena.
  • La matriz de escena lleva movimientos de rotación traslación, giro, simetria, ...


 (X,Y,Z)mundo =(X,Y,Z)objeto * Mescena

La matriz de escena

  • En openGL especificamos que trabajamos con la matriz
 .. .. ..
 glMatrixMode(GL_MODELVIEW);
 .. .. ..
  • Tenemos dos tipos de matrices
  • Esta es la matriz Modelo Vista
  • Hasta ahora hemos especificado la parte del modelo o de la escena con rotaciones y traslaciones
  • Para realizar estas operaciones usamos las primitivas de openGL
 
 .. .. ..
   glRotatef(alpha,x,y,z);//rota ''alpha'' grados entorno al eje especificado ''x,y,x''
   glTranslatef(x,y,z); //Traslada la imagen x,y,z
   glScalef(sx,sy,xz);//Multiplica la matriz de escalado los factores sx,sy,xz.
 .. .. ..
  • Vemos ahora dos objetos y los desplazamos

Archivo:DosObjetos.png

  • Los desplazamos

Archivo:DosObjetosDesplazados.png

  • Si solo queremos desplazar un objeto respecto a otro
  • Entonces debemos mantener diferentes matrices de transformación a difernetes objetos de nuestra escena
  • Dibujamos un objeto
  • Lo desplazamos con M1
  • Recuperamos la matriz anterior
  • La aplicamos a los nuevos objetos
  • Lo vemos en las imágenes
  • OpenGL dispone de una pila para las matrices
  • Para guardar/recuperar matrices:
glPushMatrix();//Guarda la matriz en la pila acutal
glPopMatriz();//Recupera la matriz de la pila.
  • Estas funciones trabajan con la matriz actual.
  • El código asociado
void trasladaCubo(){
	static int i =0;
	 glClear(GL_COLOR_BUFFER_BIT);
	 glFlush();
	 glColor3f(1,0,0);
	 glPopMatrix();
	 glPushMatrix();
	 dibujaCoordenadas();
	 glutWireSphere(2,30,30);
	 glTranslatef(0,5+i++,0);
	 glutWireCube(2);
	 glFlush();
}