10 de abril de 2008

Photoshop vs. Paint.net - Parte 01

Hola a Todos!

Estoy de vuelta por estos pagos, luego de una ausencia bastante prolongada. Esta vez voy a dejar de lado "un rato" el mundo del 3D para contarles un poco lo que estoy haciendo en 2D. Empecé un curso a distancia de Edición Digital (Photoshop). Si bien ya lo uso desde hace bastante tiempo, me gustó la idea de hacerlo para afianzar ciertas herramientas del mismo, que hasta el momento "toco de oído".

Si bien el Adobe Photoshop es una herramienta muy buena y potente, se puede adquirir por la módica suma de u$s 649, monto que personalmente para mi no es muy accesible para gastar en software (ojalá lo fuera).

En contraposición, encontramos un programa llamado "Paint.net" que es un free software para diseño y edición digital de fotografías, que al parecer está muy completo. Pueden entrar a la página a ver de que se trata y también bajarlo (es muy liviano)

http://www.getpaint.net/ En la misma tiene un apartado de "Donate" donde cuaquiera puede hacerle una transferencia de dinero en pos de continuar con el desarrollo del mismo.

Les dejo la interfaz de cada uno:


Adobe Photoshop CS2


Paint. Net v3.22

Como verán a primera vista la interfaz es muy parecida. La idea de esta nueva sección es que a medida que vaya haciendo los capítulos de mi curso online, vaya realizando los ejercicios en ambos programas, para comparar y ver si realmente el paint.net puede reemplazar al poderoso Photoshop (esperemos que así sea!)

Saludos y hasta pronto! :-)

2 de marzo de 2008

Freeway en Camino

Ya hace una semana y unos días que comenzamos con el desarrollo del juego. Hasta ahora viene bien, sin inconvenientes. En la siguiente imagen muestro la humilde fachada de nuestro pequeño juego:



La solución está compuesta por el momento de tres proyectos:

FreeWayXNA (Windows Game): es el proyecto de inicio donde se encuentra la clase que deriva de Microsoft.Xna.Framework.Game.


MakanaInput (Windows Library): Es un proyecto que contiene un Game Component que sirve para administrar las entradas de teclado y del gamepad de Xbox360.


MakanaMenu (Windows Library): Este es otro proyecto que contiene un Drawable Game Component que sirve para renderizar y darle funcionalidad al menú del juego.

Obviamente que ambos Game Components están desarrollados para ser reutilizados en futuros proyectos.

El proyecto MakanaInput tiene una clase llamada InputGameComponent utilizada para tal fin. Esta clase administras dos clases que se llaman Teclado y GamePad que guardan el estado actual y el estado previo de ambos dispositivos de entrada. A su vez tienen métodos dedicados a consultar los valores de las teclas, botones y palancas de ambos dispositivos. Probablemente cuando el componente este maduro voy a dedicarle una nota en el blog.

Por otro lado, el proyecto MakanaMenu fue concebido con la idea de generar un Drawable Game Component fácil de reutilizar y creo que en mayor o menor medida se ha logrado. Existen dos clases, una se llama MenuAdm que es el DGC y la otra clase se llama MenuItem. Cada MenuItem tiene una lista de MenuItems y la idea es generar como un árbol de menú agregando a cada MenuItem los ítems que contiene. Para dar una idea de esto, copio una porción simplificada del código que inicializa todos los menús:

/* MENU PRINCIPAL */
MenuItem menuPrincipal = new MenuItem("Menu Principal", TipoMenuItem.Contenedor);
menuPrincipal.MenuPadre = menuPrincipal;

/* ITEM 1.1 - NUEVO JUEGO */
MenuItemPersonajes menuNuevoJuego = new MenuItemPersonajes(menuPrincipal, "Nuevo Juego", TipoMenuItem.Contenedor);
menuPrincipal.Submenus.Add(menuNuevoJuego);

/* ITEM 1.2 - OPCIONES */
MenuItem menuOpciones = new MenuItem(menuPrincipal, "Opciones", TipoMenuItem.Contenedor);
menuPrincipal.Submenus.Add(menuOpciones);

/* ITEM 1.3 - SALIR */
MenuItem menuSalir = new MenuItem(menuPrincipal, "Salir", TipoMenuItem.Salir);
menuPrincipal.Submenus.Add(menuSalir);

/* ITEM 1.2.1 - TIEMPO DE JUEGO */
MenuItem menuTiempoJuego = new MenuItem(menuOpciones, "Tiempo de Juego", TipoMenuItem.Lista);
menuOpciones.Submenus.Add(menuTiempoJuego);

