.: TUTORIAL RIG DE PIERNA PARA 3D MAX (PARTE I) :.

TUTORIAL RIG DE PIERNA PARA 3D MAX (PARTE I)


Conocimientos previos: Rigging básico, script controller, bones, y algo de trigonometría
Dificultad: Intermedia

Objetivo
Se trata de conseguir crear un rig típico para una pierna añadiendo un rig de tipo inverso para el pie.

Problema
El principal problema, es que si la distancia entre el pie y la pierna es mayor a la longitud de la pierna, ésta se separa del pie.

Solución Propuesta
Limitar la posición del pie dentro del área circular que forma el movimiento de la pierna.



 APARTADO 1: CREACIÓN DEL RIG BÁSICO 

 APARTADO 2: SOLUCIÓN DEL PROBLEMA 

 APARTADO 3: FUTURAS MEJORAS 





 APARTADO 1: CREACIÓN DEL RIG BÁSICO 

Para tener una referencia real de los ejes de coordenadas, utilizar World.



1. Creación de dos bones, desde el origen de coordenadas (0,0) hasta 200 unidades hacia abajo.
Les he dado cierto ángulo en la rodilla para que quede una pose más natural.




2. Creación de tres bones para el pie. Desde el talón a la punta de los dedos, y de los dedos al tobillo.



3. Creación de un IK HI Solver para la pierna.

  


4. Creación de la base del pie. Un Box por ejemplo.



5. Linkamos el bone de la suela a la base que hemos creado, y el IK Chain al último nodo de los bones del pie.



De esta manera conseguimos poder mover el pie y que la pierna responda al movimiento.

  


También podemos levantar desde el talón y la punta de los dedos el pie.

  


Llegados a este punto, podemos comprobar el problema que pretendemos solucionar.




Si intentamos linkar el pie con la pierna de alguna forma, se produce una redundancia cíclica que no permite dicha asociación.


 APARTADO 2: SOLUCIÓN DEL PROBLEMA 

1. Creamos un círculo con centro en el origen de coordenadas (origen de la pierna), y radio 200 unidades (fin de la pierna).

La idea general es que vamos a limitar el movimiento del pie dentro del círculo, y por lo tanto, no sobrepasará la longitud de la pierna.



2. Situamos un punto en el tobillo. Este punto será al que le apliquemos los límites de posición dentro del círculo.



3. Como de momento no nos interesa el resto, ocultamos todo excepto el círculo y el punto.



4. Y creamos un segundo punto situado en el centro. Nos servirá para definir el origen de la pierna.



5. Seleccionamos el punto del tobillo (punto inferior) y cambiamos el controlador de Position XYZ por un Position List.



6. En la siguiente propiedad libre del Position List (Available), le asignamos un controlador Position Script.



Que tiene el siguiente aspecto:



7. Ahora vamos a añadir a este controlador dos nuevas propiedades mediante MaxScript.
Creamos un nuevo script con el siguiente código (el punto del tobillo debe estar seleccionado):

def=attributes posicion
(
    parameters posicionP
   (
      x type:#float
      y type:#float
   )
)
custAttributes.add $.pos.controller[2].controller def




Y evaluamos todo (Ctrl+E). Nos aparecerá la nueva propiedad posicion, con los parámetros x,y.



8. Ahora vamos a asignar el valor de estas variables.
Abrimos un editor de gráfico y copiamos la propiedad X Position del controlador Position XYZ y lo pegamos al parámetro x que hemos creado dentro de la propiedad posicion.











Nos preguntará que tipo de copia deseamos realizar, y le diremos instancia.




Después realizamos lo mismo para la propiedad Y Position al parámetro y.
De esta manera tenemos unido el valor de posición x,y al de la posición del punto. Esto se hace para acceder fácilmente a los valores x,y desde el controlador Position Script.



9. Ahora vamos a editar el Position Script, en su ventana de Script Controller.
Añadimos las siguientes variables: angulo, h, origen, x2, y2



10. Seleccionamos la variable origen, y le asignamos mediante el botón Assign Controller al punto que está situado en el origen de coordenadas. Si lo tenemos seleccionado nos aparecerá en la lista de color amarillo, así es más fácil encontrarlo.



11. Ahora introduciremos el código mágico en el Script controller, que hará que el punto del tobillo no sobrepase el área del círculo.

x=0
y=0
r=200

h=(sqrt(((this.x-origen.pos.x)^2)+(this.y-origen.pos.y)^2))
angulo=(atan((this.y-origen.pos.y)/(this.x-origen.pos.x)))
if h>r then
   (
       if (this.x-origen.pos.x)>0 then
          (
              x=-(this.x-origen.pos.x)+((cos(angulo))*r);
              y=-(this.y-origen.pos.y)+((sin(angulo))*r)
          )
       if (this.x-origen.pos.x)<0 then
          (
              x=-(this.x-origen.pos.x)-((cos(angulo))*r);
              y=-(this.y-origen.pos.y)-((sin(angulo))*r)
          )
    )

[x,y,0]




Tras pulsar Evaluate podremos comprobar como, al mover el punto, no pasará del área que forma el círculo.

Un poco de trigonometría para entender como lo he realizado:




El algoritmo funciona de la siguiente manera:
  • Primero obtengo la distancia entre el origen de la pierna y el pie, y lo asigno a h (hipotenusa).
  • Después obtengo el ángulo que forma la pierna respeto al eje x.
  • El limitador actúa en caso de que la longitud de la pierna sea mayor a la constante r que tiene un valor de 200.
  • En caso de superarse el límite, llevo el punto a la posición 0,0 y lo sitúo a una distancia de 200 unidades respecto al origen, formando el mismo ángulo que tenia.
  • Como estamos comprobando el ángulo respecto al eje x, contemplamos el caso de que x sea positiva o negativa, para saber en que dirección situar el punto.

¿Sencillo, no?

Quien diría que me iban a servir de algo mis apuntes de trigonometría...

12. Ahora ya podemos volver a mostrar el resto.



13. Y linkamos el bone inicial de la pierna y el círculo al punto situado en el origen de coordenadas.
También linkamos el Box que sirve de base al pie con el punto inferior.



14. Al mover el punto del tobillo, parecerá que su posición queda limitada dentro del círculo.
Pero si nos fijamos en la posición del controlador Position XYZ, podremos ver que no está limitada.
Vamos a crear un punto en forma de cruz, para mostrar la posición real, y lo centraremos en el punto del tobillo:



15. De nuevo entramos en el editor gráfico y volvemos a copiar, pero esta vez los parámetros X Position, Y Position de Position XYZ del punto tobillo, y los pegaremos como instancia en los parámetros X Position, Y Position del controlador Position del nuevo punto que hemos creado.



Como podemos ver, para mover el pie utilizaremos el último punto que hemos creado, y el pie siempre quedará limitado dentro del círculo.

Para mover la pierna utilizaremos el punto situado en el origen.



 APARTADO 3: FUTURAS MEJORAS 

1. El círculo nos sirve solo para ver el límite de forma gráfica, pero una posible mejora podría ser que utilizáramos el radio del circulo para definir ese límite, que ahora es una constante de 200 unidades.

2. Este rig está pensado para un plano 2D (x,y). Si rotamos el rig necesitaremos la coordenada z para que funcione correctamente.

3. Como se muestra en los gráficos inferiores, el sistema de rig inverso para el pie, sigue funcionando. Pero nos encontramos con nuevo problema a solucionar, y es que a ciertos ángulos del empeine y suela, el pie puede volver a separarse de la pierna.




Espero que os haya sido de utilidad ;)