Input for OpenVR controllers
Rotación y Orientación en Unity

Transforms

El Transform es usado para almacenar la posición, rotación, escala y el estado de parenting de un GameObject y por lo tanto es importante. Un GameObject siempre va a tener adjunto un Transform component - no es posible quitar un Transform o crear un GameObject sin uno.

Editando Transforms

Transforms son manipulados en espacio 3D en el eje X, Y, y Z o en espacio 2D en solo X y Y. En Unity, estos ejes son representados por los colores rojo, verde, y azul respectivamente.

Un transform mostrando la codificación de color de los ejes
Un transform mostrando la codificación de color de los ejes

Un Transform puede ser editado en el Scene View o cambiando sus propiedades en el Inspector. En la escena, usted puede modificar Transforms usando las herramientas de desplazamiento, rotación y escala. Estas herramientas están ubicadas en la esquina superior izquierda del editor de Unity.

Las herramientas de View, Translate, Rotate, y Scale
Las herramientas de View, Translate, Rotate, y Scale

Las herramientas pueden ser usadas en cualquier objeto en la escena. Cuando haga click en un objeto, usted va a ver la herramienta gizmo aparecer dentro de él. La apariencia del gizmo depende en qué herramienta es seleccionada.

Transform gizmo
Transform gizmo

Cuando haga click y arrastre en uno de los tres ejes de gizmo, usted verá que sus colores cambiarán a amarillo. A medida que arrastre el mouse, usted vera el objeto trasladarse(translate), rotar(rotate), o escalar(scale) a lo largo del eje seleccionado. Cuando suelte el botón del mouse, el eje se mantiene seleccionado. Si usted posteriormente arrastra con el botón del medio del mouse, el último eje seleccionado va a ser usado sin importar la posición del mouse.

Un Transform mostrando el eje (amarillo) X seleccionado
Un Transform mostrando el eje (amarillo) X seleccionado

También hay una opción adicional en el modo Translate para bloquear el movimiento a un plano en particular (ie, permite arrastrar dos de los ejes mientras se mantiene el tercero sin cambios). Los tres cuadrados pequeños coloridos alrededor del centro del Translate gizmo activa el bloqueo para cada plano; los colores corresponden al eje que va a ser bloqueado cuando el cuadrado sea clickeado (eg, azul bloque el eje Z).

Parentesco

Parenting es uno de los conceptos más importantes que entender cuando se usa Unity. Cuando un GameObject es un Parent de otro GameObject, el GameObject Child va a moverse,rotar, y escalar exactamente como su padre(parent) lo haga. Usted puede pensar de parenting como la relación entre sus brazos y su cuerpo; cuando su cuerpo se mueva, sus brazos también se mueven junto con él. Objetos hijo(Child) pueden tener otros hijos(children) de sí mismo y así. Entonces sus manos pueden ser pensadas como “children” de sus brazos y luego cada mano tiene varios dedos, etc. Cualquier objeto puede tener múltiplos hijos(children), pero solo un padre(parent). Estos múltiplos niveles de relaciones padre-hijo forman una jerarquía Transform. El objeto en la parte superior de la jerarquía (ie, el único objeto en la jerarquía que no tiene un parent) es conocido como el root.

Usted puede crear un padre(parent) al arrastrar cualquier GameObject en la Hierarchy View encima de otro. Esto va a crear una relación padre-hijo entre los dos GameObjects.

Ejemplo de una jerarquía Padre-Hijo. GameObjects con flechas plegables a la izquierda de sus nombres son padres.
Ejemplo de una jerarquía Padre-Hijo. GameObjects con flechas plegables a la izquierda de sus nombres son padres.

Tenga en cuenta que los valores del Transform en el Inspector para cualquier GameObject hijo(Child) son mostrados relativamente a los valores del Transform del padre(Parent). Estos valores son referidos como local coordinates.. Devolviendo a la analogía del cuerpo y los brazos, la posición de su cuerpo puede moverse cuando camine, pero sus brazos se van a mantener adjuntos en la misma posición relativa. Para la construcción de una escena, es usualmente suficiente trabajar con coordenadas locales para objetos hijo, pero en la experiencia de juego, a menudo es útil encontrar su posición exacta en el espacio universal o global coordinates. El Scripting API para el Transform Component tiene propiedades separadas para posiciones locales y globales, rotación y escala y también le permite a usted convertir cualquier punto entre coordenadas locales y globales.

