Source SDK

Source SDK

Not enough ratings
$proceduralbones - Motor Source 2013
By Oitnemood
$proceduralbones utiliza un archivo de definición especial (VRD) para indicar al motor que anime automáticamente ciertos huesos en tiempo de ejecución.
   
Award
Favorite
Favorited
Unfavorite
Concepto
Los huesos procedurales, también conocidos como "controladores" (Blender) o "driven keys" (Maya), utilizan la rotación de un hueso para controlar la rotación y traslación de otro.
-El primer hueso llamado hueso conductor o de control
-es típicamente animado por un humano, mientras que el segundo hueso
-llamado hueso procedural o de ayuda
-rota y/o se traslada automáticamente, de acuerdo a la rotación del hueso conductor.
Se utilizan para los fotogramas clave "keyframes" de rotación especiales, llamados "triggers" en el VRD, para asignar un rango de movimiento en el hueso controlador a un rango de movimiento en el hueso procedural.

El antebrazo humano, recubierto con huesos de torsión a lo largo del eje, es el ejemplo perfecto de huesos procedurales en Source.
Cuando el hueso de la mano gira en el sentido de las agujas del reloj, el hueso de torsión del antebrazo también gira automáticamente en el sentido de las agujas del reloj.
Cuando el hueso de la mano gira en sentido contrario a las agujas del reloj, el hueso de torsión también gira en sentido contrario.
La extensión de ambas rotaciones puede controlarse fácilmente en el archivo VRD.
Aplicaciones habituales de los huesos procedurales
Reducir el tiempo necesario para completar una pose o animación, ya que el artista debe manipular menos huesos.
Mejorar el aspecto de un modelo cuando importa una animación en tiempo de ejecución (es decir, mediante $includemodel) que no anima todos los huesos del modelo (en particular, los huesos de torsión).
Aplicar un skinning correctivo a la malla, mitigando las deformaciones causadas por el modelo de skinning lineal y las reglas de animación de Source.

Twist bones
Huesos retorcidos en español, el caso de uso más común de los huesos procedurales en Source es aplicar los dos primeros principios a los huesos de torsión, como en los antebrazos, la parte superior de los brazos, los muslos y las espinillas de los modelos humanos. En el diagrama de la derecha, se coloca un hueso de torsión en el centro del antebrazo (ValveBiped.Bip01_L_Ulna), otro hueso de torsión en la muñeca (ValveBiped.Bip01_L_Wrist) y la malla se despelleja en consecuencia. En lugar de requerir que el animador pose la mano, la muñeca y el cúbito todos juntos, $proceduralbones se puede utilizar para girar automáticamente los huesos cúbito y muñeca cuando el animador gira sólo el hueso de la mano. Esto ahorra tiempo y esfuerzo no sólo al crear nuevas poses, sino también al importar poses y animaciones que fueron creadas en un esqueleto más simple que podría no incluir ningún hueso de torsión.

Corrective Deformations
Deformaciones correctivas en español, Trabajar en torno al límite arcaico de Source de tres influencias óseas por vértice despellejado puede resultar difícil, especialmente en regiones como el tórax o la pelvis de un bípedo o cuadrúpedo. Hay dos formas principales de utilizar los huesos procedurales para mejorar la calidad de la deformación de la malla en estas zonas problemáticas.

Leaf Bones
Huesos de hoja en español, En las zonas en las que el modelo de despellejamiento lineal de Source provoca una pérdida de volumen de la malla, como los codos o las rodillas, se pueden utilizar huesos de procedimiento para contrarrestar el indeseable pellizco o estiramiento de la malla. Introduzca uno o más huesos de hoja en la zona problemática y despelleje la malla en consecuencia. A continuación, utilizando $proceduralbones, la rotación y la traslación de los huesos de la hoja puede ser impulsada por la rotación del hueso del codo o de la rodilla.

Corrective Flexes
Flexiones correctivas en español, En algunas ramas del motor† que soportan $boneflexdriver, es posible utilizar huesos procedurales para desvanecer automáticamente las flexiones. Esta técnica se presta mas a la aplicación de formas correctivas locales o "delta mush" limitadas a partes de una malla que experimentan deformaciones de baja calidad, tipicamente cuando se ponen en poses extremas. Hay que tener cuidado al utilizar esta técnica, ya que cada flexión correctiva ocupa una ranura de flexcontrolador y requiere un hueso correspondiente en el esqueleto del modelo para impulsarla. Esto puede sumarse rápidamente, contando contra el límite de flexcontroladores MDL (normalmente 96 o 128) y el límite de huesos (normalmente 128) y reduciendo el número de flexiones normales y huesos disponibles para el modelo.

Self-collision Approximation
Aproximación de auto colisión en español, Los huesos procedurales pueden simular una aproximación rápida y sucia de la colisión entre las partes de un modelo.
Por ejemplo, consideremos un modelo humano que lleva un traje chaqueta. El dobladillo de la chaqueta podría ser simplemente despellejado a los huesos del muslo, de tal manera que el dobladillo se dobla cuando el modelo levanta la rodilla. Alternativamente, el dobladillo podría estar unido a un hueso separado, y $proceduralbones podría utilizarse para indicar al hueso del dobladillo que gire cuando el hueso del muslo gire. En este último caso, el dobladillo se sigue doblando cuando el modelo levanta la rodilla, pero ahora el animador puede posar el muslo y el dobladillo de forma independiente, mejorando la versatilidad del modelo. Yendo un paso más allá, se pueden crear varios huesos de dobladillo en la parte delantera, lateral y trasera de la chaqueta del traje, y se puede utilizar $proceduralbones para mover sólo el hueso de dobladillo correcto cuando se mueve el muslo del modelo.
De esta forma, cuando el modelo levanta la rodilla, el dobladillo trasero de la chaqueta permanece inmóvil, y sólo se dobla el dobladillo delantero. Este concepto también puede aplicarse a los accesorios rígidos de un modelo deformable, especialmente en las zonas en las que varios huesos ejercen influencia sobre la malla deformable.
Syntax
$proceduralbones <archivo de configuración>
VRD files
Los archivos VRD funcionan de forma similar a las llaves manejadas en Maya. Se define la jerarquía importante del hueso controlador y del hueso procedural, luego se especifican dos o más "disparadores".
Cada disparador asigna una rotación discreta del hueso controlador a una rotación y/o traslación discreta del hueso procedural.
En tiempo de ejecución, el motor interpola automáticamente la pose del hueso procedimental entre todos los disparadores definidos, inclinándose hacia el disparador del hueso controlador más cercano.
El bloque de definición
Dado que $proceduralbones sólo puede utilizarse una vez en su archivo QC, un único archivo VRD puede definir múltiples huesos de procedimiento. Cada bloque de definición comienza con una línea <helper>, una línea <basepos>, y termina con una o más líneas <trigger>. Para comenzar un nuevo bloque de definición y definir otro hueso de procedural, simplemente comience con una nueva línea <helper> después de la última línea <trigger>.

Ejemplo: Archivo VRD hecho a mano para el modelo HWM Femscout

Source Filmmaker se utilizó para configurar este archivo VRD, pero puedes utilizar cualquier software de modelado que admita modelos para el Motor Source.
<helper> hlp_forearm_L bip_lowerArm_L bip_lowerArm_L bip_hand_L <basepos> -0.0003 -4.7578 -0.000685692 <trigger> 90 -0.140879 -7.0729 0.923253 2.05439e-06 -0.00011566 -0.0109454 0 0 0 <trigger> 90 -157.919 -89.6281 158.827 0.101044 -61.3622 -0.505184 0 0 0 <trigger> 90 -0.905463 81.1157 0.0128013 -1.79037e-05 49.6029 -0.0109647 0 0 0 <helper> hlp_forearm_R bip_lowerArm_R bip_lowerArm_R bip_hand_R <basepos> -0.0502548 4.76207 -0.0109539 <trigger> 90 -0.116485 -7.07782 0.923253 -26.1455 -71.739 -60.6497 0 0 0 <trigger> 90 -0.288436 72.9621 0.610626 -72.1773 -44.2586 -20.2743 0 0 0 <trigger> 90 -179.149 -81.8242 -179.905 81.3212 -37.0352 -157.273 0 0 0
Construcción de un bloque de definición
Paso 1: <helper>

