Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Mas gluLookAt...

Iniciado por nsL, 28 de Octubre de 2007, 08:59:57 PM

« anterior - próximo »

nsL

Aloha!

Estoy trasteando con opengl y estoy teniendo problemas con las camaras y matrices en general por lo q veo.

Lo que estoy haciendo es poner una teapot con GLUT y apuntar la camara a ella, y con la tecla A mover la camara alrededor de la tetera sobre el eje Y. Lo que es el movimiento de la camara lo tengo x = radio*cos(angulo) y z = radio*sin(angulo). El problema es que no gira alrededor (si lo hace, pero no como circunferencia, hace cosas raras)

Aqui esta el código, mas simple que un hola mundo:


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

GLfloat camX=0.0f,camY=0.0f,camZ=0.0f;
static GLfloat angulo = 0.0f;

void resize(int width, int height)
{
   const float ar = (float) width / (float) height;
   
   glViewport(0, 0, width, height);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(45.0f,ar,1.0f,150.0f);
   
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity() ;
   
   gluLookAt( camX, camY, camZ, 0.0f, 0.0f, -5.0f,0.0, 1.0, 0.0);
}

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glColor3d(1,0,0);
   
   glLoadIdentity();
   gluLookAt( camX, camY, camZ, 0.0f, 0.0f, -5.0f, 0.0, 1.0, 0.0);

   glPushMatrix();
       glTranslated(0.0f,0.0f,-5.0f);    
       glutSolidTeapot(1);
   glPopMatrix();

   glColor3d(0,0,1);
   
   glPushMatrix();
       glBegin(GL_POINTS);
          glVertex3f(0.0f,0.0f,-5.0f);
       glEnd();
   glPopMatrix();
   
   glutSwapBuffers();
}


void key(unsigned char key, int x, int y)
{
   switch (key)
   {
       case 27 :
       case 'q':
           exit(0);
           break;
       case 'a':
            {
                angulo += 0.1f;
                camX = 10 * cos(angulo);
                camZ = 10 * sin(angulo);
                break;
            }
   }

   glutPostRedisplay();
}

void idle(void)
{
   glutPostRedisplay();
}

int main(int argc, char *argv[])
{
   glutInit(&argc, argv);
   glutInitWindowSize(640,480);
   glutInitWindowPosition(10,10);
   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

   glutCreateWindow("Pruebas");

   glutReshapeFunc(resize);
   glutDisplayFunc(display);
   glutKeyboardFunc(key);
   glutIdleFunc(idle);

   glClearColor(1,1,1,1);

   glutMainLoop();

   return EXIT_SUCCESS;
}


El problema viene con la translacion que le hago a la tetera (-5.0 en Z). Si esa translacion la hago a 0,0,0 y pongo que la camara apunte a 0,0,0 tambien, pues sale perfecto. El problema es q no me estoy enterando bien de como van lo de las matrices y me salen cosas raras, sino  no se explica.

Si alguien ve el fallo q me lo diga plis :)

Saludos y gracias de antemano!  8)
Yo no muero hasta la muerte -

Buffon

Tu mismo has dicho el error.

Siempre que pintas lo tienes que hacer pensando que eres el pinto de la escena y eliges las coordenadas.

Si quieres girar la tetera, siendo observador deberías hacer lo siguiente antes de pintar la tetera:


* Me desplazo al centro de la tetera.
* Roto en el Eje que quiera los angulos que quiera
* Me desplazo a dónde estaba:
* pinto la tetera.


 glPushMatrix();
 glTranslatef( 5.0f, 5.0f, 0.0f );
 glRotatef(anguloGiroX + pasadaX, 0.0f, 0.0f, 1.0f);
 glTranslatef( -5.0f, -5.0f, 0.0f);
 pintaTetera();
 glPopMatrix();


tienes que pensar que OpenGL piensa al revés que escribe. primero hace lo último, en forma de pila, según realizas las llamadas.

* pinto la Tetera.
* me desplazo -5,-5,0
* giro sobre el centro (miro para otro lado)
* me desplazo 5,5,0

con lo cuál, el pintor lo único que ha hecho ha sido desplazarse a otra posición.

---------

en matemáticas realizar un cambio de posición es muy costoso, hay que calcular una matriz enorme utilizando los centros, coordenadas alfa,beta,gamma de rotación, etc para hacerlo de una vez, lo que hace más sencilla la utilización de la formula X' = AX + B

A = rotación
B = translacción.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.