Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Rotaciones en OpenGL

Iniciado por Loover, 20 de Noviembre de 2002, 05:05:08 PM

« anterior - próximo »

Loover

                                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.                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

synchrnzr

                                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                                

Loover

                                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).                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

NeLo

                                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.                                
Drowning deep in my sea of loathing

Loover

                                ¿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?                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

synchrnzr

                               
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                                

synchrnzr

                                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                                

Loover

                                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). :(                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

synchrnzr

                                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                                

Loover

                                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?                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

synchrnzr

                                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 ^_^'                                

synchrnzr

                               
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                                

Loover

                                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.                                
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

synchrnzr

                                De nada, me alegro que haya valido la pena el esfuerzo :D

Sync                                






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.