No tengo nada mostrable pero sigo con esto, me auto-dejo un recordatorio para subir cosas.
Con la salida de softimage 2011 y la posibilidad de escribir kinematics mediante ICE el enfoque de todo esto ha cambiado bastante para mi, haré una guía mucho más dinámica con previews en tiempo real basados en ICE (partículas y representaciones openGL) y luego usando python usaré esas partículas para crear los deformers y controles para el rig (ICE Kinematics) de forma que todo será mucho más procedural que lo que pensaba al principio. La idea es usar esto como una forma de crear mi propio mini pipeline y a la vez probar metodologías para hacer rigs basados en ICE Kinematics, es toda una revolución en la forma de hacer rigging y este ejercicio me parece perfecto para investigar como afrontarlo.
----------------------------------
Actualmente y a raíz de la nueva guía estoy buscando la forma de calcular la posición de los deformers (y representarla en ICE) interpolando con longitud de arco constante a través de una bezier de 4 puntos.
Me explico, la ecuación clásica de una bezier está expresada en función de un parámetro que va de 0 a 1 (como quien dice la U de una curva nurbs), el problema es que ese parámetro tiene que ver con las tensiones y no con longitud de arco por lo que no asegura una uniformidad y no me sirve.
Según he repasado en mis apuntes para lograr la longitud de arco de una línea continua debemos integrar la raíz cuadrada de 1 más la derivada al cuadrado de su ecuación (que mal queda por escrito), pongo un ejemplo:
f(x) = x ---> ecuación de una línea recta desviada 45 grados
f'(x) = 1 ---> derivada de f(x)
S = ∫ sqrt(1 + 1^2) == ∫ 2^1/2
S = 2^1/2 * x ---> ecuación de la longitud de arco
De esta forma la longitud de arco entre los límites 0 e 1 en el eje x sería:
S = 2^1/2 * 1 + 2^1/2 * 0 = 2^1/2 = 1.4142...
Lo cual funciona perfectamente en este caso, el problema con la ecuación de la bezier es que es bastante más compleja y si no me equivoco con algún número llegamos a una ecuación no integrable por lo que no se podría resolver de forma empírica.
f(x) = A*(1-x)^3 + 3*B*x(1-x)^2 + 3*C*x^2(1-x) + D*x^3
donde A, B, C y D son los 4 puntos de control
f'(x) = 3*x^2*D + (6*x-9*x^2)*C + (9*x^2-12*x+3)*B + (-3*x^2+6*x-3)*A
S = ∫ sqrt( 1 + ( 3*x^2*D+(6*x-9*x^2)*C+(9*x^2-12*x+3)*B+(-3*x^2+6*x-3)*A ) ^ 2 ) -> no integrable
He estado buscando alternativas y tengo una solución que medio funciona donde por medio de iteraciones sobre la bezier calculo la longitud de arco e interpolo la posición en base a ello, aún tengo que refinar la forma de interpolar las posiciones de los segmentos pero no descarto usar alguna forma más elegante de resolverlo (por ejemplo descomponiendo la bezier de forma que llegue a una ecuación integrable). En definitiva aún no doy con la tecla pero estoy en ello.
Si alguien tiene una sugerencia es bienvenida, parece una tontería de hacer cuando se piensa sólo en el resultado final pero es bastante más difícil (y divertido) de lo que parece.
Pronto más!