Monday, March 02, 2009

Stretch IK Chain escalable

Hola, hoy por hoy es muy habitual que los rigs tengan brazos y piernas elásticas pero en muchos casos nos olvidamos de hacerlos compatibles con el escalado global del personaje (escalar el rig no es una buena práctica pero puede sacarnos de algún apuro en producción). En esta entrada quisiera comentar sobre lo simple que es compatibilizar nuestras ecuaciones con este escalado.




¿Cual es la lógica tras el stretch en una cadena de huesos con ik?
Básicamente se trata de medir la distancia entre el root y el effector/ikGoal (que llamaremos A) y si supera el largo inicial de la cadena (que llamaremos B) debemos añadir la mitad del delta entre A y B.

En la imagen tenemos una cadena compuesta de 2 huesos (bone00 y bone01) de 5 unidades de longitud cada uno. Para que nos entendamos denominaremos root al cubo amarillo desde donde nace la cadena e ikGoal al extremo contrario.

La ecuación que determina el largo de cada hueso en una situación de estiramiento en este caso está dada por:

5 + (distancia-entre-root-y-ikGoal - 10)/2

donde:
- 5 es el largo original
- distancia-entre-root-y-ikGoal es calculada dinámicamente
- 10 es el largo total de la cadena
- 2 es el numero de huesos


¿Que pasa si escalamos el control global de nuestro rig?
En tal caso obiamente la distancia entre los extremos de la cadena sería mayor y por ende el largo de cada hueso no correspondería a lo que se espera del stretch, es un problema muy común pero lo podemos solucionar de forma muy sencilla integrando una pequeña variable a nuestra ecuación anterior.

Por lógica nuestro problema se reduce a que las longitudes establecidas en el script no se ajustan dinámicamente en función de la escala global, son CONSTANTES tal como su nombre lo indica. Lo único que se ajusta dinámicamente al escalado es la función que calcula la distancia entre los extremos, de esta forma si la dividimos por el factor de escala global del rig tendríamos nuevamente todos los elementos de nuestra ecuación conviviendo en una misma escala.

De esta forma la ecuación modificada sería:

5 + (distancia-entre-root-y-ikGoal/escala - 10)/2

Donde escala sería la escala del control global (en X, Y o Z, debemos escoger un eje).


Como ven es bastante simple, a esto hay que agregar una serie de condicionales que activarían la ecuación en caso de sobrepasar la distancia original o lo que se requiera en el rig pero teniendo clara la lógica creo que el resto es fácil de deducir. Sobre la aplicación de estas ecuaciones en nuestro software 3D favorito es algo específico para cada aplicación (sintaxis y forma de medir distancias) y no quisiera encasillar esta entrada a algún software en particular.

Cualquier duda, sugerencia, corrección, ampliación del concepto o lo que sea estaré encantado de recibirla en los comentarios.

¡Un abrazo!

6 comments:

Anonymous said...

Como estas Cesar?
Que es de tu vida? - Estas en España o en tu Chile lindo? jeje
O no se puede contar??? Quiero saber de tus exitos!!!!
Te mando un abrazo y toda la suerte

Daniel Zenteno
Villa Mercedes - San Luis Argentina

César Sáez said...

Hola Daniel, gracias por comentar :)

Todavía estoy en Chile esperando que se resuelva todo el papeleo para que me den el permiso de trabajo, espero que dentro de las próximas semanas al fin se pueda resolver todo. El lado positivo es que he tenido tiempo para estar con mi familia y estudiar más que nunca, supongo que a la larga agradeceré haber tenido este periodo intermedio :-)

¡Un abrazo!

Martin Dasnoy said...

Hola Cesar!

tenes un mail para contactarte?
o manda un mail a hello@peppermelon.tv

porque varias veces necesitamos derivar trabajos de riggeo y vos la tenes mas que clara.

saludos
Martin

César Sáez said...

Hola Martín, gracias :)

Me puedes contactar a:
cesarte arroba gmail punto com

De todas formas te envío un mail y así quedamos en contacto :)

Salu2

Martin Dasnoy said...

buenisimo Cesar!

ahora... jeje vuelvo al riggeo de la pierna que esta en este post.

el parametro de escala que estas usando en el script lo sacas del controlador de personaje. en gral del controlador base.. no? yo lo hice asi y funco...
ahora, yo me acuerdo que en varios proyectos me toco escalar un escenario con un personaje, o varios personajes juntos, u otras opciones en donde usaba un auxiliar aparte para escalar.

como lo tengo ahora no funciona puesto que mi controlador base no se escalaria.
la pregunta es: hay alguna forma de leer los escalados de los "padres" de algun objeto?

salutes!
martin

César Sáez said...

Una solución sencilla sería meter un pickButton en un rollout del control principal del rig que permita escoger el nodo con respecto al cual se considera el escalado.

Tomarlo directamente de la jerarquía es técnicamente posible pero tendrías doble transformación y probablemente no obtendrías el resultado deseado.

Saludos