Introducción a GEM
De Pdpedia
[editar] Introducción
GEM son las siglas de Graphics Environment for Multimedia, o Entorno grafico para multimedia. Es una librería de Pure Data, que permite añadir posibilidades de diseño de Gráficos 3D. Más concretamente hace de interfaz, usando el lenguaje visual de Pd, para crear gráficos con OpenGL, e iteractuar con ellos en tiempo real. Fue creado por Mark Danks, aunque ahora es mantenido por IOhannes m zmölnig. Necesitas activar la aceleración gráfica en tu equipo, y por supuesto tener una tarjeta gráfica que soporte openGL.
Para usar GEM se requiere al menos conocimiento básico sobre el funcionamiento de Pure Data (echa un vistazo a Documentación sobre Pure Data ). También capacidad de imaginar espacialmente, pues lo que se hace con GEM es describir escenas en el espacio de 3 dimensiones, donde se van a mover, rotar, escalar objetos. Nociones básicas sobre vectores, facilitan la comprensión, aunque no son indispensables en un uso sencillo. Pero también pueden escribirse comandos de bajo nivel de OpenGL y en tal caso se necesitan más conocimientos.
Una opción de uso de GEM es como complemento a las funciones de sonido de Pure Data, sirviendo de interfaz gráfica a los montajes sonoros. O también al contrario, dando sonido a nuestras creaciones gráficas. Sincronizar GEM con todas las demás posibilidades de pd (sonido, streaming, redes, proceso de datos,...) es muy sencillo.
[editar] Instalación
Para instalarlo es suficiente con lo indicado el la sección Cómo instalar Pure Data. Al cargar la librería, bien con el comando -lib Gem, o mediante el sistema startup del menú 'file' (en puredata extended está añadido por defecto), verás aparecer en la ventana general de Pd un mensaje como este:
GEM: Graphics Environment for Multimedia GEM: ver: 0.90 GEM: compiled: Jul 5 2006 GEM: maintained by IOhannes m zmoelnig GEM: Authors : Mark Danks (original version on irix/windows) GEM: Chris Clepper (macOS-X) GEM: Daniel Heckenberg (windows) GEM: James Tittle (macOS-X) GEM: IOhannes m zmoelnig (linux/windows)
Eso indica, si no hay mensajes de errores, que GEM está listo para ser usado.
[editar] Dibujar un círculo
Lo primero que necesitas es crear una ventana de dibujo. Será una ventana convencional del sistema operativo que uses. El objeto para crear una ventana de dibujo mediante GEM es simplemente
Este objeto recibirá mensajes de configuración de dicha ventana, de rendering y de las propiedades de visualización. Los mensajes mínimos para poner en marcha una ventana de dibujo de GEM serían:
Como ya se explica en la figura create y destroy, crean y destruyen respectivamente una ventana de dibujo. Mientras que los mensajes 1 y 0 activan y desactivan el proceso de render de los objetos. Podríamos sustituir el par de mensajes 1 y 0 por un objeto gráfico toggle (control+mayúsculas+T), ya que este envía un 1 cuando lo activas y un 0 cuando lo desactivas.
La ventana que se crea tiene unas dimensiones por defecto. Si quieres configurar otra, necesitas enviar un mensaje con el contenido 'dimen 320 200' por ejemplo, antes de crearla. En general se envía 'dimen ancho alto'. También puedes enviarle el mensaje 'print' que te imprimirá en la ventana general de pd, información sobre el estado actual de [gemwin]
Vamos ahora a dibujar un círculo en esa ventana recien creada. Añadimos junto con el objeto gemwin con sus mensajes, lo siguiente:
El objeto [circle] se explica a sí mismo, pero ¿qué es gemhead?. Cada proceso de render, necesita de [gemhead]. Es una cabecera, o información previa, que contiene los valores por defecto de posición, rotación, escala, color... que sirve para dibujar un objeto. [gemhead] envía la información necesaria a circle para que se dibuje con esos valores. Para visualizar el círculo en la pantalla, pulsa sobre create y luego activa el render.
Un ejemplo de la utilidad de que gemhead esté al principio de todo proceso de dibujo es el siguiente. Imagina que queremos cambiar el color del círculo.
tal y como está, resultará lo siguiente si pulsas 'create' y activas el render:
[gemhead] envía la información necesaria para el dibujo de objetos, pero en este caso interponemos la transformación 'color'. Entonces, como veremos más adelante, se selecciona el color rojo. La información de gemhead llegará a circle pero con el color cambiado a rojo. Para que quede más claro, imagina que [gemhead] es la orden de 'dibujar' y en este caso, 'circle' lo que dibujamos; en medio interpondremos las transformaciones.
Por último, podemos aprovechar el inlet derecho de [color] para cambiarlo. Los tres valores que necesita [color] son los conocidos rojo, verde y azul del sistema de color RGB. Como sabes, en teoría, cualquier color representable en una pantalla es una combinación de estos tres colores básicos.
[editar] Posiciones, coordenadas y unidades
En en los ejemplos anteriores se dibujaba una ventana de unas determinadas dimensiones. El objeto círculo se dibujaba en el centro de la imagen, el dibujo era demasiado simple. En GEM las primitivas de dibujo (GEOs) se representan en un espacio 3D usando coordenadas cartesianas.
En este sistema, cualquier posición del espacio está determinado por 3 coordenadas respecto de un punto origen. El cículo del ejemplo anterior se dibuja por defecto en la posición 0,0,0 (x= 0; y= 0; z= 0).
En lo que sigue, cuando generes el espacio de dibujo, el eje z piensa atravesará la pantalla para entontrarte a tí en su lado positivo -en otras palabras se acerca. El eje y será arriba y abajo, y x, izquierda y derecha. Cuando crees objetos 3d con altura, esta se desarrollará en el eje z, por lo que podrías NO tener una vista intuitiva, ya que miras desde "arriba". En cualquier caso, tras varios giros de ejes, arriba y abajo deja de tener el sentido ordinario. Es probable que acabes cabeza abajo.
[editar] Translación
Para ver el efecto que tiene moverse por las coordenadas tridimensionales simplemente monta este patch:
Al mover suavemente las cajas de números x, y, z (pulsa mayúscula mientras arrastras el ratón) verás el círculo desplazarse en el espacio. Fíjate que z se acerca a tí cuando el valor es positivo y se aleja desde 0 hacia el fondo, cuando es negativo. [translateXYZ] transforma las coordenadas por defecto en otras que queramos, por lo que podríamos dibujar un objeto en cualquier posición. La interacción es, como siempre en pd, en tiempo real. [Para devolver el valor de una caja de números a 0 pulsa Control y haz click sobre ella]
Otra manera de colocar figuras en el espacio 3D respecto del origen (0,0,0) es mediante el objeto [translate]
Con translate manejamos vectores. Los parámetros de este objeto son [translate F x y z], donde F es el factor o cantidad a desplazar desde el origen, y (x, y,z) representa un vector que define una dirección. Si el concepto de vector no es claro para tí, manejar translate podría ser más confuso, o al contrario ayudarte a comprender qué es un vector.
Los inlet de translate son precisamente los mismos parámetros de configuración. El factor, y el vector director. Si por ejemplo selecionamos el vector (1,0,0), que es un vector en la dirección del eje x, moviendo suavemente el factor veremos cómo la figura se desplaza a lo largo del eje x. Otra manera de verlo es que la tríada de números (x,y,z) es un punto en el espacio. La recta que une ese punto con el origen (0,0,0) define una dirección, y esa es la dirección en la que se moverá el objeto gráfico.
Añadir que cuando decimos que una figura se ha desplazado 1, no nos estamos refiriendo a ninguna unidad de medida. No es un 1 metro, 1 pixel, 1 paseo. El significado lo das tú con tu interpretación.
[editar] Rotación
Otra característica fundamental para colocar un objeto gráfico en el espacio es la rotación. Si rotamos o giramos los ejes y luego dibujamos la figura, eso producirá un giro también en esta. Crea este patch (no olvides [gemwin]):
Es la versión de [translateXYZ] pero para rotaciones. En los sucesivos inlet configuramos la rotación del eje x, y y z respectivamente. Imaginarte previamente lo que va a ocurrir requiere mayor capacidad de visualización espacial.
Los ángulos Rx, Ry y Rz se miden en grados, por lo que 360º vuelve a ser igual que 0º. Una confusión inicial típica es creer que estamos rotando un eje, a la vez que queremos ver fijos los demás. Para entender el funcionamiento, rota un poco el eje x , y luego el eje y. Imagina ahora qué pasaría si rotases el eje Z. Hazlo como ejercicio.
Al rotar sobre sí mismo un eje, también cambia la posición los demás en el espacio. Una forma de practicar es tomar un objeto real en forma de caja o dado. Elegir qué caras van a ser atravesadas por los distintos ejes. Por ejemplo marcar con x , las del eje x, con y las del eje y, etc. Entonces jugar con él a moverlo en el espacio, rotando alrededor de cierto eje. En el patch anterior, para que sea más fácil de ver, se ha añadido un cuadrado en vez de un círculo, con el objeto [square].
Existe otro objeto de rotación, similar a lo que ocurria con [tranlate]. [rotate] a secas gira una cantidad respecto de la dirección que se define con un vector. Mira el siguiente patch
En este caso se rota 45 grados el eje que define el vector (0,0,1). Como (0,0,1) lleva la dirección del eje z, se rotará 45º dicho eje. Este sistema es más libre en el sentido de que nos permite rotar el sistema de coordenadas sobre cualquier recta que definamos (recuerda de (0,0,0) hasta el punto (x,y,z) se forma una recta, y esa es la dirección o eje que elegimos).
[editar] Escala
Una tercera característica a la hora de localizar objetos gráficos en el especio tridimensional, es el factor de escala. Como hemos dicho, cuando nos referimos a que un objeto gráficos se ha desplazado 1 a lo largo del eje x, no nos estamor refiriendo a ninguna unidad de medida física, es una unidad abstracta. Lo único que savemos es que si en vez de desplazar el objeto una unidad, la desplazamos dos, en la visualización, veremos que el objeto se desplazo justo el doble. Podría darse el caso es en nos interesara que no midieran lo mismo las unidades de los distintos ejes. Por ejemplo que las unidades del eje y, sean el doble que las de los otros ejes.
En este ejemplo, las unidades del eje x y del z, seguiran midiendo 1, sin embargo las del y miden 2, por lo que veremos el objeto estirado al doble en esa dirección.
Si añades cajas de números a los inlet de [scaleXYZ] podrás interactuar, viendo qué pasa cuando cambias la escala. Fíjate que [scaleXYZ 0 0 0] hace desaparecer el dibujo, así como que en el caso de una figura plana como un cuadrado, la escala sobre el eje z no tiene efecto.
Tambíen existe el objeto [scale], que a diferencia de [scaleXYZ], se configura un factor de escala, y un vector que define una dirección. En este caso, se escala a lo largo de la dirección que elijamos.
En este caso estamos escalando al doble toda la figura.
[editar] Resumen de las transformaciones básicas
- [tranlateXYZ x y z] desplaza los ejes de dibujo una cantidad a lo largo de uno de los ejes x, y o z.
- [translate F z y z] desplaza lo ejes de dibujo una cantidad F a lo largo de la dirección que defina el vector (x,y,z)
- [rotateXYZ rx ry rz] rota los ejes de dibujo un ángulo en grados alrededor del los ejes x, y o z
- [rotate F rx ry rz] rota los ejes de dibujo, una ángulo en grados F, alrdedor de la recta que define el vector (rx, ry,rz)-
- [scaleXYZ sx sy xz] escala o multiplica las unidades de medida, un factor en los ejes x, y o z
- [scale F sx sy sz] escala o multiplica las unidades de medida una cantidad F, a lo largo de una recta que define el vector (sx, sy, sz).
La cuestión de la posición de un objeto en el espacio, es lo primero que ha que entender en el diseño en 3D. Podemos acceder a cualquier situación espacial, mediante una traslación, una rotación y una escala. Sin embargo, hay una dificultad en la que conviene pararse. Respecto a la translación y la rotación, no es lo mismo rotar y luego trasladar, que primero trasladar y luego rotar. La situación resultante puede ser distinta, como veremos en la siguiente sección.
[editar] Rotanción absoluta y rotación local
Prueba a montar el siguiente patch
Se dibujarán dos cuadrados, uno rojo y otro azul. La única diferencia además del color es que las transformaciones traslación y rotación, están invertidas. En el cuadrado rojo, primero se traslada y luego se rota, mientras que en el cuadrado azul se hace al revés. Si lo piensas, esto tiene dos efectos diferentes sobre el resultado.
Primero trasladas, luego rotas: Lo que manipulamos son los ejes donde dibujar la figura. Por tanto, se trasladaran los ejes, y en esa nueva posición se rota. El efecto es que la figura rota sobre sí misma.
Primero rotas, luego trasladas: En este caso se rotan los ejes, y con la nueva posición de los ejes x , y z, hay un desplazamiento. El efecto es que se rota alrededor de los ejes que había antes del desplazamiento.
La manera más práctica de aprenderlo es que juegues con el patch anterior, viendo cómo el cuadrado rojo, rota sobre sí mismo (eje y) en su nueva posición, mientras que el cuadrado azul rota sobre el eje y, del sistema de coordenadas que había antes de la traslación. Dicho de otra manera, una es una rotación local y otra global o absoluta.
Para aclarar más la cuestión, vamos a limitarnos al plano x-y, sin hacer caso a lo que ocurra en el eje z. Crearemos un cuadrado en el punto (0,0) que rota sobre sí mismo. Después añadiremos otro que rota alrededor del anterior.
El [gemhead] izquierdo crea un cuadrado rojo, inicializado en la posición (0,0,0) y rotación (0,0,0). El [gemhead de la derecha lo mismo pero un cuadrado azul. Para dejar solo al rojo, desplaza una pequeña cantidad (pulsando mayúscula) el cuadrado azul.
Si rotas el cuadrado rojo, verás que efectivamente rota sobre sí mismo, o sobre el punto 0,0,0. Si ahora lo desplazas un poco, verás que al volver a rotar sigue haciendolo localmente. Eso ocurre porque primero se trasladan los ejes y luego se rota sobre esa nueva posición.
Si rotas, sin embargo, el cuadrado azul, verás cómo rota alrededor del punto (0,0). Pasa así porque primero rotamos los ejes de dibujos, y luego hay un desplazamiento en la nueva dirección de dichos ejes. Juega con los dos cuadrados, intentando predecir qué pasará en cada cambio que hagas.
Comprender bien este asunto es importante, no ya para el manejo de GEM si no para cualquier programa de diseño gráfico 3D. Tómate el tiempo necesario para esta cuestión, ya que en lo siguiente veremos cómo hacer un objeto relativo a la posición, traslación y escala de otro, como la mano es al brazo, y el dedo a la mano.
[editar] Múltiples objetos en la misma gem-list
La lista de transformaciones colocadas entre gemhead y el objeto a dibujar, es conocida como gem-list. Si te fijas, en el objeto circle que hemos estado viendo hay un outlet, ¿para qué sirve?. La línea de transformaciones puede prolongarse más allá del primer objeto de dibujo, y lo que es más importante, añadir ¡más objetos en la misma línea!. Eso hará que las transformaciones de los primeros afecten a los segundos. Prueba el siguiente patch:
Se formarán dos figuras, un cuadrado en la posición (0,0,0), y un círculo en la posición (0,2,0), dicho de otra forma, un cuadrado en el centro y un círculo un poco más arriba. Lo notorio es que están en la misma gem-list, comparten el mismo gemhead. Las transformaciones que hagamos al cuadrado, segirán activas tras de sí, en la zona del círculo (la amarilla). El círculo es afectado por todo lo que tiene arriba. Si trasladas el cuadrado, también afectará al círculo, pero, y ahora biene lo bueno, si rotas el cuadrado el círculo también lo hará. El círculo es un satélite del cuadrado.
Esto nos permite crear objetos gráficos más complejos, como sería intentar reproducir la jerarquía de movimentos de un brazo: antebrazo, brazo, mano, dedos. Sin embargo, esta forma de trabajar jerarquías requiere claridad a la hora de imaginar que está pasando en cada rotación y traslación. Este siguiente es un patch, que anida muchas transformaciones en la misma línea, muestra cómo se organizaría una gem-list para implementar ese tipo de movimientos jerarquizados:
lo cual produce una cadena de rectángulos, a modo de un brazo de un robot. Cada parte depende de la anterior, pero a la vez puede girar independientemente.
Siguiendo la lógica de pd, todo eso podría ser metido en un subpatch, quedando reducido visualmente a una caja, con tres inlets para manejar los águlos.
Puedes bajar este último patch desde aquí, para jugar con él. Como ejercicio intenta añadir un círculo al final de la cadena.
[editar] Más Objetos GEOs
Para pausar el ritmo, si vas leyendo desde arriba, veamos que además del círculo y cuadrado hay otras primitivas de dibujo.
- [circle] cículo. radio
- [rectangle] rectángulo, ancho | alto
- [square] cuadrado, lado
- [disk] disco. radio exterior| ejes |radio interior
- [cube] cubo. lado
- [cylinder] cilindro. radio |altura
- [cone] cone. radio |altura
- [esphere] esfera. radio |ejes
(Mira la lista de Objetos de GEM para encontrar más primitivas)
Cada una tiene un número de inlets diferente para configurar, aunque recuerda que siempre puedes inicializarla añadiendo tras el nombre. Por ejemplo [sphere 1] produce una esfera de radio 1, valor que luego puede ser alterado en el inlet correspondiente.
Por ver un ejemplo concreto, monta este patch:
Se dibuja un cono de radio(y altura) 1. Las primitivas también admiten tipos de dibujo, ya sea en puntos, líneas o relleno, como puedes ver. Por otra parte es importante el número de ejes que lo forma. Generando, según este número, una superficie más angulosa, como una pirámide (4 ejes), o suave. Lo mejor como siempre, es que experimentes contruyendo el patch.
Otro ejemplo. El objeto disk, en principio dibuja un disco con un orificio interior, pero cambiando el número de ejes que lo forma, podemos dibujar distintos polígonos regulares:
Lo cual produce, si lo pruebas:
prueba a cambiar el número de ejes de disk para ver la sucesión de polígonos regulares.
La visualización correcta de las primitivas GEOs tridimensionales dependen del tipo de renderizado. Hasta aquí sólo hemos usado relleno de un color (o líneas, o puntos), por lo que el acabado de objetos como la esfera o el cubo es confuso, parecen figuras planas. Lo siguiente que haremos será añadir luz, para generar sombras.
[editar] Hágase la luz
Como decíamos, en favor de ganar calidad en la visualización 3D de objetos vamos a crear una luz. El tipo de render es distinto, por lo que debemos indicárselo a [gemwin]. Eso lo hacemos enviándole el mensaje 'lighting 1' para activar la luz, y el mensaje 'lighting 0' para no calcular luces.
La forma más sencilla de luz, es una que se coloca teoricamente en el infinito, de forma que todos los rayos inciden sobre el objeto paralelamente. Monta el siguiente patch:
Hay un nuevo objeto llamado world_light, que crea justamente ese tipo de luz, en el infinito del eje z por defecto. Aunque no es un efecto natural, es suficiente para empezar a percibir las superficies de los objetos reflejando distinta luz según la inclinación. Recuerda que para que funcione debes enviarle a [gemwin] el mensaje 'lighting 1'. Prueba a poner un cubo en vez de una esfera, y añadir control de la rotación sobre él.
Al objeto world_light se le puede añadir también rotación, lo cual controla la dirección desde la que incide la luz. También, en el caso de que quieras representar el foco de luz de alguna manera para que se muestre, hay opción de hacerlo.
'debung 1' dibuja un cilindro que sigue la dirección de la luz, es simplemente una ayuda a la visualización.
Existe otro objeto de luz llamado light con más parámetros de configuración, y que se atenúa con la distancia, pero lo veremos más adelante.
[editar] Ejemplo de esferas iluminadas
Un ejemplo que aplica lo que hemos visto anteriormente es hacer que una esfera gire y digamos que arrastra en su movimiento a otra separada. El efecto visual es una aproximación muy tosca al movimiento de circular de un satélite:
Las transformaciones de la esfera central afectan a las segunda esfera. Pero fíjate que se interpone un objeto [translateXYZ], por tanto las rotaciones de la primera esfera, producirá una rotación+traslación en la segunda, y como hemos visto, es una rotación alrededor del la primera esfera. Puedes alterar el color de la luz enviando mensajes 'rgb' al objeto [world_light]. Además se ha girado la luz para que venga desde un lado, acentuando el efecto planetoide :)
[editar] Punto de luz
Si la anterior era una luz global, colocada en el infinito, [light] es un punto de luz local. Para probarlo este patch:
Rotando la luz local, veremos el efecto:
El cálculo de esta luz es más complicado, por lo que consume más recursos. Si no ves diferencia en cierta escena entre las dos luces es recomendable usar world_light para tiempo real. También admite el mensaje debug para activar un cilindro colocado en el lugar del punto de luz como se ve en la figura anterior.
[editar] Aplicación de Textura
Para aplicar una textura sobre una figura gráfica, necesitamos la conjunción de dos objetos [pix_image] y [pix_texture]. Y con ello entramos en un nuevo tipo de transformaciones que se refieren no a los propios objetos gráficos, sino a las imágenes entendida como matrices o tablas de pixeles.
Usaremos esta imagen como textura:
NOTA: OpenGL en principio sólo podía manejar imágenes de dimensiones que usen números potencias de 2, como 64, 128, 256... Esa dificultad está resuelta para la mayoría de las tarjetas modernas (ATI/Nvidia), podría ser que con tu tarjeta gráfica hubiera que atenerse a esa regla, por lo que esta imagen no valdría.
Existe un objeto que permite ver imágenes en pd [pix_draw], este dibuja una imagen en la pantalla. Para probarlo implementa:
[pix_draw] Viene bien para visualizar imágenes así como editarlas aplicando transformaciones pix, como si pd fuera un editor de fotos. El mensaje open abre la imagen indicada en la dirección que viene después. En este caso lancé pd usando alt+f2 y luego “pd”, por tanto estoy en mi carpeta de usuario. El path “./media/budehead.png”, buscará una foto colocada en la subcarpeta media, de mi carpeta de usuario.
[editar] Mapear Cubo
Pero nuestra intención ahora es aplicar esa imagen como textura de un cubo. Para hacerlo deberemos convertir la salida de [pix_image] en algo que entienda el objeto al recibirlo como orden de dibujo. [pix_texture] hace esa función, añadiendo al gem-list la textura cargada con [pix_image]. Es más fácil verlo en un patch:
lo que pegará la imagen budhead.png en cada una de las caras del cubo.
Prueba a rotar mediante la caja de números. Un efecto curioso es escalar el cubo hasta meter dentro nuestro punto de vista. Veremos el cubo mapeado desde dentro. Para hacerlo pon el tamaño del cubo a 3.4
lo cual viene a verse en imágen estática como:
[editar] Transparencia en texturas
La imagen anterior, no nos sirve para mostrar una cosa relativa transparencia en texturas. El fondo negro se confunde con el fondo de la pantalla, pero si fuera de otro color, veriamos que realmente hay un fondo opaco en imagen. Imagina que quieres usar una imagen que tenga zonas transparentes. Esta podría servir:
Hay una figura central y el resto es transparencia. Si aplicamos el mismo sistema de antes, no funcionará bien. Pruébalo en este patch:
La imagen se colocará perfectamente en un rectángulo, pero el 'color' transparente será blanco, ya que no distingue el típico alpha de las imágenes.
Pero hay solución, añadiendo [alpha] a la línea de cómputo se tendrá en cuenta dicho valor alpha:
lo cual dará una visualización correcta.
[editar] Vídeo como textura
En gem puede aplicarse una fuente de video como si fuera una textura. Hay tres objetos relacionados con este tema [pix_video] que recoge una fuente de video, de un dispositivo de captura como webcam, cámara usb, tarjeta capturadora, sintonizadora de Tv, etc. Por otra parte [pix_film] y [pix_movie] cargam en memoria y reproduce un archivo de vídeo. El formato de dicho archivo depende del sistema donde estés y las librerías instaladas. En principio mov, avi y mpeg podrían funcionar. El siguiente patch lee desde una fuente de video instalada en el dispositivo 0 (en Gnu/linux usualmente /dev/video0) y lo mapea sobre un cubo.
Se usa igual que [pix_image] para las texturas, solo que en este caso conectamos la textura en tiempo real con una fuente de vídeo. También se puede usar un archivo de vídeo con [pix_film] o [pix_movie], pero el formato depende, como decíamos, del sistema que uses y en el caso GNU/linux, de las librerías de reproducción instaladas así como de la forma de compilar GEM, ya que no tiene un sistema de vídeo nativo.
El siguiente patch usa [pix_movie] para usar un vídeo avi como textura, usando puredata-extended en debian etch.
Desde [openpanel] seleccionamos el archivo de vídeo. [pix_movie] no necesita de [pix_texture] para aplicarse. Además, en su segundo inlet podemos seleccionar el fotograma al que queremos movernos. Con 'auto 1' se reproduce el vídeo desde ese fotograma seleccionado. Cuando se termina, se envía un bang desde el segundo outlet. Hay unas cuantas más opciones más, como siempre consulta la ayuda. Como muestra, 'colorspace' indica el formato en el que queremos decodificar el video: RGB, YUB, o escala de grises.
[editar] Separadores
Como ya sabes, en la línea que une gemhead con un objeto de dibujo, es posible añadir transformaciones. Digamos que [gemhead] actua como un objeto metro para el renderizado, al que además vamos añadiendo indicaciones sobre posición, rotación color etc. Por otra parte, como hemos visto, en la misma línea se pueden añadir varios objetos de dibujo, de manera que de uno a otro van heredando las transformaciones que le hicimos a los anteriores.
En algún caso, puede ser interesante poder bifurcar la línea de transformaciones en dos, de manera que dos objetos distintos, hereden por separado las transformaciones de otro. Para eso está el objeto [separator]. El siguiente ejemplo lo usa
Dibuja un rectángulo, parecido a como ya hemos hecho, pero aparece enseguida separator. La línea que viene de gemhead se bifurcará en dos (podrían ser más). De manera que se dibujarán dos rectángulos que heredan las transformaciones del primero. Una metáfora que te puede servir para entenderlo es 'una rama que se bifurca en dos subramas'. El efecto de este patch, una vez pones lo valores a punto, es este:
Una especie de Y , o pinza. Si rotas o trasladas el primero rectángulo (las primeras transformaciones que aparecen tras gemhead, y antes de separator), moverás el conjunto. Pero una vez en cada una de las bifurcaciones, puedes controlar por separado, la rotación de cada brazo de la 'Y'.
Si observas tu propia mano, en la mayoría de los casos, de la palma ves salir 5 dedos, los cuales pueden ser movidos independientemente. Sin embargo, la posición en el espacio de la palma de la mano, determina la de los dedos. En ese caso, haría falta un objeto [separator] por cada dedo.
[editar] Importar modelos obj
Existe la posibilidad de importar modelos 3D en formato obj de Alias/Wavefront. Hay programas libres que generan este formato, como wings3d, o blender, también otros programas comerciales conocidos. Habitualmente un objeto 3D generado en formato obj, es acompañado de otro archivo .mlt con la información necesaria para reconstruir la textura. GEM soporta esa posibilidad.
Con [model] podrás incorporar figuras modeladas 3D con textura, usando archivos obj. En el siguiente patch se importa un archivo obj con su mlt, que viene en la documentación de GEM, y por tanto en las carpetas de manuales, tras instalarlo. Si lo buscas es un archivo llamado venus.obj, aunque el propio patch es genérico y podrías cargar cualquiera.
El objeto [model] puede recibir unos cuantos mensajes de configuración (pulsa botón derecho del ratón y 'help' para ver la ayuda). Aquí presentamos tres. En la parte superior ves 'open' que recibe a su vez un mensaje de [openpanel]. Esta es una forma muy sencilla, y usual de buscar un archivo que tengas en tu disco. 'Material' activará o desactivará el uso de la información contenida en el archivo de textura mlt. Por defecto está desactivado, por tanto, puedes aplicar colores en la manera en que ya sabes. Al activar la tectura, no verás los colores aplicados en la gem-list. También aparece 'smooth' (suavizado) que siendo un número entre 0 y 1, permite una visualización suave (1), o al contrario angulosa(0), siendo visibles las losetas que forman la maya del objeto 3D.
Otro mensaje útil puede ser 'rescale' (con valor 0 o 1) que permite normalizar el tamaño de un objeto a la unidad. No olvides, por otra parte, añadir luz a la escena.
El resultado del patch anterior es:
El proceso de archivos obj, es más costoso en recursos. Lo recomendable debe ser estudiado en cada caso.
[editar] Texto
Como no podía ser menos, se incluye la posibilidad de renderizar textos. Hay dos modalidades básicas (para más casos mira la lista de Objetos de GEM), una [text2d] que genera un bitmap sobre la imagen, por otra parte [text2d] crea un objeto tridimensional, con las posibilidades que eso conlleva. Este patch muestra un uso básico de texto:
Necesitas cargar una fuente de letras. En la instalación de GEM se suele incluir vera.ttf.
Aunque no se muestra en el patch, el segundo inlet de [text2d] recibe el tamaño de la fuente. Además, como ves, aplicas color igual que lo hacias con otros objetos. En cuanto a la visualización, el texto resultante se creará sobre el plano XY.
La misma versión pero que genera un objeto tridimensional es [text3d]
Similar al patch anterior, pero con posibilidad de añadir movimientos 3D
En ambos casos existe posibilidad de enviar mensajes sobre justificado, y antialiasing, mejorando la visualización.
[editar] Apéndice: Objetos de GEM
....

