domingo, 19 de junio de 2011

Panorama poco informativo - Jugando con el 3D

Hace un par de semanas, paseando con la familia, fuimos a la afamada placita honda de Rafaela y estuvimos sacando algunas fotos.
La idea era hacer algunas pruebas para un proyecto futuro, asi que jugamos un poco.
Hoy procesamos las fotos y creamos una panoramica usando Hugin. Tengo que reconocer que es impresionante como mejoró Hugin. Ademas de una interfaz mas sencilla de usar y estable, tiene varias carácteristicas nuevas que fueron muy utiles para crear este panorama.



Como no habíamos ido pensando en hacer esto, las fotos se hicieron a mano alzada, sin trípode, elemento esencial para estos trabajos. Esto se nota en las áreas blancas, que no tienen contenido.
A pesar de esto, la prueba salió muy bien. Todos los problemas de union pudieron ser solucionados agregando nuevos puntos de control, o usando la nueva pestaña de máscara, donde podemos definir áreas que deben ser incluidas o excluidas. Esto resultó muy util a la hora de asegurarnos que los chicos fueran incluidos si o si.

Como hoy es un domingo de lluvia y no pudimos hacer el viaje que teníamos planeado, decidí probar hacer un sencillo visualizador de panorámicas usando Flash y Away3D.
Away3D es un excelente librería 3D para flash. Si bien la última versión es la 4 alpha, está pensada para el reproductor que esta en incubación, con soporte para Molehill.
Para no complicar la cosa y porque no voy a necesitar tanta potencia, bajé la 3.6.0 desde acá.

Todo el código del proyecto se puede bajar desde github.

Lo primero es crear un proyecto nuevo en su editor favorito, el mío es FlashDevelop, la beta de la versión 4 anda muy bien.
Despues agregamos los archivos de Away3D, que simplemente hay que copiar y ya empezamos a crear nuestra aplicación.

Primero definimos las variables que vamos a necesitar. Notar que estoy embebiendo la imagen directamente porque es una prueba.

  [Embed(source = '../lib/panorama.jpg')]
  private var textura:Class;
  private var camara:HoverCamera3D;
  private var vista:View3D;


Lo siguiente es preparar la camara y la vista 3D que se encargan de mostrar lo que hagamos.

  private function setupCamara():void {
   camara = new HoverCamera3D();
   camara.panAngle = 20;
   camara.tiltAngle = 0;
   camara.hover(true);
   camara.zoom = 8;
   camara.maxPanAngle = 210;
   camara.minPanAngle = -30;
   
   vista = new View3D();
   vista.camera = camara;
   vista.x = stage.stageWidth / 2;
   vista.y = stage.stageHeight / 2;
   addChild(vista);
  }

Uso una HoverCamera3D porque no necesito gran complejidad en los movimientos y el suavizado que tiene es ideal para lo que hacemos.
Los ángulos maximos y minimos de paneo, se deben a que no es un panorama completo el que estoy usando, entonces detengo el movimiento de camara antes de llegar a los limites. Con una imagen que tenga 360 grados, no es necesario.
La vista simplemente contiene la camara y se acomoda en el centro de la pelicula.

A continuación, preparo los objetos que se van a visualizar.

  private function setupObjetos():void {
   //var ejes:Trident = new Trident();
   //vista.scene.addChild(ejes);
   var plano:Plane = new Plane()
   plano.width = 2500;
   plano.height = 2500;
   plano.segmentsH = 10;
   plano.segmentsW = 10;
   plano.moveDown(550);
   plano.material = new ColorMaterial(0x000000);
   vista.scene.addChild(plano)
   
   var cilindro:Cylinder = new Cylinder();
   cilindro.radius = 1000;
   cilindro.height = 1000;
   cilindro.segmentsW = 20;
   cilindro.invertFaces();
   var bmp:Bitmap = new textura() as Bitmap;
   var matriz:Matrix = new Matrix();
   matriz.scale( -1, 1)
   matriz.translate(bmp.width, 0);
   var bmpd_invertida:BitmapData = new BitmapData(bmp.width, bmp.height);
   bmpd_invertida.draw(bmp, matriz);
   
   var material:BitmapMaterial = new BitmapMaterial(bmpd_invertida)
   material.smooth = true;
   cilindro.material = material;
   cilindro.openEnded = true;
   vista.scene.addChild(cilindro);
  }

