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

Introducción

En este artícu­lo vamos a ver una for­ma de rotar obje­tos en Uni­ty de tal for­ma de ten­er el con­trol de la direc­ción de rotación en el mun­do. Vamos a uti­lizar el méto­do Rotate de la clase Trans­form, esto mod­i­fi­cará direc­ta­mente los parámet­ros de rotación que se obser­van en la parte supe­ri­or del inspec­tor con el GameOb­ject seleccionado.

Tengo un vídeo relacionado en el canal

En este vídeo vemos una for­ma de ROTAR OBJETOS en Uni­ty alrede­dor de los ejes globales


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

Para poder describir matemáti­ca­mente ten­emos que cono­cer direc­ta o indi­rec­ta­mente los sigu­ientes parámetros:

  • Eje de rotación 
  • Can­ti­dad de ángu­los a girar
  • Sen­ti­do de giro

Imag­inemos que el obje­to que quer­e­mos rotar es una esfera. La tomamos en nues­tras manos y clava­mos una var­il­la hacien­do que pase por el cen­tro exac­to de la esfera. Luego tomamos la var­il­la y la ori­en­ta­mos de norte a sur para­lela al sue­lo. Final­mente hace­mos que gire media vuelta en sen­ti­do anti horario.

¿Pudiste visualizarlo en tu mente?

Mi descrip­ción de la rotación fue exac­ta aunque quizás no fue redac­ta­da de la mejor man­era para que se entien­da. Sin embar­go vamos a asumir que todos pudi­mos imag­i­nar exac­ta­mente lo mismo.

En primer lugar podemos decir que el eje de rotación es la var­il­la. Si nos ponemos estric­tos el eje de rotación es una línea imag­i­nar­ia que pasa por los dos extremos de la varilla.

La can­ti­dad de ángu­los a girar es media vuelta, esto matemáti­ca­mente son 180° o π radianes.

El sen­ti­do de giro es anti­ho­rario o en con­tra de las manecil­las del reloj.

Estos tres parámet­ros se pueden describir com­ple­ta­mente uti­lizan­do un vec­tor, que es lo que vamos a hac­er en este artículo.

Estación de trabajo

Vamos a usar la estación de rotación que con­siste en tres engrana­jes que están ori­en­ta­dos en el sen­ti­do 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 mecan­is­mo de engrana­jes a utilizar.

Los tres engrana­jes están colo­ca­dos per­pen­dic­u­lar­mente 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 lat­er­al del mecan­is­mo de engrana­jes a utilizar.

En la jer­ar­quía los podemos encon­trar den­tro del GameOb­ject "#9 Rota­teOb­jects". Tienen los nom­bres GearX, GearY y GearZ indi­can­do 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 jer­ar­quía ten­emos un GameOb­ject para cada engranaje.

El script para com­ple­tar se lla­ma "Rota­teOb­jects" y está asig­na­do al GameOb­ject con el mis­mo nom­bre en la jerarquía.

En la figu­ra 4 vemos que los tres GameOb­jects de la jer­ar­quía ya están asig­na­dos en los cam­pos del inspector.

componente en inspector unity 3d. Script llamado rotate objects
Fig. 4: Los engrana­jes están asig­na­dos en los cam­pos del Script Rotate Objects.

Al abrir el Script nos encon­tramos con el méto­do FixedUp­date definido y den­tro unos comen­tar­ios que dicen que ahí se debe rotar los engranajes.

Si no se tiene claro qué es un méto­do en mi canal hay un video en el que hablo sobre méto­dos en pro­gra­mación y además hay un artícu­lo en la sec­ción de pro­gra­mación de esta pági­na.

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

En el artícu­lo 1 sobre leer entradas de tecla­do y mouse se comen­tó por qué las instruc­ciones iban den­tro del méto­do Update.

El méto­do FixedUp­date como su nom­bre lo indi­ca es una actu­al­ización del esta­do del obje­to pero eje­cu­ta­da cada un cier­to tiem­po fijo. 

Esto quiere decir que por más que el frame rate del juego cam­bie, ten­dremos la mis­ma can­ti­dad de eje­cu­ciones de este méto­do por segundo.

Colo­care­mos en el méto­do FixedUp­date una instruc­ción que hará que los engrana­jes giren una deter­mi­na­da can­ti­dad de ángu­los en algún sen­ti­do respec­to de un eje. Esto sig­nifi­ca que en cada lla­ma­da de FixedUp­date se apli­cará la rotación, lo que gener­ará un movimien­to con­tin­uo de rotación.

variables y campos definidos en script c#
Fig. 5: Cam­pos definidos en el Script RotateObjects.

script c# para rotar objetos en unity 3d, metodo fixedupdate
Fig. 6: Script al abrir­lo por primera vez. El méto­do FixedUp­date está definido.

Resolución del problema

El méto­do Rotate de la clase Trans­form tiene dis­tin­tas ver­siones, vamos a usar una en la que el primer parámetro es el vec­tor que expre­sa com­ple­ta­mente la rotación y en el segun­do parámetro indicamos el tipo de coor­de­nadas a uti­lizar, coor­de­nadas glob­ales que son úni­cas en todo el mun­do del juego o coor­de­nadas locales que son propias de cada obje­to en par­tic­u­lar, que serían como si cada obje­to tuviese su pro­pio norte.

script c# para rotar objetos en unity 3d, metodo fixedupdate, rotacion de objetos
Fig. 7: Instruc­ciones para rotar cada engrana­je respec­to de su pro­pio eje.

Por propiedades matemáti­cas de los vec­tores ree­scribí el vec­tor como el pro­duc­to de su módu­lo o nor­ma mul­ti­pli­ca­do por un vec­tor uni­tario (nor­ma 1) que describe la dirección.

Esto nos per­mite sep­a­rar por un lado la direc­ción de la rotación y por otro lado la can­ti­dad de ángu­los a rotar.

componente en inspector unity 3d. Script llamado rotate objects para rotar objetos en unity 3d
Fig. 8: Mod­i­f­i­can­do la vari­able en el inspec­tor podemos cam­biar la veloci­dad del con­jun­to de engranajes.

Otra ven­ta­ja de expre­sar el vec­tor de esa for­ma es que podemos cam­biar el sen­ti­do de giro sim­ple­mente uti­lizan­do val­ores neg­a­tivos en el inspector

componente en inspector unity 3d. Script llamado rotate objects para rotar objetos en unity 3d
Fig. 9: Usan­do val­ores neg­a­tivos se puede inver­tir la rotación del con­jun­to de engranajes.

Conclusión

Se puede rotar obje­tos en Uni­ty de man­era sim­ple uti­lizan­do el méto­do Rotate de la clase Transform.

Si no nece­si­ta­mos pre­cisión matemáti­ca, podemos jugar con los números y con­seguir dis­tin­tos resultados.

Con este tipo de rotación afec­ta­mos direc­ta­mente el vec­tor de rotación de la com­po­nente Trans­form, esto está bien si bus­camos mostrar sólo la rotación de ani­mación. Si se nece­si­ta que la rotación pro­duz­ca inter­ac­ciones físi­cas se debe uti­lizar RigidBody.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Scroll al inicio
Secured By miniOrange