Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Camara En Opengl

Iniciado por angelfmarcos, 25 de Mayo de 2006, 03:33:17 PM

« anterior - próximo »

angelfmarcos

 Hola. Tengo un problema al implementar la camara en openGL para un pequeño motor que estoy desarrollando. La cámara debería funcionar indicandole un punto (posicion) y una orientacion (respecto al eje local de la propia camara y dado en angulos). Ahora mismo estoy usando el siguiente código:

 //Rota sobre el eje de la cámara
 glRotated (ang_c, 0.0f, 0.0f, 1.0f);
 glRotated (ang_b, 0.0f, 1.0f, 0.0f);
 glRotated (ang_a, 1.0f, 0.0f, 0.0f);
 glTranslated (-pos_x, -pos_y, -pos_z);


hasta ahora habia funcionando sin problemas pero he comenzado a detectarlos,

¿Cual sería la forma más correcta de implementar la cámara?

Un saludo.

ajmendoza

 hay una función que es:

glulookAt( posicionCamara_x, posicionCamara_y, posicionCamara_z,
                punto_donde_miraCamara_x,punto_donde_miraCamara_y,punto_donde_miraCamara_z,                  
                vectorhaciaArribaCamara_x,vectorhaciaArribaCamara_y,vectorhaciaArribaCamara_z )


No necesita mas explicaciones  ¿no? :P.

Create una clase que tenga todos esos datos de la camara (y mas que te harán falta). Cuando utilices el teclado o el ratón haz que varie esos valores de clase y en cada pasada actualiza la camara utilizando esta función y los atributos de la clase.

Saludos!



angelfmarcos

 Si, ya la había visto. Pero no consigo sacar el punto al que miro y el vector up a partir de la orientacion de la camara.

Lord Trancos 2

 Lo ideal es que pases de los "euler angles" y uses "quaternions".

Despues tan solo tienes que convertir la quaternion en una matriz, aplicarle la translacion y cargarla con glLoadMatrixf
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

angelfmarcos

 Lo he hecho asi, pero sigo teniendo los mismos problemas. Si la escena esta de frente,  todo va bien y la camara rota perfectamente sobre cualquier eje. el problema viene cuando tengo una vista lateral, en la que cuando rota la camara sobre el eje x, no me hace ni caso y en su lugar lo hace sobre el z (el y y el z los rota correctamente)

tamat

 Sobre camaras te puedo decir que el método que usabas tú es muy problematico, ya que si alteras el orden de las rotaciones el resultado no es el mismo con lo que esos valores no son absolutos. Ademas si tienes que hacer calculos con ellos te volveras loco.

Lo mejor es usar algun sistema en el que la orientación se guarde como un todo. Los más usados son las matrices de Euler (que es lo mismo que usa OpenGL para guardar las rotaciones) y los quaterniones.

Yo uso lo segundo pero te recomiendo que empieces por lo primero ya que es ligeramente más asequible.

En OPENGL existe una función que te permite extraer la matriz de rotación que se le aplicará a los vertices que pintes a continuación, dicha matriz se llama Modelview y la puedes sacar mediante la funcion glGetMatrix.

Te aconsejo que le eches una ojeada al tema de las matrices para transformaciones (rotacion, traslacion y escalado), aquí hay informacion.

Si todo esto no te gusta puedes usar glLookat como bien te han dicho, aunque para mantener el vector UP y TARGET actualizado tendras que aplicarles las rotaciones y para eso necesitaras o matrices o quaterniones así que tampoco ganas demasiado.

Si te vas a meter con tema 3D a fondo no te va a quedar más remedio que empollar estos temas, es lo que todos hemos hecho.

Espero haber sido de ayuda.
Por un stratos menos tenso

vicho

 yo la solucion que tenia era usar cordenadas esfericas y glulookat  :rolleyes:  

angelfmarcos

 He usado quaterniones (a partir de un ejemplo que he visto por ahi) y parece que la navegacion con el ratón va mejor (aunque no del todo perfecta). Sin embargo cuando trato de posicionar la camara en un punto en concreto y con una orientación determinada ahi puede pasar cualquier cosa :(

Buffon

 Como han dicho create una clase llamada Camara y en la cuál guardes toda la información y luego usas gluLookAt sino va a ser una putada.

Nosotros recurrimos a otra táctica, teniamos que guardar sucesivas transformaciones geométricas y que cada render de la camara se guardara bien y l oque haciamos era ir multiplicando la matriz antigua con la nueva generada y cargandola antes de las nuevas rotaciones que haciamos, así vas guardando el estado anterior pero no puedes hacer pasos atrás.

También puedes ir apilando las matrices y luego multiplicarlas para poder hacer pasos hacia atrás por si no te interesa el cambio efectuado.

La camara de OpenGL en si no es tan difícil una vez la entiendes, la putada es entenderla :)


killrazor

 gluLookAt es poco eficiente, ademas de que tendras problemas. Lo mejor es usar quaterniones. Basicamente fabricamos un quaternion por rotacion, los multiplicamos, los convertimos en matriz y los subimos con glMultMatrix.

A saco!!!!

ethernet

Cita de: "killrazor"gluLookAt es poco eficiente, ademas de que tendras problemas. Lo mejor es usar quaterniones. Basicamente fabricamos un quaternion por rotacion, los multiplicamos, los convertimos en matriz y los subimos con glMultMatrix.

A saco!!!!
Será todo lo ineficiente que quieras, pero para hacer 4 movimientos de cámara es muchísimo más que suficiente y en cuestión de minutos la tienes funcionando. Con quaternios todo es fantastico... después de haber estado unos días entendiendo el porqué o haciendo en una tarde un copy&paste de la virgen.

vicho

 si quieres algo rapido te recomiendo el siguiente link http://www.gamedev.net/reference/articles/...article2160.asp

killrazor segun tu que hace ineficiente al glulookat???

tamat

Cita de: "killrazor"gluLookAt es poco eficiente, ademas de que tendras problemas. Lo mejor es usar quaterniones. Basicamente fabricamos un quaternion por rotacion, los multiplicamos, los convertimos en matriz y los subimos con glMultMatrix.

A saco!!!!
qué coño importa que una función que se llama como máximo UNA VEZ por frame sea ineficiente?!?!
Por un stratos menos tenso

angelfmarcos

 La camara la he probado a hacer por varios métodos, pero no encuentro el que encaje del todo con lo que me hace falta. por ejemplo, con quaterniones iba genial la navegacion, pero al posicionar la camara con una orientacion concreta fallaba.

El método que tengo ahora va bien excepto para rotaciones sobre el eje z, que hace un poco lo que le da la gana :(


y aun que queda la parte complicada, localizar un objeto y centrarlo en la pantalla :(


Lord Trancos 2

Cita de: "angelfmarcos"... pero al posicionar la camara con una orientacion concreta fallaba....
Si te explicas un poco mejor o pones algo de codigo tal vez podamos ayudarte.  
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)






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.