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.
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
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).
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.
¿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?
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
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
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). :(
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
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?
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 ^_^'
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
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.
De nada, me alegro que haya valido la pena el esfuerzo :D
Sync