Tuesday, February 24, 2009

delayed rib archives

Este ejercicio fue para probar DRAs o delayed rib archives. Esto es, escribir una secuencia de ribs y leerla al momento de renderear y solamente cuando sea visible en la camara (es la diferencia entre 'delayed' e 'immediate'). Esto permite ahorrar memoria ram cuando tenemos muchos elementos (Los habia usado para algunos shots de Navidad S. A., pero esta fue mi primera vez con 3delight, ademas, esta ocasión si pude especificar que pasadas queria tener :p ).

Para este render, se usaron 180 ribs (que incluyen shaders con AOVs) integrados a la escena de maya con "cajas" donde se leen los archivos (3delight > Add Rib Archive).

Este nodo se puede duplicar y mover en la escena, lo que crea nuevas instancias del objeto que se esta leyendo. Pero que pasa si es un ciclo? Bueno, hice un pequeño mel que permite ciclar los archivos (solo duplica el Add Rib Archive el numero que quieras y selecciona todos los nodos antes de ejecutar el script):
global proc exp_delay(string $path_rib, int $maximo)
{
int $num;
string $temporal;
string $sse []= `ls -sl -dag`;

for ($num = 0; $num < variacion =" floor" temporal = "int $currentFrame = `currentTime -q` + " ribnum =" \" ribpath =" \" currentframe =" fmod(">=
100)\n $ribNum = ( \"0\" + string( $currentFrame ) );\nelse if ($currentFrame >= 10)\n $ribNum = ( \"00\" + string( $currentFrame ) );\nelse\n $ribNum = ( \"000\" + string( $currentFrame ) );\n\n$ribPath = \"" + $path_rib + "\" + \".\" + $ribNum + \".rib\";\nsetAttr -type \"string\" \"" + $sse[$num + 1] + ".ribFilename\" $ribPath;";

print ($sse[$num + 1] + " \n");

expression -s $temporal -name ($sse[$num + 1] + "_readRib");
print ("listo " + $sse[$num + 1] + " \n");

}
}

Ese codigo en el script editor se manda a llamar con:
exp_delay("/mnt/projects/rib_arch/3delight/source/rib/rib_source", 180);

donde la primera cadena es la ruta a los archivos. No tiene extension ni tampoco el padding del numero (el script considera algo como source.0000.rib). El numero '180' es el numero de ribs que tenemos (181, si contamos el 0000). Y 'enter'.

Este script crea expresiones que no estan unidas al nodo en si, pero permite asignar una nueva cadena de texto cada vez que avanzamos en el tiempo. Esto tiene la ventaja de que no tocamos el pre-MEL en el renderpass. Ademas, puede haber un gran numero de nodos y podemos asignar nuevas expresiones cada vez (eliminando las anteriores, claro).

Lo que estoy pensando ahora es que los nodos donde leemos los ribs deben estar fuera de grupos (en la "raiz" del outliner), porque el script no considera grupos (creo que debe ser`ls -l -sl -dag`).

El modelo es de Juan Carlos Lepe. Animación y rig de Fernando Najera (gracias chicos, sin ustedes nada de esto seria posible!!).

Y render con algo de compuesto y algunas pasadas:

1 comment:

imgWood said...

Hi mr edgar,

your blog is great, there is not so much blog speaking about 3delight;-)
i will try your delayed RIB exercice and let you know.

thanks!

JM