/* ITEM 1.2.2 - SONIDO */
MenuItem menuSonido = new MenuItem(menuOpciones, "Sonido", TipoMenuItem.SiNo);
menuOpciones.Submenus.Add(menuSonido);

/* ITEM 1.2.3 - MUSICA */
MenuItem menuMusica = new MenuItem(menuOpciones, "Musica", TipoMenuItem.SiNo);
menuOpciones.Submenus.Add(menuMusica);

/* ITEM 1.2.4 - VOLVER */
MenuItem menuVolver = new MenuItem(menuOpciones, "Volver", TipoMenuItem.Volver);
menuOpciones.Submenus.Add(menuVolver);


// Creo el menu principal
menuAdm = new MenuAdm(this, spriteBatch, spriteFont);
menuAdm.MenuPrincipal = menuPrincipal;
menuAdm.MenuActual = menuPrincipal;



Cada grupo de código se basa en crear el MenuItem y agregarlo a la lista del menú padre que lo contiene. De esta forma, por ejemplo, el menú “Sonido” se incluye adentro del menú “Opciones” con esta línea: menuOpciones.Submenus.Add(menuSonido);
Vale aclarar que cada MenuItem tiene un tipo de menú y este es asignado en el último parámetro del constructor. Sin embargo para el menú de nuevo juego utilizamos la clase MenuItemPersonaje la cual no pertenece al proyecto MakanaMenu sino que es propia del proyecto FreeWayXNA y deriva de ManuItem para implementar las cuestiones especificas de ese menú. Bueno, no voy a interiorizar mas en esto porque voy a terminar eliminando el escaso publico del blog :P

Entre las opciones se encuentra la cantidad de minutos que se va a jugar, si debe tener sonido y música. Al seleccionar cada uno de los ítems, la opción va cambiando (en el caso del sonido y la música, el semáforo cambia entre rojo y verde)

Finalmente al seleccionar nuevo juego, aparece la pantalla para elegir el animal que cada jugador utilizará. Las opciones disponibles son: VACA, CABALO, CERDO y TORTUGA.




Actualmente el juego maneja los game status así que si presionamos el ENTER el juego “comienza” (en realidad, por ahora solo aparece la pantalla de fondo) y al tocar ESC se vuelve al menú con el juego pausado.

Bueno, por ahora es todo, en la próxima entrega tendremos el juego terminado.

Freeway XNA !

La práctica hace al maestro, decían por ahí, y en base a eso decidí comenzar a desarrollar un juego básico para festejar que ya he terminado de leer los 11 primeros capítulos del libro de XNA donde se incluía entre otras cosas todas las cuestiones que tienen que ver con 2D.

Después de mucho pensar alguna idea sencilla decidí por hacer algo parecido a un juego viejo hecho para la Atari 2600 que se llamó Freeway. Este juego, hecho por los amigos de Activision, nació el mismo año que nací yo y se trata de dos animalitos que deben cruzar una calle apestada de autos. Cuando un auto colisiona con el animal, este es arrojado hacia atrás y queda “inconciente” sin poder moverse una fracción de segundo. Cada jugador comanda uno de los animalitos y al terminar el tiempo, el que haya cruzado mas veces gana. La calle ocupa toda la pantalla, es tan ancha como la 9 de Julio pero sin las plazoletas en el medio. Les adjunto una imagen de este sencillo juego corriendo en el emulador Stella:





En cuanto al desarrollo, obviamente lo voy a hacer en XNA, en 2D con las imágenes que va a crear Ana. El jugador va a poder elegir entre cuatro animales que tendrán diferentes características entre las que enumero a continuación:

  • Tamaño

  • Velocidad

  • Peso

  • Reacción

Los dos primeros se explican solos. El peso tiene que ver con la distancia en que un auto te arroja hacia atrás cuando te atropella. La reacción esta ligada con el tiempo en que el animal se queda tirado luego de ser arrollado hasta que el jugador puede volver a controlarlo. En cuanto a los autos, se moverán en diferentes velocidades pero no tendrán mayor I.A. que esa(bue, es decir, no tendrán I.A. :P). Se va poder jugar con teclado y/o con el gamepad de Xbox360.

Bueno, eso es todo, no deberíamos tardar mas de 2 semanas en hacerlo, vamos a ver que sale de todo esto.

7 de febrero de 2008

La Evolución Natural

Hace un tiempo les contaba sobre mi trabajo con Manager DirectX y la librería OdeDotNet que tanto me estaba dando dolores de cabeza. Bueno, estoy aquí para contarles en que quedó ese tema y que estoy haciendo ahora.

En esos dias en el que publiqué la nota anterior, me volví loco depurando el programa, haciendo pruebas, sacando allá, poniendo aca y realmente no llegué a buen puerto. Asi que de tantas pruebas y al ver que el foro oficial estaba lleno de spam pornográfico y que nadie posteaba algo serio desde hace años, decidí consultar al creador de la librería, Rob Loach.

