XSIforum.com

Offset entre shapes?

0 Usuarios y 2 Visitantes están viendo este tema.

Offset entre shapes?
« en: 12 Junio 2011, 23:27:08 »
¿Como podría hacer que un Shape/controlador maneje otro shape, y que este se pueda seguir controlando? Es decir, como cuando se hace un offset con un null que tiene un padre que lo mueve, pero éste se puedo seguir manejando y con sus coordenadas locales a 0.


Básicamente lo que quiero hacer es, en el parpadeo de un ojo (hecho con shape), hacer un controlador para llevar los dos shapes (párpado superior e inferior) a 0, independientemente de donde estén, pero no lo consigo.


PD. otro opción sería hacer el parpadeo por deformadores, pero ya puestos prefiero hacer así. Que además seguro que busco más posibilidades  :D

Re: Offset entre shapes?
« Respuesta #1 en: 13 Junio 2011, 00:03:40 »
No sé si he entendido bien ¿quieres que el weight de un shape esté controlado por 2 controles en jerarquía?

Si suponemos que lo que mueve al shape es posy y ambos controles están en pose neutra/normalizada con una simple suma+clamp (-1 ~ 1) puede valer, algo como esto:

MIN(1, MAX(-1, parent.kine.local.posy + child.kine.local.posy) )

¿Tiene sentido? ¿Lo he entendido bien?

Un saludo O0

Re: Offset entre shapes?
« Respuesta #2 en: 13 Junio 2011, 00:51:57 »
Parece que es exactamente eso.
Me suena de cuando me lo explicaron en Maya, que se hacía así. Pero me lo explicaron con nodos (por eso no me quedé con la copla xD), además que desconocía la expresión.


¿Como funciona esto exactamente? Así mirandolo no lo entiendo bien.

Mañana lo pruebo. A ver si me sale.

Re: Offset entre shapes?
« Respuesta #3 en: 13 Junio 2011, 01:31:29 »
La expresión en lenguaje humano sería algo como: dame la posición en y del padre + la posición en y del hijo limitada en un rango de -1 a 1.

Es decir:
- Si subes el padre al máximo el valor del shape será 1
- Si subes el hijo al máximo el valor del shape será 1
- Si subes el padre al máximo y bajas el hijo al mínimo el valor del shape será 1 +(-1) = 0
- Si subes el padre a la mitad y el hijo a la mitad el valor del shape será 0.5 + 0.5 = 1
etc...

No sé, conceptualmente es muy sencillo y por eso preguntaba si esa realmente era la pregunta, lo mismo me estoy "pasando de listo" y no la he entendido bien.

Un saludo

Re: Offset entre shapes?
« Respuesta #4 en: 13 Junio 2011, 15:32:45 »
Uff, no me ha salido xD.
Aver, me he puesto y me he dado cuenta que no sabía que donde debía meter la expresión. Iba pensando que sería a los shape "hijos", pero claro, si le meto una expresión a un shape este ya no lo puedo controlar.

Ahí me he quedado, que mal me veo últimamente xD.

PD. Entiendo lo que hace César, lo que no se es como utilizarlo. Tanto minimus como maximus me pide dos valores ¿que es cada valor? ¿usando MIN por ejemplo marcaría por dos mínimos distintos?

Re: Offset entre shapes?
« Respuesta #5 en: 13 Junio 2011, 17:23:15 »
MIN(A,B) se queda con el valor menor entre A y B
MAX(A,B) se queda con el valor mayor entre A y B

Por ejemplo...

MIN(58, 4) = 4
MAX(32, 12) = 32

Usando la expresión anterior pero con constantes (en negritas) para que quede más claro...

MIN(1, MAX(-1, -2.5) ) = MIN(1, -1) = -1
MIN(1, MAX(-1, 4) ) = MIN(1, 4) = 1

En definitiva, el uso del MIN y MAX anidados te permiten establecer límites en la expresión, un clamp de toda la vida :)

Re: Offset entre shapes?
« Respuesta #6 en: 14 Junio 2011, 23:44:37 »
Vale, vale. Ahora sí, ya lo tengo.

