Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Loover en 20 de Noviembre de 2002, 05:05:08 PM

Título: Rotaciones en OpenGL
Publicado por: Loover en 20 de Noviembre de 2002, 05:05:08 PM
                                Bueno uso este código para trasladar y rotar un objeto:



// Dibujamos

glPushMatrix();

 // Traslación

 glTranslatef (x, y, z);  

   

 // Rotación

 

 glRotatef (surfaces [id].spin.angle,

      surfaces [id].spin.axisX,

      surfaces [id].spin.axisY,

      surfaces [id].spin.axisZ);

 

 // Dibujamos

 glCallList (displayList);

 glFlush ();

glPopMatrix();



Funciona correctamente, el objeto (en este caso una imagen) rota los grados que indico en surfaces [id].spin.angle.
Ahora bien, siempre rota con respecto al mismo origen, la esquina superior izquierda de la imagen.
¿Cómo hago para cambiar ese origen para que por ejemplo rote con el origen en el centro de la imagen?

Un saludo.                                
Título: Rotaciones en OpenGL
Publicado por: synchrnzr en 20 de Noviembre de 2002, 06:00:07 PM
                                No entiendo mucho de esto pero yo que ti pondría un Translatef() debajo del Rotatef() para centrar la imagen en el origen antes de rotarla ;)

Sync                                
Título: Rotaciones en OpenGL
Publicado por: Loover en 20 de Noviembre de 2002, 06:51:15 PM
                                mande? eso no arregla nada.

Lo que quiero, a ver si logro explicarme, es... imagina un folio, lo atravieso con un alfiler (en el medio por ejemplo) y le doy vueltas. Pues bien, cuando roto mi imagen, es como si el el afiler lo hubiese clavado en la esquina superior izquierda, y no sé cambiarlo :(
No te despiste la traslación primera, eso solo situa la imagen en pantalla en una posición (x, y) (con respecto a la esquina superior izquierda de la imagen).                                
Título: Rotaciones en OpenGL
Publicado por: NeLo en 20 de Noviembre de 2002, 06:59:06 PM
                                Loover la rotación se hace con eje en la posición actual del objeto.

¿Nunca te han dicho que primero  se rota y luego se traslada? :P

Saludos.                                
Título: Rotaciones en OpenGL
Publicado por: Loover en 20 de Noviembre de 2002, 07:16:10 PM
                                ¿Qué mas da trasladar y luego rotar, que rotar y luego trasladar? ¿O si da?

He probando a poner el traslate DESPUES del rotate y se dibuja EXACTAMENTE en la misma posición.
¿Era eso lo que me decias que hiciera?                                
Título: Rotaciones en OpenGL
Publicado por: synchrnzr en 20 de Noviembre de 2002, 07:16:26 PM
                               
Citarmande? eso no arregla nada

:o

A ver lo que digo es que muevas tu objeto de forma que quede centrado poniendo Translatef() antes de rotarlo.



// Dibujamos

  glPushMatrix();

     // Traslación

     glTranslatef (x, y, z);      

           

     // Rotación

     

     glRotatef (surfaces [id].spin.angle,

              surfaces [id].spin.axisX,

              surfaces [id].spin.axisY,

              surfaces [id].spin.axisZ);

         

     // HAZ QUE ESTE TRANSLATEF() DEJE TU OBJETO CENTRADO EN EL ORIGEN PORQUE MÁS ARRIBA, CUANDO HACES LA ROTACIÓN, TE LA HAGA RESPECTO AL ORIGEN (o al punto que quieras, lo pongo en mayúsculas pa que se vea más en medio del código ^_^')

     glTranslatef (x, y, z);



     // Dibujamos

     glCallList (displayList);

     glFlush ();

  glPopMatrix();



Sync                                
Título: Rotaciones en OpenGL
Publicado por: synchrnzr en 20 de Noviembre de 2002, 07:19:49 PM
                                Ooops, no había visto tu nuevo mensaje. No, no da lo mismo trasladar primero y rotar después que al revés. Al trasladar y rotar lo que haces es multiplicar las coordenadas de los vértices y demás por las matrices de rotación y traslación y el producto de matrices no es conmutativo (para más info, búscate un libro de álgebra ^_^')

Sync                                
Título: Rotaciones en OpenGL
Publicado por: Loover en 20 de Noviembre de 2002, 07:23:19 PM
                                Al poner el codigo que me has dado lo que hace es: primero ponerse como estaba y luego  trasladarse x hacia la izquierda e y hacia abajo (en mi caso 30 y 30). :(                                
Título: Rotaciones en OpenGL
Publicado por: synchrnzr en 20 de Noviembre de 2002, 07:24:24 PM
                                Supongo que no le estarás poniendo las mismas x, y, z que en el translatef() de arriba, tienes que poner unos valores para que quede centrado... ^_^'

Por ejemplo, si tienes un cubo de 20 de lado en el octante positivo, deberías ponerle un translatef(-10,-10,-10)

Sync                                
Título: Rotaciones en OpenGL
Publicado por: Loover en 20 de Noviembre de 2002, 07:27:14 PM
                                claro q si le ponia los mismos, jajaja :) y valen x= 30 e y = 30
Y claro pasaba esto:

Hace esto:
Primero se pone la imagen en (30,30)
Rota 10 grados respecto de la esquina superior izquierda
Se vuelve a trasladar, ahora esta (esa esquina) en (60,60)

¿La pregunta es, como calculo esa nueva traslacion para que parezca q ha rotado por ejemplo... con la esquina inferior izquierda?                                
Título: Rotaciones en OpenGL
Publicado por: synchrnzr en 20 de Noviembre de 2002, 07:30:59 PM
                                No me entiendes :llorando:

Mira lo que mide tu objeto y céntralo con el translatef() que te he añadido :D

Sync

PD: Es que ya no sé que más decirte ^_^'                                
Título: Rotaciones en OpenGL
Publicado por: synchrnzr en 20 de Noviembre de 2002, 07:35:55 PM
                               
Citar¿La pregunta es, como calculo esa nueva traslacion para que parezca q ha rotado por ejemplo... con la esquina inferior izquierda?

Si el objeto mide, por ejemplo, 10x60 y ahora dices que te lo rota a partir de la esquina superior izquierda, ponle un translatef(0,60,0) ;)


Sync                                
Título: Rotaciones en OpenGL
Publicado por: Loover en 20 de Noviembre de 2002, 07:36:45 PM
                                Ah, pijo, era tan facil como poner en el segundo traslate: (0, -altoimagen, z)

No entendia lo que me deciais, joder soy un poco lento.
Muchas gracias.                                
Título: Rotaciones en OpenGL
Publicado por: synchrnzr en 20 de Noviembre de 2002, 07:41:56 PM
                                De nada, me alegro que haya valido la pena el esfuerzo :D

Sync