I feel funny and I don't know why…Excuse me while I kiss the sky
Maya
Workflow para Zbrush, Maya y Finalrender
4 Feb
Después de hacer varias pruebas para intentar renderizar con Finalrender para Maya unos mapas de desplazamiento/normales, he llegado a la conclusión de que el workflow que sirve para Mental Ray no es del todo bueno para usar con Finalrender. En realidad son muy similares ya que los mapas generados por Zbrush sirven tanto para un motor de render como para el otro, pero hay ciertos detalles que aparecen al volver a Maya que necesitan de ajustes diferentes. Y además los propios de cada motor.
En esta pequeña guía voy a utilizar una prueba del craneo de Beast que estoy usando para la escena "Minnie and the Beast". El modelo lowpoly, una vez importado en Zbrush, con las UV’s previamente ajustadas en Maya, viene a ser algo parecido a esto:

Después de pasar un rato agradable esculpiendo, tengo el siguiente resultado:

Nada espectacular, aunque se trata de una parte apenas visible. Oculta por otras piezas y en gran medida fuera de campo. En fin.
Parte 1: Exportar los mapas desde Zbrush
a) Mapa de desplazamiento.
En primer lugar y antes de nada bajamos el nivel de subdivisión en Zbrush al mínimo. Y acto seguido nos vamos al menú Zplugin donde estará instalado el plugin Multi Displacement 3 (en Zbrush 3.1). Ajustamos las opciones de MD3 como en la siguiente captura y en caso de querer generar un mapa de desplazamiento de otro tamaño que 2048×2048, cambiaremos el valor correspondiente.

Acto seguido nos vamos a Export Options y allí ajustaremos las opciones correspondientes para obtener un mapa que se lleve bien con Maya.

De momento y hasta que encuentre algo mejor, esto es lo que me ha funcionado mejor con FinalRender. Sacaremos como resultado un TIFF de 32bits y hay que tener en cuenta que con esta configuración, el Displacement Exporter se encargará de hacer el Vertical Flip que tanto le gusta a Maya. El quickcode para esta configuración es:
DE-LBEK-EAEAEA-R32
El quickcode anterior correspondería a la opción para generar mapas de desplazamiento en un TIFF de 32bits. La captura anterior no corresponde a ese quickcode ya que para el correcto la opción Scale estaría en A.D.Factor en lugar del Off que se puede ver en la misma. En caso de querer trabajar con mapas de desplazamiento de 16 bits, el quickcode sería el siguiente: DE-HBEK-EAEAEA-R32.
Una vez elegidas las opciones para exportar el mapa de desplazamiento, volveremos al menú principal y pulsamos el botón CREATE ALL. Le damos un nombre y ubicación al fichero, elegimos TIFF como formato y esperamos a que Zbrush acabe de generar el mapa.
b) Mapa de normales.
Ahora vamos a exportar un mapa de normales (normal map) usando ZMapper. En primer lugar bajamos el nivel de subdivisión en el modelo al mínimo, tal y como hicimos antes con los desplazamientos. Lanzamos ZMapper, abrimos la pestaña Normal & Cavity Map y simplemente cargamos el preset llamado Maya_TangentSpaceNode_BestQuality (Open Configuration). Este preset, entre otras cosas, también se encargará de hacer el Vertical Flip a la imagen resultante. Pulsamos el botón Create NormalMap y esperamos unos segundos.

Una vez generado el mapa de normales, lo exportamos (Texture -> Export).
Como paso opcional podemos aprovechar para generar un Cavity Map también desde Zmapper. A la configuración anterior sólo habría que añadir unos puntos en Cavity Intensity y crear el mapa con el botón Create CavityMap.
Parte 2: De vuelta a Maya
Una vez exportados los dos o tres mapas en Zbrush, podemos volver a Maya para ajustarlos a nuestro modelo. En primer lugar haremos unos pequeños ajustes en el objeto al que queremos aplicar esos mapas. Lo primero será desactivar los desplazamientos de Maya ya que usaremos los de FinalRender:
Y ahora, si se trata de objeto poligonal como es el caso, conviene aplicarle uno o varios Smooth o bien convertir el objeto en Subdivisión. La mejor manera de hacer esto es hacerlo usando las subdivisiones de FinalRender en render time. Del mismo modo que usando Mental Ray le aplicariamos un nodo de subdivisión con el Aproximation Editor, aquí lo haremos usando una característica propia de FinalRender:

