Programación Específica > OpenGL
Re: Movimiento De Camara
Karkayu:
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:
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:
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:
--- 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
--- Fin de la cita ---
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 ---gluLookAt(camx,camy,camz,objx,objy,objz,vx,vy,vz);
Para calcular las coordenadas esferericas aplico las formulas:
--- Código: Text --- //Operamos segun las formulas camx=objx+distancia*sin(M_PI/180*azim)*cos(M_PI/180*elev); camy=objy+distancia*sin(M_PI/180*elev); camz=objz+distancia*cos(M_PI/180*azim)*cos(M_PI/180*elev); camx2=objx+distancia2*sin(M_PI/180*azim2)*cos(M_PI/180*elev2); camy2=objy+distancia2*sin(M_PI/180*elev2); camz2=objz+distancia2*cos(M_PI/180*azim2)*cos(M_PI/180*elev2); vx = camx2-camx; vy = camy2-camy; vz = camz2-camz;
Luego para mover la camara, solo debes variar el valor de los angulos azimutal y elevacion:
--- Código: Text ---void moverArriba(camara *cam){ distancia = modulo(cam); elev += 2; elev2 += 2; calcularCoordenadas(cam);}//moverArriba void moverAbajo(camara *cam){ distancia = modulo(cam); elev -= 2; elev2 -=2; calcularCoordenadas(cam);}//mover abajo void moverIzq(camara *cam){ distancia = modulo(cam); azim -= 2; azim2 -= 2; calcularCoordenadas(cam);}//moverIzqu void moverDer(camara *cam){ distancia = modulo(cam); azim += 2; azim2 += 2; calcularCoordenadas(cam);}//moverDer
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:
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
Navegación
[#] Página Siguiente
Ir a la versión completa