• Lunes 25 de Octubre de 2021, 03:34

Autor Tema:  Re: Movimiento De Camara  (Leído 15978 veces)

Karkayu

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Movimiento De Camara
« en: Viernes 16 de Marzo de 2007, 19:03 »
0
Hola a todos:

Estoy modelando una escena con openGL/GLUT y me gustaria poder rotar la camara alrededor de dicha escena.

Mi intencion es que la camara gire alrededor de un punto de la escena (como si la escena estuviera dentro de una esfera y la camara se moviera por ella). Para ello usaria los cursores.
Usando arriba/abajo la camara se deberia mover siguiendo el recorrido de un meridiano y con izquierda/derecha la camara se moveria siguiendo el recorrido de un paralelo.

He visto varios tutoriales sobre el movimiento de la camara pero en todos ellos lo que hacen es rotar la escena (con gltranslate y glrotate). Eso no es lo que yo busco ya que, para mi, eso es una perdida de rendimiento importante (sobre todo si no se posee una celeradora 3D) ya que mi escena comienza a ser ostentosa en contenido.

Mi idea es mover la camara variando para ello los valores de los parametros de la funcion gluLookAt .
Para ello paso las coordenadas de la posicion de la camara  a coordenadas esfericas (usando las correspondientes formulas matematicas), hago un incremento del angulo azimutal o elevacion (segun el movimiento que vaya a hacer) y vuelvo a pasar de esfericas a coordenadas de mundo.

El problema que tengo es el siguiente:
Haciendo lo antes comentado, la primera vez que toco alguna tecla para mover la camara (en cualquier direccion), la camara me da un salto y se coloca en otro sitio en el espacio  :blink:
Una vez realizado ese salto, ya gira todo correctamente.

¿Como evito ese salto?

El salto en cuestion mueve literalmente la camara de sitio (he ido mirando los valores de las variables que uso en el gluLookAt en cada momento y cambian bruscamente la primera vez que pulso una tecla).

¿Alguna idea/sugerencia?
¿Es correcto el metodo que estoy usando o conoceis otro mejor?

Un saludo

PD.- Programo con OpenGL/GLUT, en C y bajo Linux  :comp:

Karkayu

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Movimiento De Camara
« Respuesta #1 en: Sábado 17 de Marzo de 2007, 16:20 »
0
Bueno, ya esta solucionado  :D
Realizaba mal la inicializacion de los valores.

Solo calculaba las coordenadas esfericas en el momento de pulsar alguna tecla y, obviamente, la primera vez la camara no tendria porque estar en el sitio que yo la colocaba.

Lo he resuelto llamando a la funcion calcularCoordenadas en el main. Asi me coloca bien la camara al principio y no da el salto al girarla.

Un saludo y gracais a los que me habeis leido  :)

Ricardoo

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Movimiento De Camara
« Respuesta #2 en: Lunes 11 de Junio de 2007, 07:37 »
0
Hola Karkayu:
Estoy haciendo un sistema solar en opengl, ya lo tengo casi terminado, lo unico que me falta es mover la camara por la galaxia, para ello utilizo la funcion gluLookAt, pero no logro variar de forma correcta los parametros.

No logro rotar los 360 grado y cuando roto un poco ni siquiera me desplaso hacia donde estoy mirando.

podrias ayudarme con esto ?
podrias mostrarme de que forma varias las coordenadas de gluLookAt ?

te lo voy a agradecer muchisimo

Karkayu

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Movimiento De Camara
« Respuesta #3 en: Lunes 2 de Julio de 2007, 19:27 »
0
Cita de: "Ricardoo"
Hola Karkayu:
Estoy haciendo un sistema solar en opengl, ya lo tengo casi terminado, lo unico que me falta es mover la camara por la galaxia, para ello utilizo la funcion gluLookAt, pero no logro variar de forma correcta los parametros.