Ahora me surge otra duda.
Esto está ya hecho, pero en el mismo ejemplo del párpado, si el superior por ejemplo está abierto, y el inferior casi cerrado, al hacer el blink, los dos llevan una velocidad digamos lineal (normal porque lo que hace es sumarle el valor de otro parámetro), entonces hace el parpadeo escalado, uno llega antes que otro.

¿Se podría conseguir que ambos shapes lleguen a la vez a 1?


PD. gracias por todo César ^^


Re: Offset entre shapes?
« Respuesta #7 en: 15 Junio 2011, 18:41:23 »
A ver, recapitulando que me lio...
Tienes 1 shape para el párpado superior y otro para el párpado inferior (0=cerrado, 1=abierto), y quieres tener control para los párpados de forma independiente pero además otro control adicional para hacer el blink sin que entre ellos se neutralicen... ¿Es eso?

En ese caso es tan simple como multiplicar el valor del control correspondiente con el control de blink, de esa forma con blink = 0 siempre tendrás los párpados cerrados (parpado * 0 = cero -> cerrado) y con blink=1 tendrás el valor de los controles (parpado * 1 = parpado).

¿Se entiende?

Re: Offset entre shapes?
« Respuesta #8 en: 15 Junio 2011, 19:46:04 »
Que lío xD. A ver, es lo que comentas pero te has quedado atrás, eso que comentas ya está solucionado. Empiezo de nuevo.

Yo abrí el hilo porque teniendo 2 shapes (cierre párpado superior e inferior), y quiero poder hacer un blink (cerrar ambos párpados) con un sólo controlador, pero manteniendo la posibilidad de seguir manejando cada párpado de manera individual.
HASTA AQUÍ HECHO.
Al final lo solucioné creando 3 parámetros (cierre parpadoSUP, cierre INF, blink), además de los 2 shapes. De tal manera que cada shape tiene esta expresión:
MIN(1, MAX(-1, parametroSUP/INF + parametroblink))
Así manejo cada párpado de manera individual, y puedo hacer blink.


AHORA MI NUEVA DUDA.
La expresión de los shapess hace que se sume al valor del controlador (parámetro) de cada shape, el valor del blink. Así que si el parámetro blink está 1, los dos shapes estan-> 1 (cerrados), y si está a 0, los dos shapes se manejan de manera independiente con sus correspondientes parámetros.

Bien, pues lo que me pasa es que al hacer blink, los dos párpados NO llegan a la vez a 1, es decir.
- Párpado SUP está a más de 0 (0,5 por ejemplo), párpadoINF está a 0 -> cierra primero el SUP y después el INF
- Párp.SUP está 0, y INF a más de 0 -> cierra primero el INF después el sup.

Es decir, que sólo cierran a la vez, si los shapes SUP e INF tienen el mismo valor, sino un párpado llega a 1 antes que otro.


A ver si ahora.
Si puedo hago un escena para veas como está montado.


EDITO
Escena rápido Softimage 2011, por si no se entiende
http://download121.mediafire.com/no25lgd8filg/lkku4hxjee8bmdq/Blink.scn
« Última modificación: 15 Junio 2011, 20:02:10 por Chelos »

Re: Offset entre shapes?
« Respuesta #9 en: 15 Junio 2011, 22:43:51 »
Vaaaale, deberíamos haber empezado por aquí :D

No tengo Softi 2011 pero si ejecutas este script sobre la escena (es una chapuza, no le hagas mucho caso al código) debería setear las expresiones para que funcionen como me has descrito, en el fondo no es más que sumar y multiplicar parámetros entre si :)

Código: (python) [Seleccionar]
get = lambda p_sName: Application.Dictionary.GetObject(p_sName)
dParams = { "ParpadoSUP": get("Mixer.Mixer_Shape_Track.Shape_ClusterClip.Mixer_Shape_Track1.Shape_ParpSUP_Clip.actionclip.weight"),
"ParpadoINF": get("Mixer.Mixer_Shape_Track.Shape_ClusterClip.Mixer_Shape_Track2.Shape_ParpINF_Clip.actionclip.weight")}
oProp = Application.ActiveSceneRoot.Properties("paremetros")
for k, v in dParams.iteritems():
sExpr = "1 - ((1 - %s) * (1 - %s))" % (oProp.Parameters("Blink"), oProp.Parameters(k).FullName)
v.AddExpression(sExpr)