Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas controlando GluLookAt

Iniciado por SPARTANVS, 01 de Febrero de 2008, 09:37:44 PM

« anterior - próximo »

SPARTANVS

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();
}

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Martinez

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.

SPARTANVS

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

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í!»
Por un stratos menos tenso


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

SPARTANVS

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....

SPARTANVS

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






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.