Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Opengl, Rotación Y Traslación Sobre Ejes Relativos

Iniciado por Anderson, 05 de Diciembre de 2005, 10:53:02 PM

« anterior - próximo »

Anderson

 Hola a todos. A ver si me podeis echar una mano:

Estoy haciendo una pequeña demo de una figura que tiene que trasladarse por la pantalla y rotar respecto a sus tres ejes relativos, desplazarse por la pantalla hacia delante y hacia atrás en la dirección que marque el eje blanco, lateralmente en la dirección que marca el eje azul, y hacia arriba y hacia abajo en la que marca el rojo. La camara permance en la misma posición. Estoy utilizando OpenGL con ayuda de GLUT y algunos comandos glu. Aquí os dejo unas imágenes:

http://www.livejournal.com/users/anderson_...jag/2005/11/11/
http://www.livejournal.com/users/anderson_...jag/2005/10/19/

El eje x sería el azul, el y el rojo y el z el blanco. El caso es que ya he logrado hacer todo esto a base de no guardar/restaurar el estado de la matriz Vista de Modelo, y para hacer la rotación, utilizar 3 instrucciones glRotate que efectúen una rotación de alrededor de los vectores (1,0,0)  , (0,1,0) y (0,0,1), teniendo tres diferentes ángulos:  xRot, yRot y zRot. Para la traslación, utilizo glTranslate y tres variables xTrasl, yTrasl y zTRasl. En un principio quedaba así:

glTranslatef( xTrasl, yTrasl, zTrasl );

glRotatef( xRot, 1.0f, 0.0f, 0.0f );
glRotatef( yRot, 0.0f, 1.0f, 0.0f );
glRotatef( zRot, 0.0f, 0.0f, 1.0f );

El problema con todo esto y con no guardar/restaurar la es que no estoy partiendo de una base sólida y creo que con este planteamiento se puede hacer esto y poco más (cuando he tratado de hacer rotar la cámara con el ratón, se ha vuelto ingobernable). Por ello he desechado esta perspectiva y he vuelto a empezar.

Ahora estoy guardando el estado de la matriz Vista de Modelo, dibujando y recuperando dicho estado. Pero ni la figura rota ni se desplaza con respecto a sus ejes relativos, sino con respecto a (1,0,0) , (0,1,0), (0,0,1) ;lógico, es lo que yo estoy especificando :P Dado que con glRotate hay que especificar el vector alrededor del que se ha de rotar, para averiguar dicho vector se me ha ocurrido especificar las coordenadas (x,y,z) del vector que corresponda en base a relaciones trigonométricas. Así, el tema queda:

glPushMatrix(); // En realidad, el estado que se guarde será el de la
               // Matriz Identidad

glTranslatef ( xTrasl, yTrasl, zTrasl );

glRotatef( xRot, cos(yRot), sin(zRot), sin(yRot) );
glRotatef( yRot, sin(zRot), cos(xRot), sin(xRot) );
glRotatef( zRot, sin(yRot), sin(xRot), cos(xRot) );

// Dibujar figura con glBegin(GL_TRIANGLES) y glEnd()

glPopMatrix();
   
Buén intento... mientras rotas la figura en una posición que coincida con (1,0,0) , (0,1,0)  , (0,0,1) ,pero en cuanto tratas de rotar la figura respecto de algún eje relativo (una segunda vez has rotado la figura hacia alguna dirección y en esa posición la has dejado) se vuelve completamente loca y se coloca en todas las posiciones imaginables :P Con respecto a la traslación, no se traslada respecto a las coordenadas relativas.

En fín, no sé si lo que pretendo hacer debe realizarse de otra manera (utilizar otras instrucciones de OpenGL, glu ó gltools), o se necesitan más cálculos de álgebra de los que yo creía. Espero vuestras sugerencias y comentarios ;)

zupervaca

 no entiendo muy bien lo que quieres hacer, pero me imagino que el problema es que estas moviendo el modelo y luego rotandolo, y lo que quieres es rotarlo y luego moverlo, ademas debes de quitar el cos, sin, etc de las funciones de rotacion

mira seria algo asi:

glRotatef( xRot, 1.0f, 0.0f, 0.0f );
glRotatef( yRot, 0.0f, 1.0f, 0.0f );
glRotatef( zRot, 0.0f, 0.0f, 1.0f );
glTranslatef( xTrasl, yTrasl, zTrasl );

con esto rotas el modelo en los angulos indicados y luego lo desplazas
de la forma en que lo haces tu estas moviendolo y luego rotandolo, la rotacion siempre se hace sobre 0,0,0

Anderson

Cita de: "zupervaca"no entiendo muy bien lo que quieres hacer, pero me imagino que el problema es que estas moviendo el modelo y luego rotandolo, y lo que quieres es rotarlo y luego moverlo, ademas debes de quitar el cos, sin, etc de las funciones de rotacion

mira seria algo asi:

glRotatef( xRot, 1.0f, 0.0f, 0.0f );
glRotatef( yRot, 0.0f, 1.0f, 0.0f );
glRotatef( zRot, 0.0f, 0.0f, 1.0f );
glTranslatef( xTrasl, yTrasl, zTrasl );

con esto rotas el modelo en los angulos indicados y luego lo desplazas
de la forma en que lo haces tu estas moviendolo y luego rotandolo, la rotacion siempre se hace sobre 0,0,0
Gracias, zupervaca, pero esa fué una de las opciones que probé y funcionaba sólamente quitando las líneas de de guardar y restaurar matríz. Si se manteníam esas líneas el único giro que hacía bién era alrededor del eje z, el blanco (porque era el último de los tres que había colocado, si ponías en el código, por ejemplo, el y, ahora el que giraba bién era alrededor del y); pero el resto no gira desde los ejes relativos "x" e"y", sino desde los absolutos (es decir, (1, 0, 0) y (0, 1, 0) )

Por cierto, el orden en el que he puesto la traslación y la rotación es el correcto, según parece en el código hay que escribirlo AL CONTRARIO de lo que uno pretende hacer (y como lo que quería hacer era primero rotar y después trasladar, por ello tengo que escribir primero la orden de trasladar y después la/s de rotar) ;)

zupervaca

 te aconsejo hechar un vistazo a esta web que habla sobre calculos con matrices http://personal5.iddeo.es/ztt/Tem/T6_Matrices.htm, en ella veras el motivo de por que rotar antes y luego transladar entre otras cosas

Anderson

Cita de: "zupervaca"te aconsejo hechar un vistazo a esta web que habla sobre calculos con matrices http://personal5.iddeo.es/ztt/Tem/T6_Matrices.htm, en ella veras el motivo de por que rotar antes y luego transladar entre otras cosas
Gracias. Por mi parte, pondré de dónde saqué dicha afirmación:

http://fly.cc.fer.hr/~unreal/theredbook/ Capítulo 3, sección "Thinking about transformations"  






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.