Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: SPARTANVS en 01 de Febrero de 2008, 09:37:44 PM

Título: Problemas controlando GluLookAt
Publicado por: SPARTANVS en 01 de Febrero de 2008, 09:37:44 PM
Ola, quiero hacer un programa en el que hay unas etetras y tu con la letra "d" rotas sobre ti mismo para la derecha y con la s a la izquierda. Lo hago moviendo el objetivo de GluLookAt alrededor de la camara. He hecho mis calculos y eso y aunque creo que es una manera muy novata de rotar sobre si mismo, tendria que funcianar. No se que falla en el programa, si mis calculos, si el mismo programa o lo que yo creo: los vectores de GluLookAt, que no se como controlarlos. (no quiero hacerlo con rotaciones a toda la escena, sino con GluLookAt).

El programa se ejecuta, y rota al principio bien, pero de repente cuando he rotado un poco se desvia y no sigue rotando bien.

#include <gl/glut.h>
#include <stdio.h>
#include <stdlib.h>

int i;

short cont=1;

float rotx=1.0;
float rotz=0.0;



void display (void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(20.0f, 1.0f, 1.0f, 10.0f);

gluLookAt(0.0, 10.0, 0.0,
rotx, 0.0, rotz,
0.0, 1.0, 0.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();


for (i=0; i<10; i++)
{
glPushMatrix();
glRotatef(i * 360 / 10, 0.0f, 1.0f, 0.0f);
glTranslatef(1.5f, 0.0f, 0.0f);
glutWireTeapot(0.25);
glPopMatrix();
}


glFlush();
glutSwapBuffers();
}



void teclado(unsigned char key, int x, int y)
{
switch (key)
{
case 27:
exit(0);
return;

case 'd':
if (rotz==0.0, rotx==1.0)
{
cont=1;
}

if (rotz==1.0, rotx==0.0)
{
cont=2;
}

if (rotz==0.0, rotx==-1.0)
{
cont=3;
}

if (rotz==-1.0, rotx==0.0)
{
cont=4;
}


switch (cont)
{
case 1:
rotx=rotx-0.01;
rotz=rotz+0.01;
break;

case 2:
rotx=rotx-0.01;
rotz=rotz-0.01;
break;

case 3:
rotx=rotx+0.01;
rotz=rotz-0.01;
break;

case 4:
rotx=rotx+0.01;
rotz=rotz+0.01;
break;
}

display();

return;

case 's':
if (rotz==0.0, rotx==1.0)
{
cont=1;
}

else if (rotz==1.0, rotx==0.0)
{
cont=2;
}

else if (rotz==0.0, rotx==-1.0)
{
cont=3;
}

else if (rotz==-1.0, rotx==0.0)
{
cont=4;
}


switch (cont)
{
case 1:
rotx=rotx+0.01;
rotz=rotz-0.01;
break;

case 2:
rotx=rotx+0.01;
rotz=rotz+0.01;
break;

case 3:
rotx=rotx-0.01;
rotz=rotz+0.01;
break;

case 4:
rotx=rotx-0.01;
rotz=rotz-0.01;
break;
}
display();
return;
}
}

void rescaler(GLsizei w, GLsizei h)
{
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(90.0, (float)w/(float)h, 2.0, 7.0);
glViewport (0, 0, w, h);
glMatrixMode (GL_MODELVIEW);
}



void main(void)
{
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(800, 800);
glutInitWindowPosition(100, 100);
glutCreateWindow("Moviendo camara");
glutReshapeFunc(rescaler);
glutKeyboardFunc (teclado);

glutDisplayFunc(display);

glutMainLoop();
}
Título: Problemas controlando GluLookAt
Publicado por: davidgf en 02 de Febrero de 2008, 02:16:23 AM
El segundo parametro de la función es la posición del espacio a donde mira. Yo de ti usaría una variable angle y entonces haria  rotx = sin (angle), rotz = cos(angle) o al reves pero con sen/cos. No se si estoy en lo cierto pero debería ir.

David
Título: Problemas controlando GluLookAt
Publicado por: Martinez en 02 de Febrero de 2008, 01:05:14 PM
Los tres parametros (con sus componentes x,y z que hacen 9 parametros) son la posicion, donde mira y "donde esta arriba"(Up). El problema es el vector Up, ese vector le indica la rotacion de la camara, imagina que tienes una camara de fotos, no es lo mismo cogerla en horizontal que cogerla en vertical. Eso es lo que indica el vector Up.

Esto:
glLookAt(0,0,10, 0,0,0, 0,1,0) es parecido a glLookAt(0,0,10, 0,0,0, 0,-1,0)
solo que en esta ultima lo ves boca abajo.

El problema es cuando se da el caso:

glLookAt(0,10,0, 0,0,0, 0,1,0) aqui es cuando hace cosas raras. Tienes que evitar este caso o poner el siguiente:

glLookAt(0,10,0, 0,0,0, 0,0,1)  o 1,0,0 o 0,0,-1 .......


Segunda cosa:

Para rotaciones utiliza coordenadas circulares (2D) o esfericas (3D). En las circulares son asi:
x=R*sin(ang) y z=R*cos(ang) donde ang es un angulo en radianes.

Y si quieres rotar sobre el mismo plano debes usar la misma componenete y en los vectores pos y dir.

glLookAt(0,10,0 sin(ang),10,cos(ang),  0,1,0);

De esta forma nunca se dara el caso de error de arriba. Recuerda que ang es en radianes.
Título: Problemas controlando GluLookAt
Publicado por: SPARTANVS en 02 de Febrero de 2008, 09:24:24 PM
gracias por las respuestas, que bien explicado jeje. aunq1ue antes de hacer el programita voy a tener que investigar el sin/cos ese y los radianes. No es k no se me den las mates, es que estoy en un nivel bajito.

GRACIAS
Título: Problemas controlando GluLookAt
Publicado por: tamat en 02 de Febrero de 2008, 09:32:03 PM
«¡Y os aseguro que vendré a castigar con gran venganza y furiosa cólera a aquéllos que pretendan ser gamedevelopers y no conozcan las matemáticas! ¡Y tú sabrás que mi nombre es Carmack cuando mi venganza caiga sobre tí!»
Título: Problemas controlando GluLookAt
Publicado por: Martinez en 02 de Febrero de 2008, 09:35:03 PM
Pues para la programacion grafica un poquillo de coordenadas y operaciones con matrices no viene mal. Y saber trabajar con vectores

http://es.wikipedia.org/wiki/Trigonometr%C3%ADa#Razones_trigonom.C3.A9tricas
http://es.wikipedia.org/wiki/Coordenadas_cartesianas
http://es.wikipedia.org/wiki/Coordenadas_polares
http://es.wikipedia.org/wiki/Vector_%28geometr%C3%ADa%29


Mirate por encima eso.
Título: Problemas controlando GluLookAt
Publicado por: Martinez en 02 de Febrero de 2008, 09:40:36 PM
Cita de: "tamat"«¡Y os aseguro que vendré a castigar con gran venganza y furiosa cólera a aquéllos que pretendan ser gamedevelopers y no conozcan las matemáticas! ¡Y tú sabrás que mi nombre es Carmack cuando mi venganza caiga sobre tí!»

Eso no es algo parecido al sermon de Jules Winnfield(Samuel L jackson) en Pulp Fiction???

Jeje muy buena frase, me encanta
Título: Problemas controlando GluLookAt
Publicado por: SPARTANVS en 03 de Febrero de 2008, 12:28:24 AM
Cita de: "Martinez"
Cita de: "tamat"«¡Y os aseguro que vendré a castigar con gran venganza y furiosa cólera a aquéllos que pretendan ser gamedevelopers y no conozcan las matemáticas! ¡Y tú sabrás que mi nombre es Carmack cuando mi venganza caiga sobre tí!»

Eso no es algo parecido al sermon de Jules Winnfield(Samuel L jackson) en Pulp Fiction???

Jeje muy buena frase, me encanta

si es verdad, pero por lo menos por mi parte se lo que tengo que aprender para adentrarme en programacion, pero no en las matematicas. No hay el tipico (o no lo encuentro) que te diga, pues se debe empezar por aqui, despues haces cuentas de esto despues lo otro....
Título: Problemas controlando GluLookAt
Publicado por: SPARTANVS en 03 de Febrero de 2008, 12:29:32 AM
Cita de: "Martinez"Pues para la programacion grafica un poquillo de coordenadas y operaciones con matrices no viene mal. Y saber trabajar con vectores

http://es.wikipedia.org/wiki/Trigonometr%C3%ADa#Razones_trigonom.C3.A9tricas
http://es.wikipedia.org/wiki/Coordenadas_cartesianas
http://es.wikipedia.org/wiki/Coordenadas_polares
http://es.wikipedia.org/wiki/Vector_%28geometr%C3%ADa%29


Mirate por encima eso.

ha se me olvidaba muchas gracias por los links  :P  :P