Lo primero que hago es setear un plano que me va a servir como base. Esto es opcional, pero como la imagen no tiene los limites bien definidos, queria tener un elemento de referencia.
Luego, creo el cilindro que contiene el panorama. Basicamente es un gran cilindro, sin los extremos, al que invertimos las caras para que la textura se aplique dentro y no afuera. Como textura, uso la imagen que embebo, pero antes de aplicarla la invierto. Esto se debe a que las caras del cilindro estan invertidas, obligandome a realizar esta operación.
Si la imagen que tuviesemos fuese un panorama completo con el suelo y cielo, podríamos usar una esfera en lugar de un cilindro.


private function actualizar(e:Event):void {
   if (stage.mouseX < 100) {
    camara.panAngle -= 1;
   } else if ( stage.mouseX > stage.stageWidth - 100) {
    camara.panAngle += 1;
   }
   camara.hover();
   vista.render();
  }

Por último, en cada frame, actualizamos la posicion de la camara y renderizamos la vista.
De ser necesario, muevo la cámara en base a la posición del mouse.

Acá esta el archivo generado. Fue bastante entretenido generar primero la imagen y luego el visualizado, asi que espero ansioso el momento de hacer una versión mas pulida.

sábado, 18 de junio de 2011

Instalando Flashdevelop en Ubuntu 11.04 - 2do Intento

Inspirado por este post en los foros de FlashDevelop y mis pruebas anteriores, decidí volver a probar.
Realmente creo que es un gran programa y vale la pena los esfuerzos.

Yo voy a probar con mi version instalada de Wine, la 1.3.15, aunque está disponible la 1.3.21



Lo primero es eliminar el prefijo actual de Wine. Lo podemos hacer borrando la carpeta .wine o a usando Winetricks.

Instalamos gdiplus y dotnet20 usando winetricks. Ver el post anterior para ver como.

Instalamos FlashDevelop 4, la versión R1944, que es para la que están los parches que la optimizan para wine, como standalone.

Antes de ejecutarlo por primera vez, copiamos los archivos optimizados para wine, sobreescribiendo los originales.
Si todo esta instalado por defecto, la carpeta de destino sería:

/home/USUARIO/.wine/drive_c/Archivos de programa/FlashDevelop

En este punto, podemos probar FD, usando el icono del escritorio.

La verdad es que anda mucho mejor que las pruebas anteriores. Sin embargo los paneles siguen dando problemas. Voy a actualizar a la ultima versión de Wine para ver si se corrige y actualizo el post.

El paso siguiente es hacer anda la compilación.

Descargamos tambien la versión portable de JAVA o buscamos la que esta en la instalación de Flash CS5 y la instalamos en C: de wine, basicamente descompactamos los archivos.
Despues de eso tenemos que modificar el registro para que tome los datos. Para eso con winetricks ejecutamos regedit y modificamos la clave
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
y modificamos PATH para agregar "c:\jre\bin" y agregamos un nuevo valor, JAVA_HOME con "c:\jre".

Esto nos va a permitir ejecutar Java y que FD pueda ejecutar el compilador de flex. Esto va a estar corriendo sobre wine, aunque el sdk este copiado en una carpeta de linux. Sería interesante probar si se puede usar el bridge para que la compilación sea nativa.

En FD configuramos el sdk para que apunte a nuestra instalación y si esta todo correcto deberiamos poder compilar el proyecto sin problemas.

Nos esta faltando configurar una sola cosa, y es el reproductor de flash. Si queremos usar el de windows, hay que instalarlo con wine.
La otra opción es usar el nativo de linux. Para esto hay que buscarlo en la instalacion del sdk, donde está dentro de la carpeta {flex_sdk}/runtimes/player/{player_version}/lnx/flashplayerdebugger.tar.gz
Una vez descompactado, en Nautilus, hacemos click derecho en un swf, le decimos que lo queremos abrir con otra aplicación y le ponemos la ruta al reproductor que descompactamos.
En la carpeta donde estan las modificaciones a FD, esta un archivo de registro que nos permite configurar windows para que use este reproductor.
Esto lo hacemos con
 
wine regedit swf.reg
 
