Foros - Stratos

Stratos => XNA => Mensaje iniciado por: jbosch en 24 de Marzo de 2012, 05:38:41 PM

Título: [WP7] Gestures y rotación de sprites
Publicado por: jbosch en 24 de Marzo de 2012, 05:38:41 PM
Hola,

Estoy "jugando" a rotar y escalar un sprite a base de gestos. El tema del escalado me funciona perfectamente, a partir del GestureType "Pinch". La rotación la calculo también con el pinch, de la forma siguiente:

Vector2 vect = gesture.position2-gesture.position;
angulo = atan2(vext.Y, vect.X);

Eso funciona perfectamente. El problema es que cuando pongo los dos dedos en pantalla el sprite pilla de golpe el ángulo calculado (que de hecho es correcto), pero el efecto es muy feo, ya que gira "de golpe". Lo que me gustaría hacer es, una vez puestos los dos dedos sobre la pantalla, a medida que los vayamos moviendo, calcular ese ángulo.

Parece sencillo, pero o bien estoy ofuscado o bien no lo es tanto porque no me sale :-P alguna idea?

thks!
Título: Re: [WP7] Gestures y rotación de sprites
Publicado por: AgeR en 24 de Marzo de 2012, 06:13:04 PM
No sé si lo he pillado, pero parece que quieres que el movimiento del sprite no sea tan brusco, es así? Por lo que dices, estás aplicando el ángulo al sprite directamente. En vez de eso, puedes pillar el ángulo actual y el ángulo objetivo e interpolar entre ambos en el tiempo que consideres oportuno.

Algo me dice que será algo más complicado y no lo he entendido bien  ???

Saludos!
Título: Re: [WP7] Gestures y rotación de sprites
Publicado por: jbosch en 24 de Marzo de 2012, 06:28:52 PM
Me explico fatal  :-[

A ver, la rotación es suave, es 'perfecta' ya que se mueve exactamente a la misma velocidad q los dedos.

Para explicar el problema, inaginemos q el modelo a rotar es un hombre en pié. Si pongo los dedos en pantalla, uno a cada lado del hombre, este rotará 90 grados. A partir de aquí, cuando vaya moviendo los dedos el movimiento es suave, pero es esa rotación inicial la que quiero evitar.

No se si ahora el problema es mas claro :-S
Título: Re: [WP7] Gestures y rotación de sprites
Publicado por: jbosch en 24 de Marzo de 2012, 07:15:45 PM
Con esto tiene que quedar claro :-)

http://youtu.be/ogK75eRHxAQ
Título: Re: [WP7] Gestures y rotación de sprites
Publicado por: dari en 24 de Marzo de 2012, 08:06:14 PM
Se me ocurre lo siguiente (sin ver código)

Tu tienes ahora un ángulo de rotación, en lugar de aplicarlo directamente, haz esto:

Vector2 vect = gesture.position2-gesture.position;
angulo = atan2(vext.Y, vect.X);

anguloModelo += angulo - anguloAnterior;

anguloAnterior = angulo;

Así se te ira incrementando, pero claro, no se te situará tal y como quieres al inicio. Si quieres que se te sitúe, calcula a que ángulo debería estar en cada frame y ve moviendo hasta alcanzar este ángulo. Si mueves los dedos, pues corriges el ángulo de destino.

Vector2 vect = gesture.position2-gesture.position;
anguloDestino = atan2(vext.Y, vect.X);

anguloModelo += (anguloDestino-anguloModelo)*velocidadRotacion*deltaTiempo;

No se si me he explicado bien... :/
Título: Re: [WP7] Gestures y rotación de sprites
Publicado por: jbosch en 24 de Marzo de 2012, 08:36:12 PM
No suena mal, no se si podre probarlo hasta mañana xro tiene buena pinta, gracias :D
Título: Re: [WP7] Gestures y rotación de sprites
Publicado por: dari en 24 de Marzo de 2012, 09:03:56 PM
De nada, ya nos contarás :)
Título: Re: [WP7] Gestures y rotación de sprites
Publicado por: jbosch en 26 de Marzo de 2012, 03:05:25 PM
buenas, al final he calculado la diferencia entre los ángulos de los dos dedos a lo largo de cada frame, y ese ángulo se lo he ido sumando al ángulo del modelo.

A veces, dependiendo del orden en el que pusiera los dedos sobre la pantalla (izquierdo->derecho o derecho->izquierdo) el modelo daba una vuelta de 360 grados. Para evitarlo he hecho que la rotación no se aplique si la diferencia de grados es mayor a X. Es una solución algo "chapucera", pero no se me ha ocurrido ninguna otra forma de hacerlo :-P

lastima que es algo para el trabajo, sino me habría gustado compartir todo el código

un saludo!