No logro rotar los 360 grado y cuando roto un poco ni siquiera me desplaso hacia donde estoy mirando.

podrias ayudarme con esto ?
podrias mostrarme de que forma varias las coordenadas de gluLookAt ?

te lo voy a agradecer muchisimo
Lo que yo hago es pasar a coordenadas esfericas, me muevo y luego deshago el cambio.

Las formulas para estos cambios la spuedes encontrar en cualquier libro de matematicas. De todas formas te pongo las que uso:

ROTACIONES DE LA ESCENA
x = distancia * sin (azim) * cos (elev);
y = distancia * sin (elev);
z = distancia * cos (azim) * cos (elev);


La funcion glutLookAt la tengo asi:
Código: Text
  1. gluLookAt(camx,camy,camz,objx,objy,objz,vx,vy,vz);
  2.  

Para calcular las coordenadas esferericas aplico las formulas:

Código: Text
  1.     //Operamos segun las formulas
  2.     camx=objx+distancia*sin(M_PI/180*azim)*cos(M_PI/180*elev);
  3.     camy=objy+distancia*sin(M_PI/180*elev);
  4.     camz=objz+distancia*cos(M_PI/180*azim)*cos(M_PI/180*elev);
  5.      
  6.     camx2=objx+distancia2*sin(M_PI/180*azim2)*cos(M_PI/180*elev2);
  7.     camy2=objy+distancia2*sin(M_PI/180*elev2);
  8.     camz2=objz+distancia2*cos(M_PI/180*azim2)*cos(M_PI/180*elev2);
  9.      
  10.     vx = camx2-camx;
  11.     vy = camy2-camy;
  12.     vz = camz2-camz;
  13.  

Luego para mover la camara, solo debes variar el valor de los angulos azimutal y elevacion:

Código: Text
  1. void moverArriba(camara *cam){  
  2.   distancia = modulo(cam);
  3.   elev += 2;
  4.   elev2 += 2;
  5.   calcularCoordenadas(cam);
  6. }//moverArriba
  7.  
  8. void moverAbajo(camara *cam){
  9.   distancia = modulo(cam);
  10.   elev -= 2;
  11.   elev2 -=2;
  12.   calcularCoordenadas(cam);
  13. }//mover abajo
  14.  
  15. void moverIzq(camara *cam){
  16.   distancia = modulo(cam);
  17.   azim -= 2;
  18.   azim2 -= 2;
  19.   calcularCoordenadas(cam);
  20. }//moverIzqu
  21.  
  22. void moverDer(camara *cam){
  23.   distancia = modulo(cam);
  24.   azim += 2;
  25.   azim2 += 2;
  26.   calcularCoordenadas(cam);
  27. }//moverDer
  28.  

El tipo CAM es una struct con los valorres de los vectores cam,obj y V (lo hago asi por comodidad).
La función módulo clacula el módulo del vector cam-obj

Perdon por tardar en responder  :rolleyes:

Ya me contaras si te va. Un saludo

escondido

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Movimiento De Camara
« Respuesta #4 en: Viernes 11 de Enero de 2008, 18:02 »
0
hola Karkayu tengo el mismo problema de QUOTE, pero aun no logro move rla camara, un favor puedes mostrarme la funcion modulo(cam);, de antemano te agradezco saludos

Karkayu

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: Movimiento De Camara
« Respuesta #5 en: Sábado 8 de Marzo de 2008, 13:47 »
0
Cita de: "escondido"
hola Karkayu tengo el mismo problema de QUOTE, pero aun no logro move rla camara, un favor puedes mostrarme la funcion modulo(cam);, de antemano te agradezco saludos
La función modulo tan solo calcula el modulo del vector pcam-obj. Siendo pcam la posicion donde esta colocada la camara y obj hacia que punto mira la camara.

