c++ Opengl problema no puedo hacer un correcto movimiento de cámara con rotación

Iniciado por zargonori, 13 Noviembre 2015, 21:03 PM

0 Miembros y 1 Visitante están viendo este tema.

zargonori

estoy trabajando iluminación y sólidos de rotación con malla poligonal en mi clase. pero el problema que tengo es que para poder ver toda la escena necesito poder mover mi cámara apropiadamente, rotando y trasladandola cuanto desee, siempre caminando hacia donde mire.

pero
-si roto y después traslado la cámara caminara en una dirección incorrecta.
-si translado y después roto, rotara sobre su centro.
-y si convino traslaciones para reparar la rotación la traslación se daña y viceversa.

por si acaso esta es mi cámara actual

-todas mis variables están inicializadas en 0 y son flotantes
-r es mi angulo de rotación
-y f es una variable que aumento y disminullo por teclado para controlar el caminado

glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
gluPerspective(65.0, 2 / 1, 1, 10);
float m[9];
   m[0] = cos(r);      m[3] = 0;      m[6] = sin(r);
   m[1] = 0;         m[4] = 1;      m[7] = 0;
   m[2] = -sin(r);      m[5] = 0;      m[8] = cos(r);
   
      
   float n[3];
   n[0] = d + f*dd + 0.0001*dd;
   n[1] = e;
   n[2] = (ss + f*jj) + 0.0001*jj;
   
   d = m[0] * n[0] + m[3] * n[1] + m[6] * n[2];
   e = (A*cos(W*tiempo) + H);
   j = m[2] * n[0] + m[5] * n[1] + m[8] * n[2];
   

   float w[3];
   w[0] = 0;
   w[1] = e;
   w[2] = 1;

   dd = m[0] * w[0] + m[3] * w[1] + m[6] * w[2];
   ee = (A*cos(W*tiempo) + H);
   jj = m[2] * w[0] + m[5] * w[1] + m[8] * w[2];

   gluLookAt(d+f*dd, e, ss+f*jj, d, e, j, 0, 1, 0);

por favor si me pudieran decir la forma correcta en que debo trasladar y girar mi cámara para poder siempre caminar hacia donde miro y rotar sobre mi eje se los agradeceria.

post-data: primera ves que uso este foro, no supe como utilizar bien lo de incluir codigo.Ademas me disculpo si cometo errores ortográficos.

class_OpenGL

Primero, no deberías usar las versiones de OpenGL antiguas. Lo segundo: lo primero que se ha de hacer es trasladar y luego rotar. No sé muy bien como iba en las versiones anteriores a la 3, pero lo que tendrías que hacer es lo siguiente:

projectionMatrix*(rotationMatrix*(translateMatrix*GL_MODELVIEW_MATRIX))

Cuando traslades el objeto, ten en cuenta el ángulo

Código (cpp) [Seleccionar]
if(wKeyIsPressed) {
    position.z += K * cos(fAngleY); // La K es una constante
    position.x -= K * sin(fAngleY);
}

Y así con todas las teclas

Corregidme si me equivoco, pues suelo tratar con temas de renderizado y todo eso, no estoy acostumbrado a trasladar, rotar, ni cámaras... (si, suena estúpido, pero es así :P)

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

6666

Para manipular c++ con mayor precision y coherencia es usar estructuras  o clases y punteros, no puedes manipular la info de cualquier manera,


Ejemplo:

int A;
int *pA;

pA = &A;

Supongamos 2 estructuras .. una coordenadas de movimiento y otras camara ..

por concepto las estructuras contendran las mismas variables declaradas:

Asi que te refieres a ellas:

int A;
int *pA;

pA = &A;

Y usaras una referencia para las dos funciones, creando una struct puedes modificarlas agregandole unos numeros mas para que la camara se diferencie.

Lo que tiene tu code es declaraciones sintetizadas, lo que hace empeorar la lectura, obviamente necesitas una clase y sus constructores/destructores correspondientes.