Trayectorias Bézier sin curva 'física' - Paso a paso

Moderadores: David, Tutores

ikerJ
Miembro Vip
Miembro Vip
Mensajes: 212
Registrado: Mar Jun 15, 2010 9:21 pm

Trayectorias Bézier sin curva 'física' - Paso a paso

Mensajepor ikerJ » Dom Nov 21, 2010 8:18 pm

Como ya sabemos, una de las propiedades más útiles de un 'Script Controller' es que nos permite 'programar' comportamientos complejos para nuestros objetos. En este caso particular, vamos a construir un sistema de puntos que reproduzcan el comportamiento de una curva Bézier.

1 -- REFERENCIAS

Lo primero que hay que hacer, siempre, es buscar información, y aquí Wikipedia nos va a ser muy útil:

http://en.wikipedia.org/wiki/B%C3%A9zier_curve

Imagen

Es decir, crearemos un punto P cuya trayectoria esté determinada por la posición de P0, P1, P2 y P3. Si os fijáis y hacemos un símil con las curvas de MAX, P0 y P3 son los vértices de la curva (knots) y P1 y P2, las tangentes.

Antes de continuar, he de deciros que no hace falta ser un matemático experimentado para poder usar estos comportamientos en nuestros 'rigs'. En muchas ocasiones, nos bastan saber dos cosas: el efecto que estamos buscando recrear y cómo interpretarlo e implementarlo en 3dsMAX.

Después de escrutar un rato la página, me doy cuenta de que la curva de arriba es de tipo 'cubic', así que busco un poco más y... ¡eureka! La fórmula de la trayectoria de una curva Bézier de tipo cúbico es ésta:

Imagen

Parece una fórmula muy compleja. Pero ya vemos que voy a necesitar la posición de 4 puntos. ¿Pero qué es t? La respuesta la tenemos un poco más abajo, viendo estos gráficos:

ImagenImagen

Deducimos, pues, que t es una variable que va de 0 a 1 (como indica la última parte de la fórmula), y que determina la posición del punto P a lo largo de toda la trayectoria. Cuando t = 0, su posición será la misma que P0, y cuando t = 1, su posición coincidirá con P3. Y en los valores intermedios, ese punto P recorrerá la trayectoria marcada por la fórmula anterior.

¿Y qué podemos usar nosotros para controlar esa variable t?

2 -- IMPLEMENTACIÓN

Ya tenemos casi todos nuestros ingredientes. ¡Ahora sólo falta ponerse a cocinar! Dije que necesitábamos 4 puntos, y uno más que será el que recorra esa trayectoria. Los creamos, intentando reproducir el esquema del primer gráfico. Nombramos los puntos siguiendo también el esquema.

Ahora, elegimos un controlador 'Position Script' para la posición del punto P. Y vamos introduciendo las distintas variables en el apartado de la izquierda. Es importante que si en estas variables vamos a hacer referencia a las posiciones de los objetos, usemos 'Assign Track' en lugar de 'Assign Controller', ya que el primero lee el valor de la posición mientras que el segundo apunta hacia el controlador (que no es un valor).

También crearemos una variable t, pero como esa letra ya está reservada en MAX, usaremos otra letra, por ejemplo, u.

La fórmula 'adaptada' es ésta:

Código: Seleccionar todo

(1-u)^3 * p0 + 3 * (1-u)^2 * u * p1 + 3*(1-u) * u^2 * p2 + u^3 * p3
donde las variables del apartado de la izquierda corresponden a:

Código: Seleccionar todo

p0 = $p0.transform.controller.position p1 = $p1.transform.controller.position p2 = $p2.transform.controller.position p3 = $p3.transform.controller.position
¿Y dónde queda u (recordad que cambiamos el nombre a t hace dos párrafos)? Pues ese valor puede venir controlado, por ejemplo, por un 'spinner' de rango [0,1] metido en un 'Attribute Holder' en el punto P. Así, al cambiar el valor, el punto se desplaza por la trayectoria. Y si movemos cualquiera de los demás puntos, la trayectoria también se modifica.

3 -- RESULTADO

Aquí debajo os dejo la escena resultante de todo esto. La esfera roja está animada del fotograma 0 al 30, y su trayectoria está visible, de manera que podáis apreciar mejor cómo al manipular los puntos o el 'spinner', la posición de ésta cambia de acuerdo a su fórmula.

Espero que esto os sirva para perder el miedo a los 'script controllers'... ¡porque son vuestros amigos! :lol:
Adjuntos
bezierScript.rar
La contraseña, la de siempre
(17.77 KiB) Descargado 355 veces