En el mismo objeto, dentro de las opcionesde FinalRender, activamos Render as Subdivision Surfaces y ajustamos el Level a un valor razonable. Para empezar, dos está bien.
El siguiente paso hacia el éxito consiste en crear un shader para nuestro objeto, uno al gusto. Creamos un nodo de desplazamiento para el shader, cargamos el TIFF creado anteriormente en Zbrush, ajustamos el Filter Type a Mipmap y desplegamos las opciones de Color Balance para la textura.

Aquí nos interesa el valor de Alpha Gain y Alpha Offset. Alpha Gain nos ayudará a establecer el nivel del desplazamiento y también queremos que el valor de Alpha Offset sea el valor negativo de la mitad del anterior. Lo más cómodo es crear una expresión para llevar el valor de Alpha Offset automáticamente, que sería la siguiente si asumimos que el nombre de la textura con el mapa de desplazamiento es "file1".
file1.AlphaOffset = – file1.AlphaGain / 2
Actualización: Parece que es indiferente usar los parámetros Alpha Gain y Alpha Offset del nodo file con la textura que corresponde al mapa de desplazamiento o bien usar los parámetros Gain y Offset que se encuentran en el tab llamado Finalrender dentro del nodo de tipo Displacement. Por defecto estoy usando éste último, pero se me ocurre que si pensásemos en cambiar de motor de render haría más engorrosa la adaptación.
Respecto al valor correcto de Alpha Gain -o Gain a secas si usamos el parámetro de Finalrender- : en teoría se trataría de un valor fijo para mapas de desplazamiento de 32 bits ya que almacenan el valor del Alpha Depth Factor de Zbrush en su interior. En la práctica yo no lo acabo de ver tan sencillo pero en cualquier caso ese valor sería 2.2 ,entonces el valor de Alpha Offset sería -1.1 y no haría falta de usar ninguna expresión para calcular su valor.
En el caso de trabajar con mapas de desplazamiento de 16bits habría que tener en cuenta el valor del Alpha Depth Factor de Zbrush. Para obtenerlo es necesario generar el mapa de desplazamiento desde Tools->Displacement en Zbrush. En la parte de abajo del menú Alpha, y teniendo seleccionado el mapa de desplazamiento allí, podremos consultar dicho valor.
Una vez sabido el valor de Alpha Depth Factor, la fórmula para calcular el valor preciso de Alpha Gain en Maya es la siguiente:
Alpha Gain = (Alpha Depth Factor / 10)*2
Y el valor de Alpha Offset se calcularía usando la expresión antes mencionada.
En principio tenemos listo el mapa de desplazamiento, ahora crearemos un bump para el shader conectado al mapa de normales que creamos anteriormente en Zbrush, sin olvidar ajustar el valor del nodo bump como Tangent Space Normals (Use as:). También podríamos usar el Cavity Map aplicado al diffuse del shader o bien usarlo como detalles en una textura bien elaborada.
Ya sólo queda ajustar las opciones para mapas de desplazamiento en los Render Globals de FinalRender:

En primer lugar, obviamente, tenemos que activar los desplazamientos (Enable Displacement). Los ponemos en Mode: Intensity y el valor de Multiplier lo dejaremos en principio en el que lleve por defecto (más adelante tendremos que jugar con este valor para obtener un resultado más o menos bueno) y nos quedamos también con el valor de Pixel Edge Size. En caso de que el mapa contenga huecos como el del ejemplo es conveniente desactivar la opción Runtime Displacement ya que en caso contrario los agujeros / surcos aparecerán planos.
Y finalmente, usando la técnica del ojímetro y los valores de Alpha Gain (+Alpha Offset) en la textura del mapa de desplazamiento y Multiplier y Pixel Edge Size en Displacement Options del Render Globals para FinalRender, conseguiremos tener algo más o menos similar a lo que buscamos. Hay que tener especial cuidado con el valor de Pixel Edge Size ya que si bajamos demasiado el valor (<=1) aumentará muchísimo el número de microtriángulos y el tiempo de render se disparará hacia el infinito, pero en principio se cumple que para mapas de desplazamiento de 16bit donde el Alpha.Gain ha sido calculado con el método expuesto arriba, los valores por defecto de Multiplier y Pixel Edge Size funcionan bastante bien.