Es importante asegurarnos que se reproduzca en el reproductor externo.

Ahora si, podemos ejecutar FD y compilar, viendo el resultado en el reproductor nativo de linux.

Flash en Linux: Hoy toca "Sprouts o Renegar por renegar"

La verdad es que era bastante mas optimista al empezar todas estas pruebas. Lamentablemente voy perdiendo la fe.

Ya que no pude hacer andar correctamente FlashDevelop en linux, decidí a continuación bajar el SDK gratis de Flex. El SDK corre bien sobre linux, debido a que es Java.
Para usarlo, hay que invocarlo por linea de comando, ya que el editor para programa, Flash Builder, sale sus buenos dolares y realmente pienso que es muy malo.
Para esto hay varias recetas de como crear tareas ANT para correrlo, pero como me gusta renegar, quise probar Sprouts. Según ellos se trata de solución para simplificar el desarrollo de Flash / Flex / Air usando como base Ruby y Rubygems.
En este punto se me alegró el día ( o noche, no me acuerdo cuando fué que lo encontré ), " estoy en Linux " , pensé , " seguro que tengo todo instalado y sale andando como piña". Pobre de mí, que iluso.

Mi primer error, y del que me enteré despues, es haber instalado primero el flex sdk. Una vez que lo bajé, lo instalé siguiendo estas instrucciones.
Resumen rápido:
Asegurarse que tenemos el java de Sun:

sudo apt-get install java-package sun-java6-jdk

Lo siguiente es descompactarlo en nuestro directorio de preferencia, en mi caso /opt/flex y agregar la siguiente linea a .bashrc para que exporte el PATH

export PATH=/opt/flex/bin:$PATH

Con esto hecho y habiendo abierto otra consola o recargado la misma ejecutando .bashrc, probamos si funciona ok.

mxmlc –help

En mi caso anduvo bien, asi que miré como instalar Sprouts. Sigo las instrucciones de la a href="http://projectsprouts.org/">página principal y me deleito viendo como todo parece ir bien.
# Instalo las gemas necesarias de ActionScript 3 / Flash :
gem install flashsdk --pre

# Genero un proyecto nuevo:
sprout-as3 PruebaSprouts

# entro al proyecto:
cd PruebaSprouts

# Instalo dependencias:
bundle install

# Compilo y corro el proyecto:
rake

# Felicitacion, ya está funcionando.


Je, no, no esta funcionando. Resulta que empieza a tirar errores. Resulta que no le gusta la versión de Ruby que tengo instalada. En la página principal especifican que la versión de Ruby tiene que ser mayor a 1.9.2, me fijo y mi Ubuntu instalo 1.8.7. Pensando que con un simple apt-get los soluciono, miro que versión de 1.9 me proveen y resulta que es la 1.9.1. Venimos mal.
Por suerte me acuedo que existe RVM, Ruby Version Manager, https://rvm.beginrescueend.com/, lo que no me acuerdo es como se usa.
Buscando un poco mas, encuentro un tutorial acerca de como instalarlo facilmente y aca voy. http://ryanbigg.com/2010/12/ubuntu-ruby-rvm-rails-and-you/

Lo primero es asegurarse de tener las herramientas necesarias para poder trabajar.
sudo apt-get install build-essential git-core curl

Bajamos rvm y lo instalamos. Se instala en nuestra carpeta personal, algo que me trae sentimientos encontrados.
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
Lo siguiente es asegurarnos que rvm cargue cuando lo necesitemos, asi que agregamos una linea al .bashrc con este comando.

echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"' >> ~/.bashrc 
Recargamos la consola o abrimos una nueva y probamos si anda.

 
rvm notes
Si está bien, entonces nos va a sugerir entre otras cosas instalar una serie de librerias para asegurarnos que todo ande bien. Como queremos que todo ande bien, entonces las instalamos.  
 
sudo aptitude install build-essential bison openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf

Probablemente muchas ya esten instaladas, pero de eso se ocupa el package manager. Ahora si, le pedimos a rvm que instale ruby 1.9.2 y estamos un paso mas cerca de llegar a la meta, la cual ya ni me acuerdo cual era.
 
rvm install 1.9.2