AlesDorado
Iniciado
Iniciado
Mensajes: 23
Registrado: Lun Oct 04, 2010 1:24 pm

Re: Trayectorias Bézier sin curva 'física' - Paso a paso

Mensajepor AlesDorado » Mié Nov 24, 2010 5:05 pm

Muchas gracias por el aporte, esta genial la idea.

Con esto se resuelve el problema a la hora de duplicar el "conjunto". Ya este basado el sistema en el modificador Spline IK Control o en Skin, cuando duplicas, no solo es que la copia no funcione, sino que hasta el original deja de funcionar y no se arregla deshaciendo. Creo que ya lo has comentado en otro post por ahí. En el max 2011 todavía persiste este problema.

Una vez construído el sistema me ha surgido un problema:
Si vinculamos p1 a p0 y por otra parte p2 a p3, para conseguir los handles o tagentes de una spline normal... al rotar p0 o p3 deberíamos poder variar la curvatura, pero esto no ocurre porque en el script controller tomamos la positión de p1 y p2, y aunque al rotar p0 y p3 estos se desplazan, la curvatura no varia porque en realidad estamos rotando al padre, no desplazando al hijo. ¿Como podríamos solucionar esto? (que dificil es explicar esto con palabras, tienes razón jejeje).

Por otro lado... hasta ahora siempre has construído los bendy o cadenas que se pueden curvar, con un punto en cada extremo y su tangente. ¿pero como se construíria con otro punto en mitad de la curva que además tiene 2 tangentes, una para cada dirección? Basandonos en este tipo de construcción, es decir, sin utilizar ninguna spline o nurb. Se que se podría crear este sistema dos veces y vincular el punto del medio, incluso podrían compartir el mismo punto en script controler, ¿pero se podría hacer del "tirón"? sin dar tantas vueltas. Además así solo tendríamos un path (en nuestro caso la u).

jaimeZBD
Iniciado
Iniciado
Mensajes: 23
Registrado: Mar Oct 05, 2010 5:21 pm

Re: Trayectorias Bézier sin curva 'física' - Paso a paso

Mensajepor jaimeZBD » Jue Nov 25, 2010 1:12 am

Iker, gracias por los aportes y enseñanzas... queda demostrado ue eres un matemático, físico nuclear jajajaja

ikerJ
Miembro Vip
Miembro Vip
Mensajes: 212
Registrado: Mar Jun 15, 2010 9:21 pm

Re: Trayectorias Bézier sin curva 'física' - Paso a paso

Mensajepor ikerJ » Vie Nov 26, 2010 4:04 pm

Una vez construído el sistema me ha surgido un problema:
Si vinculamos p1 a p0 y por otra parte p2 a p3, para conseguir los handles o tagentes de una spline normal... al rotar p0 o p3 deberíamos poder variar la curvatura, pero esto no ocurre porque en el script controller tomamos la positión de p1 y p2, y aunque al rotar p0 y p3 estos se desplazan, la curvatura no varia porque en realidad estamos rotando al padre, no desplazando al hijo. ¿Como podríamos solucionar esto? (que dificil es explicar esto con palabras, tienes razón jejeje).
Las variables dentro del 'script controller' hacen referencia al 'transform.controller.position', que es la posición del objeto con respecto al padre. Para hacer lo que tú quieres, tienes la opción fácil y la menos fácil:

- La fácil consiste en sustituir las variables p0, p1, p2 y p3. En lugar de que apunten a 'transform.controller.position', hacemos que apunten a los 'nodos', a los objetos en sí (usando 'Assign Node'). Luego, en el 'script', añadimos el sufijo '.pos' después de las llamadas a cada variable.

Código: Seleccionar todo

(1-u)^3 * p0.pos + 3 * (1-u)^2 * u * p1.pos + 3*(1-u) * u^2 * p2.pos + u^3 * p3.pos
De este modo usamos la posición global de cada objeto, con lo que lo que quieres hacer funciona (acabo de probarlo).

- La menos fácil implica un par de cálculos más, teniendo en cuenta lo siguiente:

ObjetoGlobalTM = ObjetoTM * inverse ObjetoPadreTM

Es decir, para averiguar las transformaciones globales de un objeto (en este caso, te interesa la posición) tienes que multiplicar su transformación por la inversa de la del padre. Obtendrías los mismos valores que en el caso anterior ;-)


Volver a “Rig de Personajes”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado