Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Raúl en Abril 23, 2018, 11:49:58 AM

Título: Girar un objeto via Script
Publicado por: Raúl en Abril 23, 2018, 11:49:58 AM
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.rotationX; // los valores los tengo almacenados en un array por eso hago esa asignación
 rota.x = xx;
 yy = siho.rotationY;
 rota.y = yy;
 zz = siho.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!
Título: Girar un objeto via Script
Publicado por: Igor en Abril 23, 2018, 12:05:04 PM
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...
Título: Girar un objeto via Script
Publicado por: Raúl en Abril 23, 2018, 12:24:07 PM
Cita de: Igor date=1524477904la 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
Título: Girar un objeto via Script
Publicado por: francoe1 en Abril 23, 2018, 12:32:21 PM
Cita de: Raúl date=1524479047he 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://docs.unity3d.com/es/current/Manual/QuaternionAndEulerRotationsInUnity.html)
 
https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation (https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation)
Título: Girar un objeto via Script
Publicado por: Raúl en Abril 23, 2018, 01:58:01 PM
Cita de: francoe1 date=1524479541El problema es que no estas entendiendo como funcionan las rotaciones.
   
   
      https://docs.unity3d.com/es/current/Manual/QuaternionAndEulerRotationsInUnity.html (https://docs.unity3d.com/es/current/Manual/QuaternionAndEulerRotationsInUnity.html)
   
   
      https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation (https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation)
   


a esa conclusion ya había llegado, gracias
Título: Girar un objeto via Script
Publicado por: lightbug en Abril 23, 2018, 02:42:59 PM
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...
 
Cita de: Raúl date=1524479047he 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
Título: Girar un objeto via Script
Publicado por: Raúl en Abril 24, 2018, 09:44:55 AM
Cita de: lightbug date=1524487379lo 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
Título: Girar un objeto via Script
Publicado por: lightbug en Abril 24, 2018, 03:46:53 PM
Cita de: Raúl date=1524555895no 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
Título: Girar un objeto via Script
Publicado por: Raúl en Abril 25, 2018, 12:19:02 PM
Cita de: lightbug date=1524577613exactamente 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
Título: Girar un objeto via Script
Publicado por: Igor en Abril 25, 2018, 01:56:32 PM
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...