Pequeño (o gran) tirón de orejas a Microsoft

Que nadie me malinterprete: yo, como el actual ministro de economía, soy de Windows de toda la vida; crítico, eso sí, pero de Windows. Feliz propietario de una Surface Pro 3, creí ciegamente en Microsoft y acepté su sugerencia de actualizarme a la versión 10. Como diría Chiquito de la Calzada, “era agosto y la caló apretaba”.

Después de convivir unos meses con 10, mi sensación es que aporta indudables mejoras, si bien tengo una pregunta: ¿para cuándo la versión de producción? Esta claro que al actual build le falta un hervor y uno tiene la sensación de haberse instalado una beta…¿Tanta prisa había? Supongo que son temas de estrategia y, más que otra cosa, de finanzas, pero ¿dónde queda el usuario? Sí, el usuario, el sufrido pagador de los productos y -por qué no decirlo- el pagano de estas precipitaciones.

Hasta aquí puedo ser tolerante con Microsoft, en la confianza de que este mismo otoño tendremos uno de sus famosos service pack que nos devuelva la posibilidad de anclar sitios web al menú inicio con un mosaico personalizado, que nos entregue una versión algo más cocida del navegador Edge, etc. Por lo que no paso es por las faltas de respeto -quizá son muestras de humor negro de los de Redmond, pero no me hacen gracia-, y a continuación cuento dos que me han llegado al alma. Continuar leyendo

Animación procedimental de una rueda en Max (II)

Ha llovido bastante desde que publiqué la primera parte de esta serie de posts. Continúo hoy con la segunda de las dificultades planteadas allí, es decir, una vez tenemos la rueda girando con sólo dos keys, vamos a conseguir que siga los desniveles del terreno, subiendo y bajando cuando corresponda.

La reflexión es la misma que realizábamos en la primera parte: siempre tenemos la posibilidad de lograr nuestro propósito con técnicas de animación “convencional”, por llamarlas de alguna manera. Sin embargo, nos hemos propuesto emplear técnicas procedimentales, a base de ajustar parámetros, expresiones y scripts. Para los fines que nos ocupan, modificaremos uno de los ejemplos básicos de MaxScript ofrecidos por Autodesk.

Vamos a ello. Lo primero que hemos de hacer es seleccionar nuestra rueda y, dentro de Motion, asignar un controlador Float script a la posición Z del objeto, como se muestra en la siguiente figura.

Controlador float script

En la ventana de edición del script necesitaremos definir dos variables: una asociada al cilindro que nos sirve como rueda (la llamaremos cl)  y otra asociada al plano que nos sirve como terreno (la llamaremos pl). Después, en el recuadro Expression pegaremos el script que se encargará del trabajo.

RuedaAnim5

El código de este pequeño script es:

local testRay = ray cl.pos [0,0,-1]
local nodeMaxZ = pl.max.z
testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ
int_point = intersectRay pl testRay
int_point.pos.z + cl.radius - 0.25

Explicaremos un poco cada una de las líneas de este código. Primero, definimos un vector con origen el pivote del cilindro, dirección Z negativo y módulo 1.

local testRay = ray cl.pos [0,0,-1]

Después hallamos la coordenada Z máxima de nuestro plano.

local nodeMaxZ = pl.max.z

Situamos el origen del vector testRay un poquito por encima de la Z máxima del plano. De esta forma, queremos garantizar que nuestro vector pueda intersecar con el plano en al menos un punto (siempre según el eje Z). Recordemos que incialmente el módulo de este vector es 1, así que cabe la posibilidad de que en algún momento la totalidad del vector se quede por encima del terreno y no presente ningún punto de intersección con él. Por eso hemos de realizar este paso.

testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ

En la siguiente línea, hallamos la intersección efectiva del vector con el plano (según Z), mediante la función intersectRay y ese valor lo asignamos a una variable llamada point.

int_point = intersectRay pl testRay

En nuestra última línea de código, añadimos la dimensión del radio del cilindro al valor que hemos obtenido anteriormente (menos 0.25 unidades). El resultado de este cálculo será el que se pase a la posición Z del pivote del cilindro.

int_point.pos.z + cl.radius - 0.25

¿Por qué restamos 0.25 unidades? Porque con esto conseguimos que el punto más bajo de la rueda esté ligeramente “hundido” en el terreno, lo que nos servirá para el siguiente efecto, que es la deformación de esa zona de la rueda.

Así, con unas nociones básica de geometría y un poquito de MaxScript se pueden conseguir resultados bastante decentes en muy poco tiempo. Junto con mis saludos de despedida, os dejo el vídeo con los resultados (sin deformación de la rueda) en modo wireframe.

La tetera de Utah

