Version: 2017.3
Mesh Renderer
Text Mesh

Skinned Mesh Renderer

Unity utiliza el componente Skinned Mesh Renderer para renderizar las animaciones Bone (hueso), dónde la forma del Mesh se deforma por las secuencias de animación pre-definidas. Esta técnica es útil para los personajes y otros objetos cuyos joints se doblan (opuesto a una maquina dónde los joints son más como bisagras).

Un Skinned Mesh Renderer se agrega automáticamente a cualquier Mesh que lo necesite en tiempo de importación.

Propiedades

Property: Función:
Cast Shadows Si está habilitado, el Mesh emitirá sombras cuando una Light adecuada brille sobre este.
Receive Shadows Si está activado, el Mesh mostrará sombras que son emitidas sobre ella por otros objetos.
Motion Vectors Si está habilitado, la línea tiene vectores de movimiento renderizados en el vector de movimiento de textura de la Cámara. Consulte Renderer.motionVectors en la documentación de referencia de la API de scripting para obtener más información.
Materials La lista de Materials con los que el Mesh será renderizado.
Light Probes Modo de interpolación de iluminación de Probe.
Reflection Probes Si está activado, y si los Reflection Probes están presentes en la escena, se elegirá una Textura de reflexión para este GameObject y se configurará como una variable uniform del Shader incorporado.
Anchor Override Un Transform utilizado para determina la posición de interpolación cuando los sistemas de Light Probe o Reflection Probe se utilizan.
Quality Define el número máximo de bones (huesos) utilizados por vértice durante el skinning. Cuanto mayor sea el número de bones (huesos), mayor será la calidad del Renderer. Establezca Quality en Auto para usar el valor Blend Weights en Quality Settings.
Skinned Motion Vectors Si está activado, los datos del Mesh skinning serán de doble del búfer para que el movimiento skinned (pelado) pueda ser interpolado y colocado en el motion vector Texture (textura del vector de movimiento). Esto tiene una sobrecarga de memoria al GPU, pero conduce a vectores de movimiento más correctos.
Update When Offscreen Si está activado, el Skinned Mesh se actualizará incluso cuando no pueda ser visto por ninguna cámara. Si está deshabilitado, las animaciones mismas también dejarán de ejecutarse cuando GameObject esté fuera de la pantalla.
Mesh Utilice esto para definir el Mesh utilizado por este Renderer.
Root Bone Utilice esto para definir el bone (hueso) que es la “raíz” de la animación (esto es, el hueso con respecto al cual se mueven todos los demás).
Bounds El volumen de delimitación que se utiliza para determinar cuándo el Mesh está fuera de la pantalla. Los límites se pre-calculan en la importación del mesh y las animaciones en el archivo del modelo, y se muestran como un wireframe alrededor del modelo en la vista de escena.

Detalles

Los Bones son objetos invisibles dentro de un skinned Mesh que afectan la forma en que se deforma el mesh durante la animación. La idea básica es que los huesos se unen para formar un “esqueleto” jerárquico, y la animación se define girando los joints (articulaciones) del esqueleto para hacer que se mueva. Cada hueso está unido a algunos de los vértices del Mesh circundante. Cuando se reproduce la animación, los vértices se mueven con el hueso o los huesos a los que están conectados, de modo que la “piel” sigue el movimiento del esqueleto. En un joint (articulación) simple (por ejemplo, un codo), los vértices del mesh se ven afectados por los dos huesos que se encuentran allí, y el mesh se estirará y girará de forma realista a medida que el joint (articulación) se dobla. En situaciones más complejas, más de dos huesos afectarán a un área particular del Mesh, dando lugar a movimientos más sutiles.

Aunque un skinned Mesh es más comúnmente utilizado con animaciones predefinidas, también es posible adjuntar componentes Rigidbody a cada hueso en un esqueleto para ponerlo bajo el control del motor de física. Esto se utiliza típicamente para crear el efecto “ragdoll”, donde las extremidades de un personaje se sacuden después de ser lanzado o golpeado por una explosión.

Quality

Unity puede skin (pelar) cada vértice con uno, dos o cuatro huesos. Utilizar cuatro huesos le puede dar los mejores resultados pero esto viene con una sobrecarga de procesamiento más alta. Los juegos comúnmente utilizan dos pesos de hueso, lo cual es un buen compromiso entre calidad visual y rendimiento.