El tema es que referenciando la dll, no desde su código fuente, la excepción no se lanzaba, en cambio de eso los objetos desaparecian en determinado momento y si uno consultaba los valores de x, y, z de las posiciones todas arrojaban el valor NaN. Pero algo me decía que el problema era básicamente el mismo, asi que le envié el siguiente mail preguntándole esto:

Dear Rob, My name is Ariel. Sorry for my english, but i´m from Argentina and here we speak Spanish. I am trying to use OdeDotNet, but I have a problem. Sometimes, the scene disappears without a clear reason and the values that sheds the XYZ of the bodys is NaN (I think that means NotANumber). Do you know something about this mistake? Can you help me? If you need I can give you more information about the source code I´ve done. Thank you. Looking forward to hearing from you, Yours Faithfully. Ariel Nader

En ese momento imaginé que iba a recibir una respuesta con contenido, bien fundamentada y dando en el clavo a la solución. Pero esta fue la respuesta:

Hey Ariel,Thanks for getting in contact with me. I've been wanting to visitArgentina, lots of nice places to see.Unfortunately you know more about OdeDotNet than I do. I just startedhacking it together thinking it might lead to something. Although itdid work, it was still really buggy and I had no practical uses of it...So I'm really sorry to leave you with no solution, but that's all Ihave. You might like to take a look at another solution like Bullet, orsome other C# physics library. Send a message on the Tao mailing listasking them what some alternatives are.Really sorry, and good luck!

No fue muy alentador que digamos el hecho de que el creador de la librería me diga que vaya buscando otra solución para el tema de la física. Pero finalmente le hice caso y largue todo a los caños.

Dias después de todo este episodio, me decidí por empezar a meterme con XNA. Hace dos meses que estoy leyendo un libro y la idea es aplicar los conocimientos adquiridos en MDX para poder tener un mayor entendimiento de la nueva plataforma. Pero eso es parte de otra historia... la historia sin fin (sale una tecnología nueva, comienzo a entenderla y luego es reemplazada por otra, y asi sucesivamente ... :P)

2 de enero de 2008

Casa - Prueba Exterior Vray - Parte 03

Año nuevo... Vida nueva!!! Y aire fresco para nuestro Blog, que no fue olvidado, sólo postergado un cachito!

Bueno Antes que nada Feliz Año para todos esperemos que se nos cumplan todos los proyectos y sueños!!

Vuelvo a mi casita... voy a poner algunos avances para ir dándole un cierre, y empezar con la prueba de un interior, que lo considero realmente más que un desafío.

Lo que voy a mostrar en esta primer imágen es la primera aplicación de color en las paredes de la casa. Usé texturas de Max con un material Vray, con algo de Bump y un leve reflejo, donde le baje bastante el refl. Glosines y las subdivs (para que no me tarde tanto, sacando Render bastante rápidos en calidad borrador). El resultado fue el siguiente:

El tiempo de Render fue muy bueno (menos de 8 minutos), incluso inferior al del post anterior. Esto se debe a que bajé la calidad del mismo, hasta el render final. Dejo también los parametros del material amarillo de las paredes:

Bueno para que la cosa vaya tomando color, continué poniendo tonalidades a las paredes, de la misma forma que hice con el amarillo, pero en tonos más claros. También le agregué a una pared bloques de hormigón (a la derecha se ve apenas), que son sólo la textura ocn un buen bump y cuidando de mantener la proporción de los ladrillos. Este es el avance:


Cuando llegué hasta aca, me di cuenta que los colores no estaban bien planteados, si bien no soy yo quien diseño el volumen y materialidad decidí hacer un pequeño cambio, más que nada para que me ayude a una buena representación del 3D en Vray, que es lo que estoy tratando de lograr desde hace 3 post :-P

Así que acá les dejo una última imágen donde agregue el aluminio blanco de las carpinterías, el hierro negro de las barandas, las molduras blancas y la madera de la pérgola.

No estoy del todo conforme con el resultado. Lo que voy a hacer ahora es hacer unas cuantas pruebas jugando con los parámetros de la iluminación ya que ve partes algo quemadas y otras muy oscuras.

La próxima les muestro el resultado de las pruebas (si es que no me cansé antes y la hice de noche!!!) y el gran momento.... la comparativa entre el render de esa misma casa que hice 8 meses atrás y este final!!!!!!!!

Espero críticas, sugerencias y demás!

Saludos para todos!

3 de diciembre de 2007

Casa - Prueba Exterior Vray - Parte 02