En 3D es frecuente utilizar modelos para pruebas. Normalmente, se trata de primitivas sencillas, como una esfera, un cilindro o un prisma rectangular, pero también existen otros con nombre y apellido, como la chimpancé Suzanne de Blender, la caja de Cornell, el dragón de Stanford y nuestra protagonista en el post de hoy, la tetera de Utah o tetera de Newell. Esta última viene como primitiva estándar en 3DS Max, así que acostumbro a usarla en todo tipo de experimentos.

En el caso del brevísimo clip que os dejo a continuación, se trataba de combinar varios “inventos”: concretamente, una curiosa técnica de oclusión ambiental en Mental Ray que aprendí de Aaron Ross -él la denomina “poor man’s global illumination”- y una forma de morphing no destructivo inspirada en una lección de Iker de los Mozos. A todo eso he añadido un poco de After Effects y una preciosa canción de Snowflake con arreglos de Unreal DM (ccmixter.org). Sobre esta pieza proyecto montar un videoclip en algún momento, ya que nunca pierdo la esperanza de que los días acaben teniendo setenta y dos horas.

Espero que os guste. Un saludo.

Respeto al cine

Existen muchas formas de no respetar a los profesionales que hacen cine, entendido no solamente como largometrajes, sino también como cortos y series, ya sean superproducciones o realizaciones de bajísimo presupuesto. Seguramente, la primera que se nos viene a la cabeza es la piratería. Con frecuencia, se justifican las descargas ilegales por el derecho universal a la cultura, por la necesidad de luchar contra las multinacionales, por los precios abusivos, etc. Todos esos argumentos me parecen pamplinas, intentos de racionalizar un comportamiento mezquino, sea o no ilegal. Son pamplinas desde el momento en que veo tantas personas dispuestas a desembolsar, sin demasiados reparos, setecientos u ochocientos euros por un smartphone de última generación, para luego quejarse de los pocos euros que han de pagar por los contenidos que pueden consumirse desde ese mismo dispositivo.

Pero no quiero entrar en esa polémica, al menos en este artículo. Hay otras formas de no respetar el cine que no vienen del consumidor particular. ¿Os habéis fijado en el tamaño de las moscas (logos) de algunos canales de televisión? Aparecen sobreimpresas sobre todos los contenidos emitidos por las cadenas, exceptuando -claro está- la publicidad. Además, últimamente vienen acompañadas de promociones con el nombre del programa promocionado y su fecha y hora de emisión (y hasta gráfico a color, en algunos casos). Por si esto no fuera poco, a ese ruido permanente en una esquina de la pantalla, se suman, de cuando en cuando, otras sobreimpresiones promocionales más grandes, incluso con animación. Para esto se devanan los sesos algunos profesionales del cine pensando cómo colocar la cámara  de manera que se consiga el mejor encuadre. A los directores de fotografía ha de parecerles genial.

También es edificante ver cómo se intercala la publicidad. En numerosas ocasiones, se rompe completamente el ritmo narrativo de pasajes cruciales. Es obvio que esos son los mejores momentos para hacer caja con la publicidad, pero es una pena el trabajo de esos guionistas intentando mantener la atención de los espectadores, ¿no os parece? Esto sin mencionar que un corte publicitario de siete minutos cuando solamente se han emitido tres minutos de película no resulta muy respetuoso, que digamos. Y, como no podía ser de otra manera, los títulos de crédito se omiten sin contemplaciones. Total, ya se sabe que las producciones salen adelante por los actores, que no necesitan de nadie más: la iluminación, el vestuario, los decorados, los efectos especiales y demás son pecata minuta.

Para ser justo, esos mismos canales que tan hermosamente destrozan las emisiones de cine, luego producen o coproducen series, cortos y largos. Sería de agradecer que no descuidasen aspectos como los que acabo de contar. El consuelo es que los mismos desmanes los aplican a sus propias producciones, así que, por lo menos, son coherentes.

Saludos

Animación procedimental de una rueda en Max (1)

Hola a todos:

Estoy trabajando en un corto de animación 3D en el que, durante determinados planos, aparece una furgoneta en marcha rodando por un terreno ligeramente bacheado. No pretendo llegar a un nivel de realismo fotográfico, pero sí obtener una simulación medianamente decente. Por ello, he investigado cómo realizar determinados efectos, y hoy voy a explicarlo aquí. Para aquellos interesados en conseguir un rig más completo de un vehículo, recomiendo el trabajo de Laurens Corjin y también el de Laurent Renaud. En nuestro caso, partiremos de un conjunto de supuestos muy concreto, lo cual limita la validez de nuestra solución, aunque obviamente puede extenderse para abarcar escenas más complejas. Por ello, para comenzar, tengamos en cuenta lo siguiente:

  • El vehículo se desplaza longitudinalmente en una sola dirección
  • Los accidentes del terreno no son demasiado pronunciados

