Contexto
Cuando deseamos colocar modelos ya hechos de plumas sobre un personaje, Houdini nos ofrece varios métodos para hacerlo.
https://www.youtube.com/watch?v=oFjxTe42200
Uno de estos métodos es usar guidegroom, y manualmente ir eligiendo que modelo especifico de pluma queremos usar al dibujar o plantar guías. Este método no es muy procedural pero te permite trabajar de manera rápida y relativamente precisa.
El principal problema de este técnica radica cuando tenemos que colocar grandes cantidades de plumas y a la vez tener un control procedural sobre ellas.
Para reemplazar nuestras guías por modelos de plumas hemos de utilizar el nodo Feather Template Interpolate, y dentro de este nodo existen tres métodos para hacer el reemplazo:
Groups: En este método vamos a introducir números enteros para referirnos a los modelos introducidos en el input 4 de este nodo: el template… es decir, colocamos 0 si queremos que SOLAMENTE la primera pluma de nuestro template se use, o 1 para el segundo modelo, etc.
Match by Name Attribute: Usando el atributo “templatename” en las guías, podemos definir por el nombre del modelo de pluma, que plumas vamos a usar en cada guía. Con este método podemos usar cualquier modelo en cualquier guía
Weight Arrays: Para usar este método se necesitan 2 atributos tipo array en las guias, uno que corresponden con los nombres de las plumas que vamos a usar, y otra con el peso de cada modelo que usaremos en cada guía… es decir, podemos mezclar modelos (interpolarlos) si damos diferentes valores en este array. Podemos decir por ejemplo que una pluma sea 50% de un modelo A, 25% de un modelo B, etc etc… y la pluma resultante tendrá un aspecto de mezcla entre ellos según la ponderación que usemos, He de decir que el mismo nodo normaliza esos pesos, realmente no son porcentajes realmente. Volvere a tocar este concepto mas adelante.
Este ultimo método es el que ofrece mayor flexibilidad de todos, ya que te permite no solo colocar la variedad que elijamos de modelos, sino que también podemos hacer plumas únicas resultantes de mezclar diferentes modelos.
Pero la creación del array de pesos (templateweights) es una tarea muy tecnica, no existe a fecha de hoy una forma de generarlo mas alla de la manual con un wrangle o un atribute noise.
Para solucionar este problema y hacernos la vida un poco mas facil, tenemos el ProbabilisticFeathers. El cual usa atributos del skin para definir areas en las que queremos definamos los pesos de los diferentes modelos de plumas.
Porcentajes vs Pesos
A primera vista, lo mas “artisticamente amigable” parecería ser definir porcentajes por zonas, es decir, definir que porcentaje de probabilidades queremos que una pluma aparezca en una zona determinada.
Para poner un ejemplo y de manera simplificada, supongamos que todo el personaje tendrán las mismas probabilidades de que aparezcan cada pluma: 50% de que salga la pluma A, 35% la pluma B y 15% la pluma C, el total debería ser 100%.
En dicho caso pintaríamos con 0.5 de valor A, 0.35 B y 0.15 C.
Para este caso he decidido diferenciar los modelos con colores y no con la forma, solo por simplificar.
y tendríamos algo como así:
Muy bien, lo hemos logrado, ¿no?
Que pasaría si ahora, por cualquier motivo, tuviéramos que añadir un modelo nuevo al sistema… y que quisiéramos que tuviera también una cierta probabilidad que saliese.
Nos encontramos con el problema de que tenemos que redistribuir los pesos de nuevo, porque tienen que sumar 100% en total. Habría que ademas de hacer nuevos cálculos, habría que pintar de nuevo cada mapa, y esto evidentemente es muy problemático.
El problema radica en que estamos pensando nuestro sistema como porcentajes, si en vez de usar porcentaje usamos dicho atributo como pesos ponderados la cosa cambia.
Lo que vamos a definir no serán porcentajes, sino pesos relativos.
Es decir, vamos a pintar cuanto peso de probabilidad tiene una pluma de salir al azar.
Si es 1, lo que queremos decir es que queremos que esa pluma en concreto tenga bastante probabilidades de salir, el maximo posible que se pueda entre todas las plumas que compitan por salir (cosa que puede que no sepamos a priori).
Y si elegimos 0, lo que diremos es que no queremos (con toda seguridad) que esa pluma no salga elegida allí.
En cada guía, el sistema lo que hace es ver que peso relativo de probabilidad tiene cada pluma de ser elegida al azar en relación con los pesos del resto de plumas. Si todos tienen 1, todas las plumas tienen la misma probabilidad de salir, si una pluma tiene 0, es seguro que no saldrá. Si una pluma tiene 1 y otra 0.5 (lo que sumaria mas de 100%), el sistema lo que hace es darle el doble de probabilidades de salir a una sobre la otra.
Es decir, el sistema toma en consideración, todos los pesos y le otorga a cada uno un valor ponderado de probabilidad de que aparezcan.
Cojamos el ejemplo anterior y añadamos un nuevo modelo, y démosle el valor de 0.5, o sea, el mismo que tiene el modelo A…. ahora todos sumaria un 150%.
Pero como no estamos trabajando con porcentajes, sino con pesos ponderados, todo el sistema se reajusta ante el nuevo modelo…. es decir, los modelos A y D tienen mucho mas peso que el B, y este a su vez mas que el C.
Tanto la pluma Roja como la Azul salen aproximadamente la misma cantidad de veces, luego le sigue la Amarilla, que tiene 0.35 de peso, y de ultimo la pluma verde, con solo el 0,15.
De esta manera no tenemos que sacar cuentas de antemano que porcentaje de probabilidades tiene cada pluma de salir, sino solo nos enfocamos en el peso o fuerza con la que cada pluma puja por salir en la lotería de asignación de modelos. A mayor valor, mas fuerza tiene, y viceversa.
Como podéis ver, la diferencia que existe entre porcentajes y pesos ponderados es el como interpretamos los atributos. Ya que estos son simplemente valores que van de 0 a 1.
Atributos y Modelos
En los ejemplos anteriores hemos pintado todos los mapas con un solo valor cada uno, pero la idea es distribuir los diferentes modelos en las zonas en las que mas comúnmente aparecen.
Y hasta ahora hemos usado un único atributo o mascara por pluma, pero podemos usar dichos atributos para más de una pluma.
Y distribuir multiples modelos por zona.
O una misma pluma puede usarse varias veces usando diferentes atributos. Y así tendríamos un mismo modelo apareciendo en diferentes lugares.
Se pueden hacer infinitas variaciones jugando con los atributos, bien sea porque se usan para determinar zonas o se usen para definir donde aparecen ciertos tipos de plumas exclusivamente.
Zero Pesos
Ahora bien, y que pasa si en una zona ninguna pluma quiere participar en esta lotería, es decir, que pasa si en una zona el valor es 0 para todos los pesos de todas las plumas.
¿que pluma saldrá elegida si todos los pesos suman cero?
En estos casos, probabilisticFeather nos ofrece 3 opciones (la que el artista prefiera)
– No colocar ninguna pluma:
Ideal para hacer debug, y ver si hay zonas en las que no hemos definido ningún modelo de pluma.
– Al Azar:
Todas las plumas tienen la misma probabilidad de salir, a diferencia del método anterior, esta vez no dejamos hueco
– 1er Modelo de la lista:
La primera pluma definida en la lista de posibles candidata se considera la pluma default o base, y se usará para rellenar las zonas con cero peso.
Parametros
Hay que tener presente que este sistema trabaja con guias, almacenando los atributos de pesos y templates en ellas, y no es hasta que aplicamos el Feather Template Interpolate que no se veran las plumas, y es alli cuando veremos mas claramente como funciona el sistema, sin embargo tenemos la opción de “previsualizar” temporalmente la distribución usando colores al azar:
En el parametro Feather Templates Node podemos especificar dicho nodo, el que contiene los diferentes modelos de plumas… este parámetro no es obligatorio, pero hace que funcione el menú desplegables con los nombres de las plumas, facilitándonos la tarea de tener que introducir el nombre a mano y evitando posibles fallos humanos.
Conclusiones
El sistema de momento esta diseñado para distribuir los modelos de plumas que tenemos y distribuirlos aleatoriamente según sus pesos ponderados. A futuro tengo pensado implementar un sistema que ademas de hacer lo que ya hace, nos permita interpolar de manera pondera las plumas, creando nuevos modelos basados en los que existen.