Ya más o menos iluminada (aunque los que tengan ojo clínico verán que le cambié un poco la inclinación al "sol") empece a texturizarla. Como quien diría este Render lo voy a empezar "de abajo" literalmente! ya que comencé poniendole material a los pisos.

El primero que realicé fue una especie de Baldosa color rojo tierra, que va colocara en el esmicubierto, la terrraza y el borde de la pileta.

Usé un mapa de Tiles en Difuse, un fall off Perpendicular / Paralel muuuy bajo, y un bump con un mapa de Tiles igual al otro pero en blanco y negro. Les dejo una imagen con los parámetros y el resultado!

Luego hice de la misma forma las venecitas de la pileta. Utilicé el mismo criterio pero otro color y escala, obviamente.

Así va quedando la cosa:


Igualmente me sigue quednado sin vida. Para eso hay que agregarle un poco de Naturaleza! Ya que hasta ahora es todo muy gris.

Por lo tanto voy por el agua y el pasto:

AGUA: utilicé un material similar a la confección del vidrio, pero con una base de color azul bien oscuro y un Mapa de Noise en Bump (para las "onditas", vio?)
Estos son los parámetros:


PASTO: En el pasto utilicé uin mapa de los que viene en 3DMax (short) lo puse a un 70% y le triré de fondo un verde oscuro (sino quedaba muy chillón). Le agregué al plano que formaba el pasto el modificador vraydisplace. Los parámetros no tienen nada del otro mundo pero ya que los corté y pegué los agrego :-P

Dato Importante!! Utilicé para el pasto un material Vray Override Mtl, ya que hice que el reflejo de GI fuera en un tono verde apagado casi gris, sino la casa me quedaba onda verde...


Para finalizar, les dejo la casa tal como la tengo hasta ahora... En la próxima empezaremos con paredes, molduras y carpinterías!!


Espero que les haya GUstado! Comenten!!

Ani

24 de noviembre de 2007

Implementando Física con ODE

Hola! Este es mi primer nota y la idea es contar lo que estoy haciendo en estos dias. Que bueno que voy a poder contestar solo con un link cuando mis amigos me pregunten por MSN “en que andas, loco?”. ;-)

En los últimos meses le he dedicado mucho tiempo al aprendizaje de Managed DirectX con C#. Hemos hecho mucho software de prueba con Ana que en otras entradas voy a contar. Pero hoy voy a aburrirlos con el tema que me tiene ocupado en este momento: La física de los objetos!!!

Como decía Einstein: “mi mujer tiene un buen físico” :-P, bueno, en este caso yo quiero tener un buen modelo de física para los juegos que hagamos(estaba harto de que los objetos 3D se atravesaran! :P). Por eso me decidí por implementar un engine de física no muy complejo y conocido. Ese motor es Open Dynamics Engine (http://www.ode.org/) en su sabor Managed: OdeDotNet (http://odedotnet.sourceforge.net/). La idea es ver como esta hecho el binding para .net de ODE y hacer algo parecido pero por ahora quiero saber como funciona OdeDotNet.

Para eso que mejor que armar una “demo tecnológica” (que grande que le queda ese nombre al programa que hice :P) de un bowling para ver como gira la bola y choca contra los pinos. Me quedo algo como esto:

El usuario puede apretar F1, F2, F3 o F4 para darle fuerza a la bola y así derribar los pinos (me imagino que se dieron cuenta cual era la idea :P). Con esto pude probar lo que se llama el Contact Joint que es la forma en que los objetos colisionan (si hay rebote, si hay rozamiento, etc) entre los pinos y la bola y entra la bola y el suelo, obvio.


Ahí tienen una captura de la bola chocando con los pinos. Si! Ya se, la bola debería ser pesada como para no levantarse al chocar con los pinos, pero decíselo al sr. ODE que no reacciona antes las diversas pruebas que hice. Estoy aprendiéndolo, aun no tengo claro varias cosas. Otra cosa que no pude hacer andar bien aun es el rozamiento. Asi que por ahora me armé una función que le va disminuyendo fuerza a la bola a medida que avanza apoyada en el suelo hasta dejarla en cero (funciona muy bien!!). Lo que si ya tengo bastante claro es el rebote y como hacer que la superficie sea blanda (tipo cama elástica).
Por supuesto, no todo es tan alentador, de vez en cuando OdeDotNet me tira un error feo feo que tiene que ver con el acceso a memoria. No tengo la mas mínima idea de que puede ser, pero no tengo dudas que lo voy a solucionar tarde o temprano.


Bueno, por ahora solo eso. Espero mas adelante poder poner un video de cómo hago una chuza!! (cuando funcione mejor todo) y asi dejarles el link para que se lo bajen y lo prueben.

Saludos!