RVM se va a ocupar de bajar y compilar lo que haga falta y dejarnos Ruby listo para usar. Una vez que termine, le tenemos que decir que siempre queremos usar esa version de ruby, porque sino va a usar por defecto la del sistema.
 
rvm --default use 1.9.2

Ya terminamos con Ruby, sigamos con sprouts. Una vez mas entramos a la carpeta y probamos ejecutar
 
rake

En vez de ver un hermoso hola mundo, otra vez vos tira errores, esta vez ruby por errores en las tareas de rake. En este punto, pasé bastante tiempo investigando que podía ser, hasta que llegue a un par de lugares donde explicaban que podía llegar a ser... En este punto estaba bastante enojado, por esa razón este post no tiene screenshots ni tantos detalles, esto se convirtió en algo personal.... Según este articulo y este otro, resulta que la ultima versión de rake, la 0.9.0 no es compatible con sprouts... y hay que usar la 0.8.7. Lo genial es que ya tenia instalada 0.9.7 y bundle install fue el que actualizó a 0.9.0. Por lo tanto tuve que hacer

gem uninstall rake

Donde pregunta que versión desinstalar. Ahí le indicamos la 0.9.0 y queda la 0.8.7. ... Pasados unos minutos de furia, proseguí en mi desesperado intento de hacer andar toda esta ensalada... Vuelvo a la carga con
 
rake 

y no tira errores, pero se pone alegremente a descargar el sdk de flex.... el cual ya había instalado... Iluso, creí que iba a usar el sdk instalado, simplemente llamandolo por linea de comando. Resulta que descarga y usa su propia copia. En este momento ya caminaba por las paredes. Cancele la descarga y me puse a investigar como venía la mano. Despues de otro buen rato de buscar, encontré estos articulos,  y  donde decían se podía usar una variable de entorno para indicar que sdk usar. Sin embargo no encontré documentación muy clara, asi que probando llegue a la conclusión que era algo así;
 
rake FLEX4=/opt/flex/bin

Entonces si compiló y una sonrisa empezaba a esbozar en mi cansado rostros, cuando veo que ahora se pone a bajar el reproductor!!!! Ya vencido y rendido, deje que lo hiciese y pude ver el "Hola Mundo" funcionando.

Todo esto fue hace ya un par de semanas. Sinceramente, fue tan desagradable el reniegue de hacer andar todo que lo abandone hasta el día de hoy, donde me puse a terminar el post.

viernes, 17 de junio de 2011

Origami Fotográfico o Fotografías origamísticas

Este es un post con doble contenido, como un huevo con dos yemas.  Sigo con los posts de origami, pero con un agregado especial, jugué un poco con las fotos.
Primero el por qué del modelo: Hace un tiempo ya, mi amigo el Doctor (lamentablemente de los "dotores" que no recetan pastillas de colores) me pidió un sol para su consultorio. Por supuesto, como era de esperar, me hice el tonto y no le hice nada. Hace poco, alguien en twitter mencionó algo sobre un sol de origami y entonces tampoco hice nada.
Hoy fui a la librería por otra razón y mientras revisaba la parte de papelería, me encontré con un par de papeles dorados y decidí que ya era hora de probar hacer el sol. Las dos opciones que encontré fueron una cartulina metalizada bastante gruesa y un papel, también metalizado dorado, pero bastante más fino. Como siempre, decidí mal y me traje la cartulina, pensando que le iba a dar más rigidez al modelo. Le dio más rigidez, pero se marcaron las puntas y la pieza perdió bastante de su encanto.
El objetivo era hacer un sol, por eso primero pensé en una pieza modular. Afortunadamente soy sincero conmigo mismo, y soy consciente de que no me gustan los modulares. No es por nada en particular, me gusta verlos, pero el solo hecho de pensar que tengo que hacer varias piezas iguales ya me pone nervioso. Encima para hacer una esfera bien hecha, no creo que sean necesarios menos de 30 módulos.
Lo primero que pensé es abandonar el proyecto (yo creo que sería el peor Linterna Verde del universo, pocas cosas con menos fuerza de voluntad), pero me puse a pensar (lo bueno de pensar es que no me cansa, primer requerimiento para cualquier cosa que emprendo) y el sol es una estrella, y había una estrella que hace tiempo quería aprender, la estrella Omega. No sólo es bastante sencilla de hacer, ya que son 6 piezas (hay una versión de una sola, que si bien está buena, no queda tan bien terminada) y 6 es un número manejable para mí. También es innegable que lo mejor de todo es el nombre: "Estrella Omega".
La verdad es que quedó bastante bien, en cuanto a la construcción, está bien firme y simétrica, pero la terminación no es la que yo esperaba. Voy a tener que buscar el otro tipo de papel metalizado y volver a probar.... (je, sí, claro, contate otro).