Cada bloque de definición comienza con una línea <helper>. Especifica el hueso controlador, el hueso procedural y sus huesos padres "parent"

<helper> ProceduralBone ParentOfProceduralBone ParentOfDriverBone DriverBone

ProceduralBone es el nombre del hueso que será animado proceduralmente. En una configuración típica de antebrazo humano, éste sería el hueso de torsión del cúbito.
ParentOfProceduralBone debe ser el padre de ProceduralBone.
ParentOfDriverBone debe ser el padre de DriverBone.
DriverBone es el nombre del hueso cuya rotación hará que ProceduralBone se anime.
En una configuración típica de antebrazo humano, este sería el hueso de la mano.
Ejemplo
<helper> hlp_forearm_L bip_lowerArm_L bip_lowerArm_L bip_hand_L

(advertencia)
La presencia de ciertos caracteres en cualquiera de los nombres de los huesos hará que su herramienta de compilación como "crowbar" lo aborte. Ten en cuenta que esto incluye el punto, que es comúnmente usado en los esqueletos de Valve. Para evitar esto, simplemente quita todo hasta e incluyendo el punto cuando introduzcas los nombres de los huesos en el archivo VRD. Por ejemplo, en lugar de escribir ValveBiped.Bip01_L_Hand, escribe Bip01_L_Hand.

Notas sobre la jerarquía del hueso "Bone Hierarchy"

Si ProceduralBone y DriverBone son hermanos, entonces ParentOfProceduralBone y ParentOfDriverBone serán el mismo hueso. Este suele ser el caso de las configuraciones de huesos de torsión en brazos y piernas.

Alternativamente, es posible definir una regla de procedimiento en la que el hueso procedural y el hueso conductor no sean hermanos.
En consecuencia, ParentOfProceduralBone y ParentOfDriverBone serán huesos diferentes. En este caso, sin embargo, debe haber una ruta clara en la jerarquía del esqueleto entre ParentOfProceduralBone y ParentOfDriverBone. Tres escenarios son posibles: 1) ParentOfProceduralBone y ParentOfDriverBone comparten un hueso ancestro común; 2) ParentOfProceduralBone es el padre inmediato de ParentOfDriverBone; o 3) ParentOfDriverBone es el padre inmediato de ParentOfProceduralBone.
Por último, también es posible que el hueso procedural sea hijo directo del hueso conductor, en cuyo caso ParentOfProceduralBone y DriverBone serán el mismo.

Paso 2: <basepos>

Es la traslación de referencia del hueso Procedural en el sistema de coordenadas local de su hueso padre "pared"

<basepos> X Y Z

Ejemplo: <basepos> -0.0003 -4.7578 -0.000685692

Encuentre o cree un script para calcular este valor en su software de modelado. Alternativamente, puede utilizar Crowbar para obtener este valor sin necesidad de software de modelado.
Descompile su modelo, luego encuentre la línea $definebone para el hueso procedural.
Los 3 primeros números son la posición de referencia del hueso en el espacio hueso-padre "bone-parent"

Paso 3: La referencia <trigger>.