Dicho esto, el codigo es este:
Código: Text
  1. //Devuelve el modulo del vector pcam-obj
  2. float modulo(camara *cam){
  3.  
  4.   GLfloat camx, camy, camz;
  5.   GLfloat objx, objy, objz;
  6.  
  7.  
  8.   //Inicializamos las variables temporales
  9.   camx = cam->pcamx;
  10.   camy = cam->pcamy;
  11.   camz = cam->pcamz;
  12.  
  13.   objx = cam->objx;
  14.   objy = cam->objy;
  15.   objz = cam->objz;
  16.  
  17.   return sqrt((camx-objx)*(camx-objx) + (camy-objy)*(camy-objy) +(camz-objz)*(camz-objz));
  18.  
  19. }//modulo
  20.  

El tipo camara que uso lo tengo definido asi:
Código: Text
  1. struct tipo_camara{
  2.   //Posicion de la camara
  3.   GLfloat camx, camy, camz;
  4.   GLfloat objx, objy, objz;
  5.   GLfloat vx, vy, vz;
  6.  
  7.   //Valores para Orto
  8.   GLfloat xmin,xmax;
  9.   GLfloat ymin,ymax;
  10.   GLfloat zmin,zmax;
  11. }camara;
  12.  

Un saludo

el_pregunta

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Movimiento De Camara
« Respuesta #6 en: Viernes 5 de Diciembre de 2008, 22:34 »
0
Tengo tu mismo problema pero no se como lo has solucionado, es decir, yo tengo mi cámara en el 0 0 0 y al principio se ve todo bien, pero al darle, se me coloca en la otra punta de la escena, pero no entiendo como haces la inicialización, porque yo supongo que mi cámara esta en el 0 0 0 y a partir de ahí empiezo a rotar, no entiendo muy bien porque se me va a la otra punta, y luego , otra cosa que no se si te pasa, yo no puedo dar la vuelta entera, cuando voy a darla es como si empezase pro e otro lado, ¿Como lo hiciste?

EDITO: Ya recalcule y casi queda bien, salvo que cuando voy en un sentido si va bien, y en el otro no hace nada

spekwhite

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Movimiento De Camara
« Respuesta #7 en: Martes 20 de Enero de 2009, 13:52 »
0
Hola:

Estoy intentando conseguir este movimiento de la camara pero no entiendo muy bien este codigo. A que nos referimos con camx2 y sus correspondientes y e z ??

Es que no se como se calculan las coordenadas. Alguno que me esplique un poco por favor. Muchisimas gracias.

javiercito21

  • Nuevo Miembro
  • *
  • Mensajes: 1
  • Nacionalidad: sv
    • Ver Perfil
Re: Movimiento De Camara
« Respuesta #8 en: Sábado 11 de Abril de 2009, 02:39 »
0
Hola, soy nuevo con OpenGL y estoy empezando a travesear ahi.

Con respecto al movimiento de la camara, yo quiero hacer eso, ya tengo la figura dibujada, y quiero modificar el punto de vista con la funcion glLookAt, esto al presionar las teclas arriba, abajo, izquierda y derecha.

Como hago esto???

gracias de antemano

Docma

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Movimiento De Camara
« Respuesta #9 en: Miércoles 24 de Febrero de 2010, 02:11 »
0
Hola Karkayu,

Por si ves el foro, Muchisimas Gracias, de Verdad y de Corazon.

Estoy haciendo un motor grafico ( C++, OpenGL y SDL ) y solo me queda terminar la camara y el sistema de colisiones ( Motor mio propio (nada de wrapper, motor completo), y nada de copiar y pegar, jajajaja )

En especial estaba liandome con la camara al intentar mover X objeto y a la vez la camara, ya que con las coordenadas, al ser esféricas, no había caido en la cuenta.

Muchisimas Gracias por la aclaracion de coordenadas en la camara para el movimiento (me faltaba el calculo de las mismas y andaba un poco pez con la Geometria, jajajaja).


Un Saludo y Cuidate


Docma