En este post trataremos de la solución a tres dificultades:

  • Conseguir que la velocidad de rotación de la rueda se adecúe completamente a la velocidad de desplazamiento longitudinal
  • Conseguir que la rueda vaya pegada a un terreno con desniveles
  • Conseguir un efecto de deformación (achatamiento) en la parte inferior de la rueda, tal como sucede con los neumáticos reales

Obviamente, todo lo anterior puede conseguir añadiendo keys y más keys, pero nosotros vamos a emplear controladores basados en float expressions y scripts, así como un space warp FFD (Free Form Deformation).

 

Planteamiento básico de la escena

En nuestra prueba de concepto, emplearemos primitivas sencillas. El terreno se consigue mediante un plano al que se añade un modificador Noise, cuyo parámetro Strenght Z ajustaremos a 5 cm. Con esto lograremos el primer efecto de baches y, sobre esta pila, añadimos un modificador Edit Poly, de manera que podamos realizar algunas depresiones suaves moviendo polígonos en el modo soft selection. Para la rueda, empleamos un cilindro con un número suficiente de lados. En su centro, fijamos (con Select and Link) una pirámide para apreciar mejor la rotación. Conviene, para obtener mejores resultados, situar el centro de pivote del cilindro en su centro geométrico, y no en su base.

En el modo Auto Key, añadimos las dos únicas keys de la animación: una en el fotograma cero, con la rueda en su posición inicial, y otra en el último fotograma, con la rueda en su posición final. Hablamos exclusivamente de desplazamiento longitudinal, sin preocuparnos en absoluto de su rotación.

Todas las operaciones anteriores se llevan a cabo con técnicas sencillas que no explicaremos aquí (si alguno de vosotros tiene dudas, puede dejarme un comentario y trataré de solucionarlas). Concentrémonos ahora en la sustancia de nuestra animación.

Escena básica

Planteamiento general de la escena

Rotación de la rueda

Aplicamos un poco de geometría básica, concretamente la siguiente fórmula:

Arco = Ángulo x Radio

Recordemos que el ángulo ha de estar expresado en radianes. No entraré en los detalles matemáticos, que tampoco son excesivamente complejos. Lo importante es que, si la rueda no derrapa, es decir, si no pierde adherencia al suelo, el desplazamiento longitudinal del vehículo coincide con el arco. Esto tampoco es del todo cierto en el mundo real, dado que el neumático sufre deformaciones, pero nuestra aproximación simple servirá para lo que pretendemos. Veamos cómo llevar la fórmula anterior a nuestra animación.

Seleccionamos el cilindro, nos vamos al panel Motion y allí, dentro del árbol de transformaciones de posición y rotación, seleccionamos Y Rotation. Tengamos en cuenta que los ejes a seleccionar dependerán de la geometría concreta de nuestra escena. Pulsamos el pequeño botón que aparece en la parte superior izquierda (Assign controller) y elegimos Float expression.

 

Panel Motion

Panel Motion

 

Lo interesante viene ahora. Se nos abre una ventana donde podemos introducir expresiones (de manera similar a los wire parameters, pero con posibilidad de emplear variables y funciones matemáticas). Creamos dos variables:

  • dY, que vincularemos al controlador de posición Y del cilindro;
  • r, que vincularemos a su radio.

Escribimos la expresión tal como aparece en la figura siguiente (nada más que una traducción directa de la fórmula del arco) y nuestra rueda girará sin necesidad de keys. Además, su velocidad de rotación siempre irá sincronizada con la del desplazamiento longitudinal. Así de sencillo…

Editor de expresiones

Editor de expresiones

En el siguiente post de esta serie abordaremos el problema de la altura de la rueda y los desniveles del terreno, usando para ello objetos ray y la función intersectRay. Hasta entonces, espero que estas técnicas os hayan resultado interesantes.

Un saludo a todos.

 

Paco de Lucía – In memoriam

pacodelucia6_0

A fuerza de escucharlo una y otra vez en las noticias, tendré que dar crédito a lo que me dicen: el maestro se ha ido. Lo que es falso, absolutamente falso, es que haya muerto. Eso no es verdad…Eso me niego a creerlo, porque es imposible. Paco morirá solamente cuando muera el flamenco, cuando muera la música y cuando el eco de sus notas se apague en nuestros corazones y en los de las generaciones venideras. ¿Es que no veis que Paco no puede morir?

No entiendo por qué no explican lo que realmente ha ocurrido: el maestro no sólo tocaba como los ángeles, sino que él mismo era un ángel. Esto es obvio, no queda más que admitirlo, porque su duende, su compás, su quejío y su forma de tocar no eran de este mundo. Paco, además de un genio, era un ángel, y ayer Dios le pidió que volviera a su lado. Eso es lo que ha pasado realmente.

Hasta siempre, querido maestro.