Cada <trigger> es un keyframe que mapea una rotación observada del hueso driver a una rotación deseada del hueso procedural.
Aunque no es estrictamente necesario, el primer <trigger> debe especificar las rotaciones de pose de referencia del hueso controlador y del hueso de procedimiento.
<trigger> AngleOfInfluence Vec3_WatchedDriverBoneRotation Vec3_DesiredProceduralBoneRotation Vec3_DesiredProceduralBoneTranslation

  • AngleOfInfluence se expresa en grados y especifica cuánto debe rotar el hueso controlador para que el hueso procedural alcance la totalidad de su rotación y traslación.
  • Visualiza el AngleOfInfluence como un cono; el hueso procedural alcanza la extensión completa de su rotación y traslación deseada cuando la rotación del hueso driver observado alcanza o excede los límites del cono. Con un ángulo mayor, como 90 grados, el hueso controlador debe rotar mucho antes de que el hueso procedural alcance su rotación y traslación deseadas. Con un ángulo menor, como 30 grados, el hueso driver no necesita rotar mucho para que el hueso procedural alcance su rotación y traslación completa deseada.

Ejemplo:
// AoI Vec3_WatchedDriverBoneRotation Vec3_DesiredProceduralBoneRotation Vec3_DesiredProceduralBoneTranslation <trigger> 90 -0.140879 -7.0729 0.923253 2.05439e-06 -0.00011566 -0.0109454 0 0 0

Elegir un ángulo de influencia
  • Cada <trigger> puede tener un AngleOfInfluence diferente.
  • El AngleOfInfluence del <trigger> de referencia debe ser típicamente la deflexión angular máxima que el hueso conductor puede experimentar.
  • La mejor manera de determinar esto es determinar primero el AngleOfInfluence para cada extremo <trigger> (véase la sección siguiente). A continuación, identificar el extremo <trigger> con el mayor AngleOfInfluence, y simplemente copiar ese valor a la referencia <trigger>'s AngleOfInfluence.

Paso 4: Los <trigger> extremos
Aquí es donde finalmente se define la animación procedural de su hueso procedural.

  • Primero, determine los extremos del rango de movimiento de su hueso conductor, que variará para cada parte de su modelo. En el caso del hueso conductor de la mano de un antebrazo humano, normalmente será de unos 100 grados en el sentido de las agujas del reloj y en sentido contrario.
  • En su software de modelado, rote el hueso conductor al primer extremo.
    Esta es la rotación observada del hueso conductor.
  • Posicione el hueso procedural en consecuencia, para que el modelo "se vea bien". Esta es la rotación y/o traslación deseada del hueso procedural.
Reuna las rotaciones del espacio del hueso padre para Vec3_WatchedDriverBoneRotation y Vec3_DesiredProceduralBoneRotation. Si no ha trasladado el hueso de procedimiento, Vec3_DesiredProceduralBoneTranslation será 0 0 0; de lo contrario, recopile también la traslación del hueso de procedimiento en el espacio del hueso padre. Por último, determine un AngleOfInfluence adecuado; en la mayoría de los casos, puede ser simplemente el ángulo entre la nueva rotación del hueso controlador y su antigua rotación. Escriba la nueva línea <trigger> en su archivo.

Ejemplo:
// AoI Vec3_WatchedDriverBoneRotation Vec3_DesiredProceduralBoneRotation Vec3_DesiredProceduralBoneTranslation <trigger> 90 -157.919 -89.6281 158.827 0.101044 -61.3622 -0.505184 0 0 0

Repita este proceso y cree un nuevo <trigger> para cada pose extrema del hueso conductor.
Cuando haya terminado, debe tener al menos dos <trigger>s en su bloque de definición.
El primero es el <trigger> de referencia, los siguientes son los extremos.

Ejemplo:
<helper> hlp_forearm_L bip_lowerArm_L bip_lowerArm_L bip_hand_L <basepos> -0.0003 -4.7578 -0.000685692 <trigger> 90 -0.140879 -7.0729 0.923253 2.05439e-06 -0.00011566 -0.0109454 0 0 0 <trigger> 90 -157.919 -89.6281 158.827 0.101044 -61.3622 -0.505184 0 0 0 <trigger> 90 -0.905463 81.1157 0.0128013 -1.79037e-05 49.6029 -0.0109647 0 0 0

