Jump to content
UnitySpain
Sign in to follow this  
Raúl

Girar un objeto via Script

Recommended Posts

Buenos dias,

estoy trabajando en una aplicación en la que descargo los componentes transform de un gameObject  e intento aplicarselos durante la ejecución, para aplicar la posición no he tenido ningun problema pero para aplicar la rotacion no he sido capaz, el objeto gira pero no con los valores que yo le paso he probado varias formas y ninguna funciona, adjunto la parte del codigo donde lo intento hacer

 Quaternion rota = new Quaternion(); // defino un quaternion 

 xx = siho[i].rotationX; // los valores los tengo almacenados en un array por eso hago esa asignación 
 rota.x = xx;
 yy = siho[i].rotationY;
 rota.y = yy;
 zz = siho[i].rotationZ;
 rota.z = zz;

gameObjectActual.transform.rotation= rota;

He comprobado los valores de las variables xx,yy,zz y si que contienen los valores que yo busco pero a la hora de girar el objeto aparecen otros valores :(

Un saludo y gracias de antemano!

Share this post


Link to post
Share on other sites

la rotacion en Quaternion no es los clasicos angulos en X, Y, y Z....

para girarlo con respecto a los "angulos de toda la vida" deverias usar:

transform.eulerAngles = new Vector3 (xx, yy, zz);



o sino
transform.rotation = new Quaternion();
transaform.Rotate(xx, yy, zz);

para transform.rotate() igual devereias "resetear" la rotacion antes de girarlo.... porque es acumulativo, es decir, gira desde el angulo en que se encuentre....  

transform.Rotate(0, 20, 0) girara el objeto 20 grados a la derecha partiendo del angulo en que se encuentre....

eulerAngles serian los angulos en que se encuentra...  

transform.eulerAngles = new Vector3(0, 20, 0)  esto colocara el objeto en el angulo indicado, es decir, se colocara el eje X a cero grados, el Y a 20, y el Z a cero....

espero que te haya servido...

Share this post


Link to post
Share on other sites
hace 17 minutos, Igor said:

la rotacion en Quaternion no es los clasicos angulos en X, Y, y Z....

para girarlo con respecto a los "angulos de toda la vida" deverias usar:


transform.eulerAngles = new Vector3 (xx, yy, zz);



o sino
transform.rotation = new Quaternion();
transaform.Rotate(xx, yy, zz);

para transform.rotate() igual devereias "resetear" la rotacion antes de girarlo.... porque es acumulativo, es decir, gira desde el angulo en que se encuentre....  

transform.Rotate(0, 20, 0) girara el objeto 20 grados a la derecha partiendo del angulo en que se encuentre....

eulerAngles serian los angulos en que se encuentra...  

transform.eulerAngles = new Vector3(0, 20, 0)  esto colocara el objeto en el angulo indicado, es decir, se colocara el eje X a cero grados, el Y a 20, y el Z a cero....

espero que te haya servido...

he probado las 2 opciones  que me has dicho y en ambas me pasa igual, me modifica los valores pero a unos que no son los que yo le paso

he probado a hacerlo "por partes" primero añado xx e yy quedando el vector (xx,yy,0) y si que se meten los valores bien pero en cuanto añado la z (xx,yy,zz) se estropean todos los valores :S

Edited by Raúl

Share this post


Link to post
Share on other sites
hace 6 minutos, Raúl said:

he probado las 2 opciones  que me has dicho y en ambas me pasa igual, me modifica los valores pero a unos que no son los que yo le paso

he probado a hacerlo "por partes" primero añado xx e yy quedando el vector (xx,yy,0) y si que se meten los valores bien pero en cuanto añado la z (xx,yy,zz) se estropean todos los valores :S

El problema es que no estas entendiendo como funcionan las rotaciones.

https://docs.unity3d.com/es/current/Manual/QuaternionAndEulerRotationsInUnity.html

https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

Edited by francoe1

Share this post


Link to post
Share on other sites

lo que te dijeron arriba, es ilegal hacer eso que estás haciendo quaternion "gira" (cuac) alrededor de orientaciones, no existen multiples quaternions para una misma orientación, en cambion vas a poder lograr infinitos eulerAngles (seguramente lo que estás tratando de lograr) para el mismo resultado (ej : + 45°, -315°, 405°, etc ).

Si vas a rotar usá las funciones de los quaternions en vez de asignar rotaciones, el caballito de batalla es transform.Rotate como te dice @Igor , si querés hacer cosas específicas tenés alguna que otra mas.

y sino tirá directamente los eulerAngles, no soy un fan de estos pero bueno...

2 hours ago, Raúl said:

he probado a hacerlo "por partes" primero añado xx e yy quedando el vector (xx,yy,0) y si que se meten los valores bien pero en cuanto añado la z (xx,yy,zz) se estropean todos los valores :S

y eso seguramente pase porque estás igualando un quaternion (4 componentes, involucra senos y cosenos que nadie entiende) a unos eulerAngles (tres componentes),  xx , yy y zz deberían ser ángulos para que funcione, es decir que deberías almacenar en tu array no rotation sino eulerANgles.

saludos

Share this post


Link to post
Share on other sites
hace 18 horas, lightbug said:

lo que te dijeron arriba, es ilegal hacer eso que estás haciendo quaternion "gira" (cuac) alrededor de orientaciones, no existen multiples quaternions para una misma orientación, en cambion vas a poder lograr infinitos eulerAngles (seguramente lo que estás tratando de lograr) para el mismo resultado (ej : + 45°, -315°, 405°, etc ).

Si vas a rotar usá las funciones de los quaternions en vez de asignar rotaciones, el caballito de batalla es transform.Rotate como te dice @Igor , si querés hacer cosas específicas tenés alguna que otra mas.

y sino tirá directamente los eulerAngles, no soy un fan de estos pero bueno...

y eso seguramente pase porque estás igualando un quaternion (4 componentes, involucra senos y cosenos que nadie entiende) a unos eulerAngles (tres componentes),  xx , yy y zz deberían ser ángulos para que funcione, es decir que deberías almacenar en tu array no rotation sino eulerANgles.

saludos

Gracias por la respuesta, he seguido haciendo pruebas..

utilizando el transfor.Rotate

gameObjectActual.transform.Rotate(xx, yy, zz);

en la escena tengo 3 objetos: objeto 1 cuyos angulos son (30,10,20) utilizando la linea de código de arriba funciona bien y se gira correctamente

el objeto 2 tiene de angulos (-30,-10,-20) al igual que el primero se gira correctamente

sin embargo el objeto 3 que tiene de angulos( -120,-110,-100) no gira bien de los valores que tenia en origen me pasa a (-60,70,80)

no entiendo por que.. esta claro que algo me esta pasando con los angulos que pasan de 90º pero nose el que :(

Gracias a todos por la ayuda

Share this post


Link to post
Share on other sites
5 hours ago, Raúl said:

no entiendo por que.. esta claro que algo me esta pasando con los angulos que pasan de 90º pero nose el que :(

exactamente eso suele pasar, aunque me sorprendió el resultado con los 100's, pensé que ibas a tener problemas con los > 180's , también puede ser que sea por la forma en la que guardas esos ángulos, por ej si usas Vector3.Angle esto no determina el signo y es posible aparecer del otro lado (sin diferencia entre +82 y -80),

como es que guardas esos xx , yy , zz ? (pregunto ahora porque creo que no lo hacés como al comienzo del hilo). Si estás en un punto donde ya no sabés bien que pasa subí algunas imágenes, más código, todo el código que puedas, no se cualquier cosa que ayude a encontrar el inconveniente.

En mi caso uso el "Rotate" pero no para setear una rotacion (Ej cargar una rotación al cargar el juego) sino para realizar pequeñas rotaciones (Ej mirar con la cámara al mover el mouse). Supongo que el problema que estás teniendo es el que no te cierra por qué los valores esos dan lo que dan, pero si directamente guardas rotation de un obj1 (quaternionGuardado = obj1.rotation) y en cualquier momento se la aplicás a un obj2 (obj2.rotation = quaternionGuardado) no deberías tener ningun problema.

saludos

Share this post


Link to post
Share on other sites
hace 20 horas, lightbug said:

exactamente eso suele pasar, aunque me sorprendió el resultado con los 100's, pensé que ibas a tener problemas con los > 180's , también puede ser que sea por la forma en la que guardas esos ángulos, por ej si usas Vector3.Angle esto no determina el signo y es posible aparecer del otro lado (sin diferencia entre +82 y -80),

como es que guardas esos xx , yy , zz ? (pregunto ahora porque creo que no lo hacés como al comienzo del hilo). Si estás en un punto donde ya no sabés bien que pasa subí algunas imágenes, más código, todo el código que puedas, no se cualquier cosa que ayude a encontrar el inconveniente.

En mi caso uso el "Rotate" pero no para setear una rotacion (Ej cargar una rotación al cargar el juego) sino para realizar pequeñas rotaciones (Ej mirar con la cámara al mover el mouse). Supongo que el problema que estás teniendo es el que no te cierra por qué los valores esos dan lo que dan, pero si directamente guardas rotation de un obj1 (quaternionGuardado = obj1.rotation) y en cualquier momento se la aplicás a un obj2 (obj2.rotation = quaternionGuardado) no deberías tener ningun problema.

saludos

Al final he conseguido arreglarlo el encargado de hacer el back-end de la aplicacion puede mandarme la rotacion en quaternions en vez de en grados con lo cual yo solo he tenido que crear el quaternion con esos valores que recojo y listo jajaj

Share this post


Link to post
Share on other sites

prueba a rotar primero en X e Y...

...y luego el Z aparte...

transform.Rotate(xx, yy, Of);
transform.Rotate(Of, Of, zz);

igual pimero tienes que "reniciar" la rotacion...

transform.eulerAngles = Vector3.zero;

....o nose muy bien como quieres hacer...

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...