Si la Quality está configurada a Auto, el valor de Blend Weights de los Quality Settings se utilizan. Esto le permite a los usuarios finales escoger las ajustes de calidad por si mismos y obtener un balance deseado de calidad de animación y framerate.

Update When Offscreen

Por defecto, los skinned Meshes que no están visibles a cualquier cámara no se actualizan. El skinning (pelaje) no se actualiza hasta que el Mesh vuelve a la pantalla. Esto se hace para ahorrarle recursos al sistema.

La visibilidad del objeto se determina a partir de los Bounds (limite) del Mesh (es decir, el volumen de delimitación total debe estar fuera de la vista de cualquier cámara activa). Sin embargo, el limite del volumen real de un Mesh animado puede cambiar a medida que se reproduce la animación (por ejemplo, el volumen de delimitación se hará más alto si el personaje levanta la mano en el aire). Unity tiene en cuenta todas las animaciones asociadas al calcular el volumen límite máximo, pero hay casos en que no se pueden calcular los límites para anticiparse a todos los posibles casos de uso.

Cada una de las situaciones ejemplo siguientes se vuelve un problema cuando empujan huesos o vértices fuera del volumen delimitante pre-calculado:

  • Animaciones agregadas en tiempo de ejecución
  • Animaciones aditivas
  • Cambiando de forma procedimental las posiciones de los huesos desde un script
  • Utilizando vertex shader que pueden empujar los vértices afuera de los limites pre-calculados
  • Utilizando ragdolls

En esos casos, hay dos soluciones:

  1. Modifique los Bounds (limites) para que coincidan con el volumen limitante potencial de su Mesh
  2. Habilite Update When Offscreen para skin (pelar) y render el skinned Mesh todo el tiempo.

Por lo general, debe utilizar la primera opción, porque es mejor para el rendimiento. Sin embargo, la segunda opción es preferible si el rendimiento no es una preocupación importante, o si no puede predecir el tamaño de su volumen de limitación (por ejemplo, al utilizar ragdolls).

Con el fin de hacer los Skinned Meshes trabajen mejor con ragdolls, Unity automáticamente re-asigna el Skinned Mesh Renderer al hueso raíz en la importación. Sin embargo, Unity sólo lo hace si hay un único Skinned Mesh Renderer en el archivo de modelo. Esto significa que si no puede adjuntar todos los Skinned Mesh Renderer al hueso de la raíz o un hijo, y utiliza ragdolls, debe desactivar esta optimización.

Importando skinned Meshes

Actualmente, los skinned Meshes se puede importar desde:

  • Maya
  • Cinema4D
  • 3D Studio Max
  • Blender
  • Cheetah 3D
  • XSI
  • Cualquier herramienta que soporte el formato FBX

En dispositivos móviles, Unity maneja el skinning en la CPU con el assembly NEON/VFP programado manualmente. Una limitación aquí es que las normales y tangentes no están normalizados, por lo que si está escribiendo sus propios Shaders, debe manejar la normalización por usted mismo. Sin embargo, si está utilizando Surface Shaders, Unity gestiona automáticamente la normalización.

Nota: Los Meshes optimizados ordenan los huesos diferentemente de Meshes no optimizados, que resultando en problemas de animación potencialmente significativos. Esto se debe a que los meshes no optimizados dependen del orden de los huesos para animar, mientras que los meshes optimizados usan los nombres de los huesos y no dependen del orden de los huesos.

Si usted simplemente importa el archivo FBX y lo utiliza, Unity tendrá en cuenta el orden de los transforms.

Para usuarios avanzados, si usted quiere cambiar SkinnedMeshRenderer.sharedMesh:

  1. En el modo ‘non-optimized’ (no optimizado), usted necesita asegurase que SkinnedMeshRenderer.bonescoincida con SkinnedMeshRenderer.sharedMesh de manera estricta. Los Transforms referencias debería estar en el orden correcto.
  2. En el modo optimizado, es más simple; el rendering funciona siempre y cuando el avatar tenga los huesos referenciados. En este caso, SkinnedMeshRenderer.bones siempre está vacío.
Mesh Renderer
Text Mesh