Nota: ¡Determinar los extremos de los huesos de tu personaje y crear <trigger>s para ellos es un proceso subjetivo!
Variará entre diferentes personajes y diferentes partes del mismo personaje.
Ejemplo de proceso con un antebrazo humano
Se requieren tres <trigger>s en total: 1) la pose de referencia, 2) una pose en la que el hueso conductor (la mano) se gira en el sentido de las agujas del reloj hasta donde debería llegar, y 3) una pose en la que el hueso conductor se gira en sentido contrario a las agujas del reloj hasta donde debería llegar. Determinar cuánto debe rotar la mano en ambos sentidos es subjetivo y depende del modelo. En última instancia, usted está creando huesos procedurales para mejorar la apariencia de su modelo, así que elija lo que se vea mejor.
  • Crea el <trigger> para la pose de referencia, como se detalla arriba.
  • Crea el <trigger> para el extremo de las agujas del reloj.

1. Gire el hueso de la mano en el sentido de las agujas del reloj a lo largo del eje del antebrazo, hasta donde se supone que debe llegar.
2. Rota el hueso cúbito en el sentido de las agujas del reloj a lo largo del eje del antebrazo hasta que la deformación de la malla parezca aceptable.
3. Escriba un <trigger> para esta pose.
  • Devuelve tu modelo a su pose de referencia.
  • Crea el <trigger> para el extremo antihorario.
1. Gire el hueso de la mano en el sentido contrario a las agujas del reloj a lo largo del eje del antebrazo, hasta donde se supone que debe llegar.
2. Rota el hueso cúbito en el sentido contrario a las agujas del reloj a lo largo del eje del antebrazo hasta que la deformación de la malla parezca aceptable.
3. Escribe un <trigger> para esta pose.

Consejo:
Consulte el ejemplo femscout VRD anterior en este artículo para asegurarse de que el diseño de su archivo VRD es correcto.
Recapitulación e Idiosincrasia
Para modelos simétricos, como los humanos, deberás repetir el proceso anterior para crear la misma disposición de huesos en el lado reflejado del personaje. A menos que sepas exactamente lo que estás haciendo, no te limites a copiar y pegar todos los números de los huesos del lado izquierdo a los huesos del lado derecho, o viceversa. Revisa cada paso del proceso completo y crea un nuevo bloque de definición para cada hueso procedural que necesites definir.

Un hueso procedural no puede ser controlado por dos o más huesos "driver".
Lo contrario, sin embargo, es posible: un hueso controlador puede ser reutilizado varias veces para controlar más de un hueso procedural.
Varios
Puede especificar un nombre que no afecta al código para un activador "trigger" en ingles:
<trigger> 90 -6.75868e-015 1.59028e-015 3.18055e-015 0 0 0 0 0 0 UselessTriggerName

Este nombre no tiene relevancia funcional lo cual, hace que no de ningún error al compilar.

Otras palabras clave válidas

Aparte de <helper>, <basepos>, y <trigger>, studiomdl acepta algunas otras palabras clave en los archivos VRD.

<display>

La palabra clave <display> es utilizada por Softimage Mod Tool para almacenar los atributos de la apariencia de los huesos procedurales en el viewport de Mod Tool.
Inútil para cualquiera que no utilice Softimage.

<rotateaxis> X Y Z
Especificado como un ángulo Euler X Y Z. El ángulo Vec3_DesiredProceduralBoneRotation en todas las líneas <trigger> subsiguientes es pre-multiplicado por este ángulo.

Todo:
Determinar el propósito práctico de esto.

<jointorient> X Y Z
Especificado como un ángulo Euler X Y Z.
El ángulo Vec3_DesiredProceduralBoneRotation en todas las líneas <trigger> posteriores se postmultiplica por este ángulo.

<aimconstraint>
Funciona con otras palabras clave <aimvector> y <upvector>.
Presumiblemente crea un hueso procedural que funciona como un "aim constraint" en Maya.

Todo:
Investigar esto más a fondo.