Reverse Foot IK y stretchy Leg Tutorial



En el siguiente pequeño tutorial explicare como hacer un rig de pierna con reverse foot IK y que podamos estirarla cuando queramos y usarla de manera normal cuando no sea necesario. Aclaro que el método aquí usado no es inventado por mi al contrario es como un conjunto de varios tutoriales que eh encontrado muy útiles. Bueno, primeramente obvio trazamos nuestro rig y lo renombramos de una manera que para nosotros sea mas fácil de entender.


Creamos 3 IK's, uno que va del primer joint en este caso lo llamare leg_r al talón, que sera ankle_r, el segundo IK, iria del ankle_r a ball_r que es el joint que tenemos en la planta del pie, y el ultimo de ball_r a toe_r que seria nuestro ultimo joint en la cadena.



Agruparemos el ankleIK_r en si mismo, ubicando el pivote en el joint ball_r y llamamos este grupo gp_ball , ahora agruparemos el ballIK_r y toeIK_r ubicando su pivote en el joint ball_r de la misma manera que el anterior, este grupo lo llamaremos gp_toe. Con esto lograremos tener un control en alzando el talón sin afectar la planta del pie y así mismo alzar la planta (los dedos) sin afectar al talón.
Ahora agruparemos gp_toe y gp_ball para crear el grupo gp_toetip y colocaremos su pivote en el joint toe_r , este grupo nos permitirá que podamos alzar o girar el pie usando como pivote la punta del pie de nuestro personaje. Nos queda de la siguiente manera.


Creamos una curva, con la forma que nos guste para controlar estos movimientos, llamare a esta ctrl_foot_r , colocando su pivote en ankle_r , démosle un freeze tranformation y agreguemos atributos a esta curva que serán los siguientes Ball Raise, Toe Raise, Toe Pivot, Ankle Raise, normalmente uso esos nombres, puedes usar los que mas te gusten :p.

Recurramos al conecction editor, y conectamos cada movimiento respectivamente, Ankle Raise a gp_ball lo conectamos a su rotacion en X, Ball Raise a gp_toe igual su rotación en X, Toe Raise a gp_toetip en rotate X y por ultimo Toe Pivot a gp_toetip en rotate Y, concluido este ya solo los faltaría crear una curva para la rodilla y hacer el pole vector y listo tenemos nuestro rig de la pierna, solo nos faltaría ya hacer el stretchy.

Para esto tomaremos el Distance tool, colocando nuestro primer locator en leg_r y el ultimo en ankle_r, haremos un Constrin Ponit del joint leg_r a nuestro primer locator, que llamare dsloc_leg_r, luego haremos un Constrain Point igual pero ahora del ankleIK_r al segundo locator que llamare dsloc_knee_r, por ultimo renombrare mi distancia a dsdist_leg_r, esto solo para no hacerme bolas y sea mas facil referila cuando hagamos el codigo.



Ya con esto hecho, agregaremos a nuestra curva algun elemento de control que nos permita prender y apagar el Stretchy, en este caso usare Mode en boleano solo para que tenga on y off.


Vamos a estirar un poco nuestra pierna hasta el punto en el que veamos que la rodilla queda totalmente estirada y justo antes del limite en el que el controlador se separa de nuestro pie. y tomemos esa medida. en este caso es 8.75.


Pasaremos ahora si al Expression Editor, y creamos la siguente expresion, llamemosla Stretchy_limb. colocaremos el siguente codigo :

if (ctrl_foot_r.mode == 1)
{
if (dsdist_leg_rShape.distance >= 8.75 )
{
leg_r.scaleX = dsdist_leg_rShape.distance / 8.75;
knee_r.scaleX = dsdist_leg_rShape.distance / 8.75;
}
else
{
leg_r.scaleX = 1;
knee_r.scaleX = 1;
}
}
else
{
leg_r.scaleX = 1;
knee_r.scaleX = 1;
}

Si probamos nuestro Rig veremos como si tenemos el mode en on la pierna se alargara al pazar los 8.75 que le marcamos, con esto estamos ya casi completos, pero tmb ocaciona un problema, si tienes un rig en el cual piensas escalar tu personaje verar como la pierna llega a romperse, claro aqui supondre que tienes tu rig acomodado pensando en los grupos y eso, bueno, esto lo solucionaremos creando un MultiplyDivide Node, llamemoslo div_leg_r , cambiemoslo a Divide y pongamos en su Input1X nuestra distancia, 8.75, y de la misma manera en Input2X, luego cambiareos un poco nuestro mel.

Primero crearemos una nueva expresion, llamemosla div_scale, :

div_leg_r.input1X = charScale.sy * 8.75;

y cambiaremos nuestro Stretchy_limb a :


if (ctrl_foot_r.mode == 1)
{
if (dsdist_leg_rShape.distance >= div_leg_r.input1X )
{
leg_r.scaleX = dsdist_leg_rShape.distance / div_leg_r.input1X;
knee_r.scaleX = dsdist_leg_rShape.distance / div_leg_r.input1X;
}
else
{
leg_r.scaleX = 1;
knee_r.scaleX = 1;
}
}
else
{
leg_r.scaleX = 1;
knee_r.scaleX = 1;
}

Con esto ya no tendremos problemas al escalar nuestro personaje y funcionara de manera correcta. Bueno espero les haya servido, funciona de la misma manera para el brazo, es algo que a mi me ah zido de vastante utilidad ;)

0 komentarioz: