Jump to content
Sign in to follow this  
totemalf

Rotación Exacta

Recommended Posts

Buenas,  ando atascado en la cosa más tonta.

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
                    transform.Rotate(0, 0, 90);           
        }
    }

Esto me gira una pieza 90 grados en el eje z al pulsar la tecla de arriba, peeero, lo hace de la siguiente manera: 0 ,      90.00001,      -180,     -90.00001.  Necesitaria que el giro sea exacto y llevo toda la tarde dándole vueltas con los quaternions, los eulerangles etc... pero no encuentro la manera, he intentado hacer un cast al eje pero tampoco lo coge.

La verdad que las rotaciones en unity son una rallada grande ya que en el inspector trabaja los angulos a su rollo. Los eulerAngles de este mismo código serían 0,90,180,270 y la rotation va de 0,0.7...,1 aunque a veces también me marca -0.7...   Así se me hace muy difícil hacer cálculos. Seguro que hay una forma infinitamente más sencilla, pero que desconozco. Please, Help Me :p

Saludos

 

Share this post


Link to post
Share on other sites

El inspector no trabaja los ángulos a su rollo. Te muestra la rotación en base a tres rotaciones eulerianas sobre ejes X, Y y Z (rotaciones en ese orden), mientras internamente almacena un Quaternion. Después de esas operaciones, siempre vas a tener errores numéricos, además del problema de gimbal lock que te impedirá rotar el objeto de determinadas maneras si sólo usas esos 3 ángulos.

No debería importarte esto. ¿Qué estás intentando hacer? 

Share this post


Link to post
Share on other sites

Buenas, pues unas piezas tipo Tetris. Mi problema es que he creado una grilla y tiene que moverse por ella y girar siempre en enteros, poque si no piensa que ha llegado a algún limite.

Si el problema lo tengo con los 90.00001, si esto fuese 90 exacto todo funcionaria bien.

 

Edited by totemalf

Share this post


Link to post
Share on other sites

No es buena práctica comparar floats, por ejemplo '90.0f == 90.0f' no es algo muy ortodoxo, ya que los floats tienen errores de representación que hace difícil su comparación (por ejemplo: ((1.0f / 3.0f) * 3.0f) != 1.0f) .

De todas formas, en tu caso, te recomendaría que almacenes la orientación de la pieza como un entero en un MonoBehavior (p ej 0 - derecha, 1 - arriba, 2 - izquierda...) y utilices eso para hacer las comparaciones y establecer la rotación como sea oportuno.

En otras palabras, deja rotación del Transform para la representación, y usa tu propio script para almacenar el estado de las piezas, donde no tienes porque usar ángulos eulerianos sino algo que tenga sentido para tu juego.

Share this post


Link to post
Share on other sites

Quaternions. Utiliza los euler y transfórmalos en Quaternion y viceversa. Puedes comparar float con el delta Mathf.Epsilon aunque no te lo recomiendo.

Share this post


Link to post
Share on other sites

Puede hacer un apaño rápido si hace un paso previo de convertir a INT el valor obtenido y luego lo pasa a FLOAT en la rotación final..

Share this post


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

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...