Limitaciones con Escalado No Uniforme

El escalado no uniforme es cuando un Scale en un Transform tiene diferentes valores para x, y, y z; por ejemplo (2,4,2). En contraste, el escalado uniforme tiene el mismo valor para x, y, y z; por ejemplo (3,3,3). El Escalado no uniforme puede ser útil en unos poquitos casos específicos pero usualmente debería ser evitado ya que reduce la velocidad de la renderización gráfica. También, introduce un poquito de rarezas que no ocurren con el escalado uniforme.

  • Ciertos components no soportan completamente el escalado no uniforme. Por ejemplo, algunos components tienen un elemento circular o esférico definido por una propiedad de radius, entre ellos Sphere Collider, Capsule Collider , Light y Audio Source. En casos como este la forma circular no se volverá elíptica bajo el escalado no uniforme como es de esperar y simplemente seguirá siendo circular.
  • Cuando un objeto hijo tiene un padre con escalado no uniforme y es rotado relativamente a ese padre, puede parecer sesgado o “cortado”. Hay components que soportan escalado no uniforme simple pero que no funcionan adecuadamente cuando se tuercen así. Por ejemplo, un Box Collider torcido no va a coincidir precisamente con el mesh que fue renderizado.
  • Por razones de rendimiento, un objeto hijo de un padre con una escala no uniforme, no va a tener su escala automáticamente actualizada cuando rote. Como un resultado, la forma del hijo puede parecer cambiar abruptamente cuando la escala eventualmente es actualizada, digamos si el objeto hijo es separado del padre.

La Importancia de la Escala

La escala del Transform determina las diferencias entre el tamaño de un mesh en su aplicación de modelado y el tamaño de ese mesh en Unity. El tamaño del mesh en Unity (y por lo tanto la escala del Transform) es muy importante, especialmente durante la simulación de física. Por defecto, el motor de física asume que una unidad del espacio del mundo corresponde a un metro. Si un objeto es muy grande, puede parecer que cayera en “cámara lenta”; la simulación es actualmente correcta ya que efectivamente, usted está viendo un objeto muy grande caer una gran distancia.

Hay tres factores que pueden afectar la escala de su objeto:

  • El tamaño del mesh en su aplicación de modelado 3D.
  • El ajuste Mesh Scale Factor en las Import Settings del objeto.
  • Los valores del Scale de su Transform Component.

Idealmente, usted no debe ajustar la Scale de su objeto en el Transform Component. La mejor opción es crear sus modelos en una escala de la vida real para que tenga que cambiar la escala del Transform. La siguiente mejor opción es ajustar la escala la cual su mesh está siendo importado en las Import Settings de su mesh individual. Ciertas optimizaciones ocurren basadas en el tamaño de importación, e instanciando un objeto que tiene un valor de escala adjustado puede disminuir el rendimiento. Para más información, ver la sección acerca de optimizar la escala en la página del Rigidbody component.

Tips para Trabajar con Transforms

  • Cuando parenting Transforms, es útil establecer la ubicación del padre en <0,0,0> antes de añadir el hijo. Esto significa que las coordenadas locales para el hijo van a ser las mismas a las coordenadas globales haciendo que sea fácil saber si usted tiene el hijo en la posición correcta.
  • Los Particle Systems no son afectados por la Scale del Transform. Para escalar un Particle System, usted tiene que modificar las propiedades en el emisor del sistema de partículas, Animator y Renderer.
  • Si está utilizando __Rigidbodies__para simulación de física entonces esté seguro de leer acerca de la propiedad de escala en la página de referencia del Rigidbody component.
  • Usted puede cambiar los colores de los ejes del Trasnform (y otros elementos UI) desde las preferencias (Menu: Unity > Preferences y luego seleccionar el panel de Colors & keys).
  • Cambiar la Scale (escala) afecta la posición de los transforms hijo. Por ejemplo escalar el padre a (0,0,0) va a posicionar todos los hijos en (0,0,0) relativos al padre.
Input for OpenVR controllers
Rotación y Orientación en Unity