Para sacarme un poco la bronca (detesto que las cosas no me salgan como esperaba) decidí jugar un poco con la cámara de fotos. Estoy muy contento con mi Lumix SZ3 y en general saco las fotos a las piezas con esa cámara. Otra veces, la profesional anda cerca y hace las fotos con la Nikon.
Justo hoy ví un video que presentaba una técnica interesante para mejorar las fotos con las compactas. Link. El videotutorial muestra como hacer rebotar el flash incorporado de la cámara con un pedazo de cartulina para lograr sombras suaves y que no se quemen las fotos. Partiendo de esta base, también se me ocurrió suavizar la luz, usando un papel fino para que actúe como "softbox" , básicamente, disminuyendo la potencia (estaba cerca del modelo) y esparciendo la luz en una área mayor.
A continuación, varias fotos de prueba, las cuales no tienen retoque alguno, sólo las recorté un poco, pero no toqué niveles ni colores.

1. Esta foto está sacada sin flash, directo sobre la mesa de madera.

2. Acá tenemos el flash directo. La pieza está quemada y no se aprecia el volumen.

3. Acá cambié el fondo (puse el resto de cartulina dado vuelta) para lograr un mejor contraste que resalte la figura. Sin embargo, el flash directo nos llena la escena con sombras duras.

4. Acá, usé un pedazo de papel blanco algo fino (de los blocks de papel para anotar) delante del flash como difusor casero. En esta primer foto, el papel está bien pegado al flash. Si bien suavizó un poco las sombras, también oscureció mucho la imagen.
5. En ésta, puse el papel apróximadamente a 1 cm (un dedo) del flash. Es una de las que más me gusta, porque suaviza las sombras, sin perder el brillo. Jugando un poco con la posición de la cámara o los niveles, seguramente podríamos realzar la imagen con buenos resultados.

6. Acá alejé un poco más el papel, pero ya se empieza a escapar luz por el costado. En este modelo, el objetivo es bastante grande y el flash está cerca.

7. Por último, un par de pruebas con la técnica descrita en el video tutorial. En lugar de usar una cartulina blanca, probé con un papel satinado plateado. Tal vez con otros modelos que no brillen tanto, podría probar con otros papeles metalizado para darle algo de tono al flash rebotado.
En estas fotos podemos ver como la sombra principal viene del costado, o sea de la lámpara de la habitación. El flash rebotado modela bien la pieza y suaviza las sombras, especialmente en la primera de las fotos.


Reitero que ninguna de estas fotos está retocada, por el hecho de querer resaltar los cambios que se producen al jugar con el flash.

Al final pensé que iba a ser un post corto y hace como 2 horas que estoy laburando....

martes, 14 de junio de 2011

Post de relleno

Estoy vivo, o al menos eso hago creer a la gran mayoría de la gente que me conoce.
Estoy preparando un par de posts sobre programación y esperando que se reanude la campaña electoral para hacer gala de mis humoradas origamisticas sobre los políticos.
Hoy, por el solo hecho de demostrar que estoy vago y nada mas, pongo un par de fotos de pruebas ( ni siquiera son modelos trabajados, pruebas de morondanga con el primer papel que encontré ) que hice esta tarde mientras esperaba que mi niño salga de basquet.

El modelo es un teselado bastante interesante que saqué de acá. El chico esté hecho con papel Fabriano de 15 cm que compré a la gente de Rosario, y el grande es un papel que debo haber guardado de algún regalo de navidad.
El fabriano se comporto bastante bien, pero el de regalo no tanto, no mantiene bien la formas. Evidentemente este teselado requiere de un papel mas duro.




Podría prometer que voy hacer una versión mejor o la variante mas compleja del modelo, pero hay que ser sinceros, estoy vago últimamente.