El juego de la vida de Conway en 3D con Maya
17 Ago

Originalmente creado por Cory Clarke (el script no se puede ya descargar de la web original) y modificado por Chris Csendes de la Universidad de Columbia, este script MEL te permite crear una simulación del juego de la vida de John Conway, el ejemplo más conocido de autómata celular. Exactamente es un script que usa un algoritmo muy similar al descrito por Conway pero aplicado a una matriz 3D de objetos. El juego de Conway opera en una rejilla 2D topológicamente unida, de cuadrados blancos y negros que se encienden o apagan basandose en un conjunto de instrucciones muy sencillas. La versión original de Clarke permite usar una matriz formada únicamente por cubos, aunque la modificada de Csendes permite elegir entre cubos o esferas, que se encienden o apagan basandose en un conjunto de comprobaciones de proximidad. Basándose en un patrón inicial generado aleatoriamente, el script genera una animación que puede ser reproducida fácilmente o bien extendida ejecutando el script durante más tiempo. El conjunto de instrucciones para esta particular versión del juego de la vida son: 1) Si un espacio de la rejilla está rodeado por dos o más objetos, se enciende el objeto situado en esa posición de la rejilla. 2) Si un espacio de la rejilla está rodeado por siete o más objetos, se apaga el objeto situado en esa posición de la rejilla. Las instrucciones básicas para usar el script son las siguientes: global proc life_init(string $prefix, int $gridX, int $gridY, int $gridZ, string $type, int $rndcut) El anterior procedimiento inicializa el juego y los parámetros pasados corresponden a: – prefix = Un descriptor para el juego que vamos a ejecutar. – gridX,gridY,gridZ = El tamaño de la rejilla que vamos a crear. – type = el tipo de objeto que vamos a usar. Soporta "sphere" y "cube". – rndcut = Hace referencia a las posibilidades (%) de que un objeto está apagado como estado inicial. Ejemplo: life_init ("a", 10, 10, 10, "sphere", 60); Crea una rejilla de esferas de 10x10x10 con una posibilidad del 60% de que esté vacia de objetos. global proc life_run(string $prefix, int $gridX, int $gridY, int $gridZ, int $steps, int $coloring) Este otro procedimiento ejecuta el juego de la vida. Los parámetros a pasar son los siguientes: -prefix = El mismo valor que usamos en el procedimiento "life_init". – gridX,gridY,gridZ = También el mismo valor para la rejilla que usamos al inicializarla. – steps = Numero de pasos a ejecutar el script. Es recomendable ejecutarlo en principio durante unos pocos pasos (entre 5 y 10) para comprobar que no lleva a un estado muerto rápidamente. En caso de que no sea asÃ, se puede continuar ejecutando el script. – coloring = Puede tener como valor o bien 0 ó 1. Si el valor es 1 se activará un comportamiento extra que coloreará los objetos más persistentes. Ejemplo: life_run ("a", 10, 10, 10, 5, 1) Ejecuta el juego en una rejilla de 10x10x10 durante 5 pasos (50 frames) y coloreará los objetos más longevos. Descargar script: life.mel
Plugin para exportar a formato Directx desde Maya
22 Dic
Además del plugin para Maya 6 y 6.5 (parece que todavía no lo hay para Maya 7), la página de Microsoft cuenta con un tutorial para crear un shader en Maya y exportarlo junto al modelo a formato .X
También lo hay para 3D Studio MAX y Photoshop.
Como nombrar los joints de un esqueleto (Maya) para su reconocimiento automático en Motion Builder
21 Feb
Para que Motion Builder reconozca automaticamente el esqueleto de un modelo exportado desde Maya a través del plugin FBX, es necesario que los joints del esqueleto respeten el nombre por defecto del esqueleto en Motion Builder. Es posible mapear manualmente el esqueleto en Motion Builder para adecuarse a cualquier otra nomenclatura pero si ésta no tiene demasiada importancia, el usar los nombres de Motion Builder ahorra este trabajo. El nombre para los joints Base (requeridos) junto con algunos opcionales es el siguiente:

El mapeado para las manos es el siguiente:

Para ver una imagen ampliada del esqueleto completo, pulsa AQUI y una del esqueleto de la mano AQUI
Tutorial de niebla volumétrica en una luz con Mental Ray
23 Oct
Comenzamos con una escena en la que hemos colocado unas paredes, un suelo y un techo con un shader cement del shader library de Maya. En una de las paredes hemos hecho una ventana y colocado varios barrotes. En el suelo de la escena hay una esfera con un shader blinn con un nodo marble conectado tanto al color como al bump de la misma.Toda la escena está iluminada con una sola Spot Light que de momento no crearemos y que estará situada justo en el exterior de la ventana con barrotes.Esta luz tiene activada la emisión de fotones de Mental Ray y la escena está renderizada con Global Illumination.

Para que el efecto de niebla volumétrica sea visible tenemos que crear un nuevo objeto en nuestra escena al que conectaremos un shader partivolume de Mental Ray.Creamos un cubo que englobe toda la escena, desde la cámara hasta la luz (que todavía no hemos creado).

A este nuevo cubo le asignamos un nuevo shader de tipo lambert y abrimos el attribute editor de este shader. Lo que nos importa de este shader es poder conectarle un shader parti_volume de Mental Ray para así poder ver el efecto de niebla y como contenedor de esta niebla usaremos el nuevo cubo que engloba toda la escena (o la parte de ella que queremos que sea afectada por el efecto). En primer lugar vamos a aumentar la transparencia del lambert al máximo (1) ya que no queremos que el cubo sea visible en la escena, sólo queremos que sirva de contenedor para el parti_volume. Otro motivo más trivial es que así en los viewports si no trabajamos en wireframe, el cubo no resultará molesto para la visibilidad del resto de la escena. Otra opción es activar Supress all Maya Shaders en el Shading Group del material Lambert. El caso es que usando este último método el tiempo de render aumenta aparentemente con el mismo resultado ?�?�.El valor del resto de parámetros del material no tienen importancia.
Ahora nos vamos al Shading Group del Lambert pulsando en el botón de conexiones salientes (2).

En la sección Custom Shaders del Shading Group, conectamos a Volume Shader un shader de tipo parti_volume de la sección Volumetric Materials.


En las opciones del parti_volume, colocamos en scatter el color base que queremos para nuestra niebla, extinction lo dejamos en 0.01 y en este caso ponemos el valor de Min_step_len a 0.5 y Max_Step_Len a 1. Jugando con estos parámetros podremos dar distintos aspectos a nuestra niebla, hacerla menos uniforme aumentando el valor de Nonuniform,etc…

Ahora vamos a la sección Lights del parti_volume y pulsamos el botón para hacer una conexión en lights[0].En la ventana que aparece para seleccionar un tipo de luz, elegimos Spot Light.

Colocamos la luz detras de la ventana, aumentamos el valor del Value de color a 1000,abrimos un poco el cono de la luz (67 para este ejemplo),activamos Raytraced Shadows en la sección Shadows, en Caustics an Global Illumination activamos Emit Photons y ajustamos Photon Intensity a 5000, Exponent a 1.3 y si tenemos activado Global Illumination en Render Globals de Mental Ray entonces ponemos Global Illumination Photons a 100000.En Custom Shaders conectamos a Light Shader un shader de tipo Physical_Light de Mental Ray.



Ahora sólo queda renderizar, activando Global Illumination en Render Globals y ajustando el número de fotones para Global Illumination de la Spot Light tal y como mencionamos antes.


