Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Problemas con el uniy transform. rotation

Iniciado por algofernando, Junio 18, 2016, 01:07:31 AM

Tema anterior - Siguiente tema
Junio 18, 2016, 01:07:31 AM Ultima modificación: Junio 18, 2016, 05:25:07 AM por pioj
Bueno estaba realizando un proyecto en el qu necesitaba que unos objetos se movieran atravez de rotaciones de 90 grados pero simpre terminan no con la posicion exacta o con la misma escala e incluso se van desfasando de los mismos ejes. Intente utilizar este algoritmo para corregirlas pero no logro que conserven ni su escala como su rotacion
 

void repararGiro(GameObject esquina){
        Quaternion rotacion=Quaternion.Euler(,,);
        print (esquina.gameObject.name.ToString () + " " + esquina.transform.rotation.eulerAngles);
        float temporal;
        float Rx, Ry, Rz;
        //X
        temporal = esquina.transform.rotation.eulerAngles.x % 90f;
        if (esquina.transform.rotation.eulerAngles.x % 90f != ) {
            temporal=esquina.transform.rotation.eulerAngles.x/90f;
            Rx=Mathf.RoundToInt(temporal);
            rotacion.x=Rx*90f;
        }else {
            rotacion.x=esquina.transform.rotation.eulerAngles.x;
        }
        //Y
        if (esquina.transform.rotation.eulerAngles.y % 90f != ) {
            temporal=esquina.transform.rotation.eulerAngles.y/90f;
            Ry=Mathf.RoundToInt(temporal);
            rotacion.y=Ry*90f;
        }else {
            rotacion.y=esquina.transform.rotation.eulerAngles.y;
        }
        //Z
        if (esquina.transform.rotation.eulerAngles.z % 90f != ) {
            temporal = esquina.transform.rotation.eulerAngles.z / 90f;
            Rz = Mathf.RoundToInt (temporal);
            print ("Rz: "+Rz);
            rotacion.z = Rz * 90f;
        } else {
            rotacion.z=esquina.transform.rotation.eulerAngles.z;
        }
        print (rotacion.eulerAngles);
        esquina.transform.rotation = rotacion;
    }
///Al darle incluso un valor al vector de la rotacion de 0,90,0

 
Me escribe en el inspector valores como 14.91,90.0100101010,1e-12 son diferencias pequeñas pero afectan el funcionamiendo de lo que estoy haciendo
 
Alguna idea o sera problema del mismo Unity???

Me uno a tu causa. Me ocurre lo mismo, y estaba haciendo un juego de puzzles que requiere girar 90º el escenario en cada pulsación. He detectado que existe este error desde la 5.1, en adelante. Incluso usando el Math.Approximately, da ese error.
 
Últimamente me he planteado usar un Tweener para hacerlo, pero me gustaría saber también a qué es debido, exactamente. Porque incluso forzando los valores a mano, te los devuelve mal, y las físicas se van a la porra...

No es un error de Unity. Es un error de vuestro concepto matemático. Las rotaciones en grados sufren de un problema llamado "gimbal lock" cuando se añaden múltiples rotaciones, por eso hay que realizarlas en quaternions y si quieres mostrar el resultado puedes utilizar euler angles. Os recomiendo encarecidamente mirar este vídeo:
 


   
eature=oembed" width="459">

 
 

Conozco el tema del Gimbal lock de lejos; ya me pasaba con blitz3d...
 
El tema es que, esperábamos que el IDE de Unity ya filtrara por defecto esos valores, al usar EulerAngles en lugar de Quaternions...
 
Seamos sinceros: Para cosas muy simples, es un coñazo tener que ir mendigando operaciones con Quaterniones, cuando se podría hacer perfectamente con un euler ya filtrado...

Etiquetas: