#9 Rotar objetos en Unity usando el método Rotate de la clase Transform. [Serie Fundamental de Unity]

Por GameDevTraum

Introducción

En este artículo vamos a ver una forma de rotar objetos en Unity de tal forma de tener el control absoluto de la dirección de rotación en el mundo. Vamos a utilizar el método Rotate de la clase Transform, esto modificará directamente los parámetros de rotación que se observan en la parte superior del inspector con el GameObject seleccionado.

Ir a la página principal del proyecto

El siguiente video resume la información de este artículo.

Puedes unite al canal aquí >



¿Cómo se expresan las rotaciones matemáticamente?

Para poder describir matemáticamente tenemos que conocer directa o indirectamente los siguientes parámetros:

  • Eje de rotación
  • Cantidad de ángulos a girar
  • Sentido de giro

Imaginemos que el objeto que queremos rotar es una esfera. La tomamos en nuestras manos y clavamos una varilla haciendo que pase por el centro exacto de la esfera. Luego tomamos la varilla y la orientamos de norte a sur paralela al suelo. Finalmente hacemos que gire media vuelta en sentido anti horario.

¿Pudiste visualizarlo en tu mente?

Mi descripción de la rotación fue exacta aunque quizás no fue redactada de la mejor manera para que se entienda. Sin embargo vamos a asumir que todos pudimos imaginar exactamente lo mismo.

En primer lugar podemos decir que el eje de rotación es la varilla. Si nos ponemos estrictos el eje de rotación es una línea imaginaria que pasa por los dos extremos de la varilla.

La cantidad de ángulos a girar es media vuelta, esto matemáticamente son 180° o π radianes.

El sentido de giro es antihorario o en contra de las manecillas del reloj.

Estos tres parámetros se pueden describir completamente utilizando un vector, que es lo que vamos a hacer en este artículo.



Estación de trabajo

Vamos a usar la estación de rotación que consiste en tres engranajes que están orientados en el sentido de los tres ejes
x,y,z del mundo.

ejercicio para rotar objetos en unity 3d, caja con engranajes dorados para aplicar metodo rotate de clase transform. El cartel dice rotate station
Fig. 1: Vista frontal del mecanismo de engranajes a utilizar.

Los tres engranajes están colocados perpendicularmente entre sí.

ejercicio para rotar objetos en unity 3d, caja con engranajes dorados para aplicar metodo rotate de clase transform. El cartel dice rotate station
Fig. 2: Vista lateral del mecanismo de engranajes a utilizar.

En la jerarquía los podemos encontrar dentro del GameObject “#9 RotateObjects”. Tienen los nombres GearX, GearY y GearZ indicando el eje de rotación de cada engranaje.

jerarquia de Unity 3d, tres flechas señalan los gameobjects de los engranajes
Fig. 3: En la jerarquía tenemos un GameObject para cada engranaje.

El script para completar se llama “RotateObjects” y está asignado al GameObject con el mismo nombre en la jerarquía.

En la figura 4 vemos que los tres GameObjects de la jerarquía ya están asignados en los campos del inspector.

componente en inspector unity 3d. Script llamado rotate objects
Fig. 4: Los engranajes están asignados en los campos del Script Rotate Objects.

Al abrir el Script nos encontramos con el método FixedUpdate definido y dentro unos comentarios que dicen que ahí se debe rotar los engranajes.

Si no se tiene claro qué es un método en mi canal hay un video en el que hablo sobre métodos en programación y además hay un artículo en la sección de programación de esta página.

¿Por qué el código de la rotación debe ir en el método FixedUpdate?

En el artículo 1 sobre leer entradas de teclado y mouse se comentó por qué las instrucciones iban dentro del método Update.

El método FixedUpdate como su nombre lo indica es una actualización del estado del objeto pero ejecutada cada un cierto tiempo fijo.

Esto quiere decir que por más que el frame rate del juego cambie, tendremos la misma cantidad de ejecuciones de este método por segundo.

Colocaremos en el método FixedUpdate una instrucción que hará que los engranajes giren una determinada cantidad de ángulos en algún sentido respecto de un eje. Esto significa que en cada llamada de FixedUpdate se aplicará la rotación, lo que generará un movimiento continuo de rotación.

variables y campos definidos en script c#
Fig. 5: Campos definidos en el Script RotateObjects.

script c# para rotar objetos en unity 3d, metodo fixedupdate
Fig. 6: Script al abrirlo por primera vez. El método FixedUpdate está definido.

Resolución

El método Rotate de la clase Transform tiene distintas versiones, vamos a usar una en la que el primer parámetro es el vector que expresa completamente la rotación y en el segundo parámetro indicamos el tipo de coordenadas a utilizar, coordenadas globales que son únicas en todo el mundo del juego o coordenadas locales que son propias de cada objeto en particular, que serían como si cada objeto tuviese su propio norte.

script c# para rotar objetos en unity 3d, metodo fixedupdate, rotacion de objetos
Fig. 7: Instrucciones para rotar cada engranaje respecto de su propio eje.

Por propiedades matemáticas de los vectores reescribí el vector como el producto de su módulo o norma multiplicado por un vector unitario (norma 1) que describe la dirección.

Esto nos permite separar por un lado la dirección de la rotación y por otro lado la cantidad de ángulos a rotar.

componente en inspector unity 3d. Script llamado rotate objects para rotar objetos en unity 3d
Fig. 8: Modificando la variable en el inspector podemos cambiar la velocidad del conjunto de engranajes.

Otra ventaja de expresar el vector de esa forma es que podemos cambiar el sentido de giro simplemente utilizando valores negativos en el inspector

componente en inspector unity 3d. Script llamado rotate objects para rotar objetos en unity 3d
Fig. 9: Usando valores negativos se puede invertir la rotación del conjunto de engranajes.

Conclusión

Se puede rotar objetos en Unity de manera simple utilizando el método Rotate de la clase Transform.

Si no necesitamos precisión matemática, podemos jugar con los números y conseguir distintos resultados.

Con este tipo de rotación afectamos directamente el vector de rotación de la componente Transform, esto está bien si buscamos mostrar sólo la rotación de animación. Si se necesita que la rotación produzca interacciones físicas se debe utilizar RigidBody.