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!
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...
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
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)
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
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
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
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
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
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...