Desarrollo De Juegos En Linux Con Ogre3d

  • Uploaded by: samuel
  • 0
  • 0
  • December 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Desarrollo De Juegos En Linux Con Ogre3d as PDF for free.

More details

  • Words: 3,708
  • Pages: 6
para programadores Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D

Desarrollo de Juegos en Linux con OGRE3D Daniel Barrientos Carrera, Enrique Puertas Sanz, José Carlos Cortizo Pérez

[email protected]

La industria de los videojuegos es una industria cada día más creciente, capaz de sobrevivir (y con mucho éxito) a cuestiones tan duras como la piratería. Pese a que el mercado fundamental de la mayoría de los videojuegos sean las consolas o bien la plataforma Windows, GNU/Linux se muestra como una alternativa cada día más atractiva, tanto por el número de usuarios, el apoyo de la comunidad, así como por el desarrollo de nuevas herramientas que facilitan el desarrollo de juegos que no tienen nada que envidiar a algunos videojuegos comerciales.

56

P

ese al enorme esfuerzo invertido en potenciar la usabilidad de los sistemas Linux, tratando de atraer usuarios desde otras plataformas, aun encontramos mucha gente que se siente reacia a dar el salto, debido muchas veces al poco soporte que tienen los videojuegos en el mundo Linux. Y es que, seamos realistas, los juegos tienen mucho tirón: desde que se popularizó el uso de los ordenadores personales como herramienta doméstica, el sector del videojuego ha sido el que ha impulsado grandes cambios en nuestros ordenadores personales. Fueron los videojuegos los que hicieron que se popularizaran las tarjetas de sonido (las míticas Adlib o Sound Blaster), las potentes tarjetas gráficas actuales que liberan al procesador de realizar muchos de los complejos cálculos necesarios en los juegos o los saltos generacionales en las familias de microprocesadores. Si somos capaces de ampliar o incluso cambiar nuestros ordenadores solamente para poder jugar a ese videojuego que acaba de salir al mercado y que exprime los recursos de nuestra máquina, ¿por qué vamos a cambiar a un Sistema Operativo en el que no puedo jugar a mi juego favorito?

Linux+ 5/2007

Lo que aprenderás Con este artículo aprenderás a compilar e instalar OGRE3D, así como a crear una escena desde OGRE, cargar una malla, crear un punto de luz, un suelo, un cielo y una cámara. Esto servirá de base para posteriores artículos donde aprenderemos a cargar nuestras propias mallas, mover los objetos, etc. La pregunta que debemos hacernos entonces es: ¿por qué la industria del videojuego no acaba de introducirse en el mundo Linux? La respuesta parece sencilla: actualmente no hay mercado como para que las grandes compañías se interesen en sacar versiones para Linux. Hoy en día, la producción de

Lo que debes saber Para seguir adecuadamente este artículo conviene que tengas unos conocimientos medios de C++ así como algunos conocimientos de manejo de gráficos.

para programadores Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D un videojuego es un proceso largo y costoso. El presupuesto de algunos videojuegos supera incluso al de grandes super producciones cinematográficas. Pero Linux y el mundo del Software Libre cuentan con un importante factor a su favor que puede hacer que todo esto cambie en un futuro: una enorme comunidad dispuesta a colaborar, y multitud de recursos libres para la creación de videojuegos. Con herramientas como Blender u OGRE3D (que usaremos para este pequeño tutorial) se pueden conseguir resultados que poco tienen que envidiar a otras herramientas comerciales.

El motor OGRE3D

OGRE3D (Object-Oriented Graphics Rendering Engine, http://www.ogre3d.org) es un motor de renderizado 3D orientado a escenas escrito en C++ y diseñado para hacer más fácil e intuitivo el desarrollo de aplicaciones que utilizan aceleración 3D. OGRE3D abstrae los detalles de utilización de las librerías gráficas subyacentes (Direct3D y OpenGL) y provee una interfaz basada en clases intuitivas (gestor de escena, nodo del grafo de escena, cámara, etc.). A pesar que OGRE3D no pueda ser definido como un motor de juegos completo, sí que provee muchas facilidades, así como plugins para extender la funcionalidad del motor como pueda ser ODE (motor de físicas), lo cual lo convierte en una herramienta muy potente al alcance de todos. OGRE3D es multiplataforma (Windows, Linux, Mac Os X), lo cual nos permite desarrollar juegos fácilmente portables entre diversas plataformas, de hecho ya se está trabajando en una versión de OGRE3D para XBox, lo que permitirá migrar juegos que desarrollemos para Linux a esta nueva plataforma (actualmente podemos desarrollar en Linux y compilar el juego en Windows, o incluso desarrollar en Linux y mediante crosscompiling obtener también los ejecutables Listado 1. Compilación e instalación de OGRE3D

para Windows). Además, OGRE3D provee soporte para programas de vértices y shaders personalizados escritos en GLSL, HLSL, Cg y en ensamblador, gestiona automática-

mente el nivel de detalle de forma progresiva, provee exportadores para la mayoría de los programas de modelado 3D (3D Studio Max, Maya, Blender, LightWave, Sket-

Listado 2. Programa principal de nuestro primer juego con OGRE int main( ) { Root *root;

RenderWindow *renderWindow; EventProcessor *eventProcessor; SceneManager *sceneMgr; Camera *camara; Viewport *viewPort; Entity *ninja; Light *luz; SceneNode *nodoNinja; root = new Root();

//mostramos ventana de configuracion if (!root->showConfigDialog() ) { delete root; return 0; }

root->initialise(false); //creamos ventana renderWindow = root->createRenderWindow("Mi primer programa con OGRE",600,600,false);

eventProcessor = new EventProcessor();

eventProcessor->initialise(renderWindow); eventProcessor->startProcessingEvents(); sceneMgr = root->createSceneManager(ST_GENERIC); camara = sceneMgr->createCamera("camara1"); viewPort = renderWindow->addViewport(camara); cargaRecursos(); //establecemos el ambiente para que haya algo sceneMgr->setAmbientLight(ColourValue(0.3,0.3,0.3)); sceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE); sceneMgr->setSkyBox(true,"Examples/StormySkyBox"); ninja = sceneMgr->createEntity("ninja1","ninja.mesh"); luz = sceneMgr->createLight( "luz1" ); luz->setType(Light::LT_POINT); luz->setPosition( 0,100,-100); luz->setVisible( true );

nodoNinja = sceneMgr->getRootSceneNode()->createChildSceneNode("nodoNinja "); nodoNinja->attachObject( ninja ); nodoNinja->setPosition( 0, 0, 0 ); camara->setPosition(0 ,100 , -400 ); camara->setDirection( 0, 0, 1 ); //BUCLE PRINCIPAL

tar xjf ./OGRE-linux_osx-v1-0?.tar.bz2

while( !eventProcessor->getInputReader()->isKeyDown(KC_ESCAPE) ) { nodoNinja->yaw( Radian(0.1) );

cd OGREnew

root->renderOneFrame();

./bootstrap

}

./configure (Para nvidia añadir -with-platform=GLX) make make install (ejecutar como root)

delete eventProcessor; delete root; return 0; }

www.lpmagazine.org

57

para programadores Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D ejemplo pueden ser construidas en el directorio ./OGREnew/Samples/Common/bin.

Listado 3. Código de la función cargaRecursos void cargaRecursos() {

Configurando nuestro primer Juego con KDevelop

ConfigFile cf;

cf.load("resources.cfg"); // Go through all sections & settings in the file ConfigFile::SectionIterator seci = cf.getSectionIterator(); String secName, typeName, archName; while (seci.hasMoreElements()) { secName = seci.peekNextKey();

ConfigFile::SettingsMultiMap *settings = seci.getNext(); ConfigFile::SettingsMultiMap::iterator i;

for (i = settings->begin(); i != settings->end(); ++i) { typeName = i->first;

archName = i->second; ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName); } }

Podemos utilizar OGRE3D directamente con gcc pero conviene utilizar un editor que nos facilite la organización de un proyecto y sus archivos. Dentro de la gran variedad de editores que tenemos a nuestra disposición en Linux, se ha elegido KDevelop por su madurez como producto así como su facilidad de integración a la hora de desarrollar con OGRE. Configurar OGRE3D con KDevelop es realmente simple, basta con crearse un nuevo proyecto C++ simple y realizar las siguientes acciones: •

//inicializa recursos. ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); }

chup, etc.), múltiples efectos de postprocesado (hdr, niebla, ruido, etc.), así como muchas otras características que lo convierten en una opción muy a tener en cuenta a la hora de desarrollar un videojuego; de hecho esto le ha llevado a ser el motor elegido como base a la hora de impartir el Master en Diseño y Desarrollo de Videojuegos de la Universidad Europea de Madrid. OGRE3D está licenciado bajo LGPL (que se convertirá en una doble licencia cuando salga la versión para XBox debido a las royalties) y cuenta con una gran y muy activa comunidad de desarrolladores (http://www.ogre3d.org/phpBB2/), de hecho se desarrollaron 6 proyectos dentro del último Google Summer of Code relacionados con ampliaciones y mejoras de OGRE3D, lo cual muestra tanto el interés que suscita como el interés de la comunidad porque crezca.

Instalando OGRE3D en GNU/Linux

Existen binarios de OGRE3D tanto para Debian, como para Fedora Core y Ubuntu, así como se puede compilar e instalar OGRE3D desde los fuentes. Instalar OGRE3D mediante paquetes precompilados es tarea relativamente simple (podemos conseguir más información sobre esto en http:// www.OGRE3d.org/wiki/index.php/Installing_ An_SDK#Linux), por lo que aquí nos centraremos en la compilación e instalación desde los fuentes. Antes que nada hay que com-

58

• probar los prerrequisitos tanto para poder compilar OGRE3D así como para su pos- • terior utilización (las siguientes versiones funcionan correctamente al compilar OGRE3D 1.0.3): • • • • • • • • • • • •

automake 1.6+, autoconf 2.50+, make 3.80, libtool 1.5.6, pkg-config 0.17.2, gcc 3.3.5, g++ 3.3.5, cpp 3.3.5, Freetype2 2.1.x+, zziplib 0.12.x+, FreeImage, libpng, libmng, libtiff, libjpeg (para FreeImage).

Una vez cumplidos los prerrequisitos, nos bajaremos la última versión de OGRE3D desde la página web de OGRE3D y lo compilaremos y lo instalaremos mediante los comandos que aparecen en el Listado 1. Conviene notar que se puede sustituir make por make -j para compilar varios archivos en paralelo, lo cual puede acelerar la compilación de forma considerable si contamos con varios procesadores o un procesador multicore (es recomendable que el número de procesos sea dos veces el número de cores disponibles). Una vez la compilación termine de forma satisfactoria, las aplicaciones de

Linux+ 5/2007

Abrir el archivo configure.in y añadir lo siguiente encima de AC_OUTPUT: PKG_ CHECK_MODULES(OGRE, [OGRE3D>= .2.0]),

Abrir el fichero src/Makefile.am y añadir las siguientes líneas: LDADD=@OGRE_LIBS@ AM_CXXFLAGS=@OGRE_CFLAGS@, Para conseguir que el programa se ejecute en el directorio donde se encuentran los ejemplos para que al depurar no haya que copiar todos los recursos, basta con ir a las opciones de proyecto, seleccionar la opción de directorio propio y seleccionar el directorio / Samples/Common/bin.

Una vez realizados estos pasos ya podemos desarrollar nuestros propios juegos sin más complicaciones.

Nota para usuarios de Ubuntu Cuando hagas make install puedes obtener un error como éste: "/usr/bin/install: cannot stat `.libs/libOGREMain.lai': No such file or directory"

Si ocurre, lo que necesitas hacer es: cp OGREMain/src/libOGREMain.la OGREMain/src/.libs/libOGREMain.lai vi OGREMain/src/.libs/ libOGREMain.lai

y cambiar en la línea 25 "installed=no" a "installed=yes". Una vez salvado esto, haz sudo make install de nuevo y todo debería funcionar.

para programadores Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D

Nuestro primer programa con OGRE

A continuación vamos a desarrollar nuestro primer ejemplo en OGRE3D para darnos cuenta de lo sencillo que es comenzar con él. Vamos a realizar una aplicación desde cero, sin partir de ExampleApplication, incluido en los ejemplos de OGRE3D (directorio Samples) y que nos facilita algunas tareas peroque más adelante nos limitará bastante. Nuestro objetivo en este primer programa será mostrar en pantalla un ninja, cuyo modelo ya viene con la instalación del OGRE3D (directorio /media/models) y una luz puntual que lo ilumina. Nuestro ninja estará continuamente rotando respecto a su eje Y hasta que presionemos la tecla ESCAPE, momento en el que la aplicación terminará. El resultado de ejecutar nuestro código se muestra en la Figura1 Como es nuestra primera aplicación con OGRE3D no vamos a hacer grandes Listado 4. Contenido del fichero resources.cfg # Resource locations to be added to the 'boostrap' path # This also contains the minimum you need to use the OGRE3Dexample framework [Bootstrap] Zip=../../media/packs/OGRECore.zip # Resource locations to be added to the default path [General] FileSystem=../../media FileSystem=../../media/fonts FileSystem=../../media/materials/ programs FileSystem=../../media/materials/ scripts FileSystem=../../media/materials/ textures FileSystem=../../media/models FileSystem=../../media/overlays FileSystem=../../media/particle FileSystem=../../media/gui

Figura 1. Resultado visible de nuestro primer ejemplo utilizando OGRE3D alardes de diseño y estructuraremos el programa en 2 funciones, el main y la función cargaRecursos. Se muestra en el Listado 2 el código de la función main ya que ésta es la que realiza las tareas que nos interesan principalmente y más adelante explicaremos el funcionamiento de la función cargaRecursos. Las variables utilizadas se encuentran al comienzo de la función main y representan a las clases principales de OGRE3D que se pasan a describir a continuación:

Root Esta clase representa la raíz, como su nombre indica, de una aplicación hecha con OGRE. Es necesario crearla antes de cualquier otra cosa, y se hace simplemente mediante la línea de código

FileSystem=../../media/ DeferredShadingMedia Zip=../../media/packs/cubemap.zip Zip=../../media/packs/ cubemapsJS.zip Zip=../../media/packs/dragon.zip Zip=../../media/packs/ fresneldemo.zip Zip=../../media/packs/ OGREtestmap.zip

root = new Root()

Inmediatamente después en el código se muestra la ventana de configuración que viene con OGRE, que es la que se muestra en la Figura 2. Una vez pasada esa ventana de configuración (presionando aceptar) se inicializa la aplicación mediante la línea de código

Zip=../../media/packs/skybox.zip root->initialise(false)

www.lpmagazine.org

El parámetro booleano pasado a dicha función indica si se quiere que OGRE3D cree automáticamente una ventana. En nuestro caso le decimos que no, y la crearemos posteriormente nosotros.

RenderWindow Representa la ventana sobre la que OGRE3D renderizará (dibujará) sus contenidos. Dado que anteriormente le dijimos al root que no nos crease dicha ventana, lo tendremos que hacer nosotros, mediante la línea de código renderWindow = root>createRenderWindow("Mi primer programa con OGRE",600,600,false)

El primer parámetro es bastante evidente y es la cadena que aparecerá en la barra de título de la ventana. Después se le indica el tamaño de dicha ventana (ancho y alto) y por último si queremos que esté a pantalla completa (en cuyo caso ignoraría el tamaño indicado antes) o no. En nuestro caso elegimos que no sea a pantalla completa.

EventProcessor Es necesario crear un objeto de esta clase para que OGRE3D pueda capturar eventos

59

para programadores Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D Viewport Necesario crearlo para ver algo. No es lo mismo que RenderWindow ya que puede haber varios Viewport en una misma RenderWindow permitiendo así tener distintas vistas de un entorno en pantalla o entornos completamente diferentes. Por ahora creamos un único Viewport mediante la función renderWindow->addViewport, la cual necesita como parámetro un objeto de tipo Camera que será la cámara que plasmará lo que ve en ese viewport. Figura 2. Ventana de inicialización del sistema gráfico y despacharlos al lugar apropiado. En concreto a nosotros nos interesa en este ejemplo para detectar pulsaciones de teclas y poder así terminar nuestra aplicación tras pulsar ESCAPE.

SceneManager

siendo el parámetro pasado el nombre de la nodoNinja = sceneMgr-

Light Representa las luces que tengamos en nuestro entorno. Se pueden crear de varios tipos y para nuestro caso hemos creado una luz puntual mediante el codigo: luz=sceneMgr->createLight(“luz1”)

El tipo de luz se establece mediante la función: luz->setType(Light::LT_POINT)

OGRE3D

60

SceneNode

Representa un nodo de la escena. Los nodos sirven para organizar los objetos dentro de la escena y poder llevar a cabo los algoritmos que el SceneManager tiene implementados para Camera su representación. Es obligatorio que nuestros Como su nombre indica es la cámara a través objetos Entity estén asociados a un nodo. Miende la cual veremos el mundo. Se crea en la tras no lo estén, dichos objetos no pertenecelínea de código: rán a la escena y por tanto no serán renderizados. La creación de un SceneNode se hace sceneMgr->createCamera(“camara1”) a través de la función:

cámara. Esta clase se encarga de la gestión de la escena gráfica y es probablemente el más im- Entity portante y de la que depende la eficiencia fi- Representa a los objetos de nuestro mundo nal del motor. Se crea mediante la línea de formados por mallas (archivos con extensión código: mesh). En el directorio media/models del OGRE3D se incluyen unos pocos. Dichos mosceneMgr= root->createSceneManager delos se crearán con cualquier herramienta (ST_GENERIC) de diseño como 3DStudio o Blender, para los cuales ya existen exportadores que convierEl parámetro pasado a dicha función se re- ten el formato propio de dichas aplicaciofiere al tipo de gestor de escenario que se nes en el mesh que necesita OGRE. quiere crear y dependerá del tipo de entorno Nuestro ninja será un Entity que se crea 3D que tengamos. Existen otros tipos ade- mediante la función: más de ST_GENERIC, como ST_INTERIOR para niveles de juego en interiores, ST_EX- ninja =sceneMgr->createEntity(“ninja1 TERIOR para entornos representados me- ”,”ninja.mesh”). diante mapas de alturas… En este ejemplo no nos vamos a preocupar de este parámet- El primer parámetro es el nombre que le daro y podemos dejarlo en ST_GENERIC para remos a la entidad y el segundo es el nomla mayoría de nuestras aplicaciones sen- bre del fichero que contiene el modelo del cillas. ninja.

Figura 3. Sistema de coordenadas utilizado por

de proceso, ya que implica muchos cálculos. Por eso es necesario no abusar de este elemento y usarlo solamente en casos muy especiales. Mediante la elección apropiada de texturas se puede conseguir los mismos efectos que conseguiríamos más cómodamente con luces.

Es muy importante señalar que al poner luces en la escena se ralentiza mucho la velocidad

Linux+ 5/2007

>getRootSceneNode()>createChildSceneNode

y la asociación de nuestro ninja al nodo mediante: nodoNinja->attachObject(ninja)

Serán entonces los nodos los que se posicionen en el mundo y no las entidades en sí. Estas son entonces las clases básicas de OGRE3D (por supuesto tiene muchas cosas más) necesarias para empezar a hacer algo básico. Antes de pasar a explicar el resto del código es necesario conocer qué sistema de coordenadas utiliza OGRE3D, que es el común en este tipo de aplicaciones. OGRE3D utiliza un sistema de coordenadas dextrógiro, en el cual el eje Z apunta hacia fuera de la pantalla, el eje Y hacia arriba y el eje X hacia la derecha. La notación para indicar vectores es la usual (x,y,z). En la Figura 3 se muestra dicho sistema de coordenadas. Por esa razón el ninja se sitúa en la posición (0,0,0), la cámara se sitúa en (0,100,-400), es decir, hacia el fondo de la pantalla. Con el fin de que la cámara pueda ver a nuestro ninja tenemos que decirle que apunte hacia él, y esto lo hacemos mediante la función setDirection(0,0,1) donde le decimos a la cámara que coloque su eje z (que corresponde a la línea de visión) en dirección Z del mundo positivo, es decir, estará mirando hacia fuera de la pantalla, hacia nosotros. Una vez colocados todos los elementos en su lugar pasamos a realizar el bucle que se encargará de llevar a cabo las tareas que apuntamos al comienzo de esta sección: rotar

para programadores Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D

Figura 4. Capturas de pantalla de varios juegos desarrollados con Ogre3D que muestran algunas de las capacidades de este motor continuamente nuestro ninja respecto a su eje Y y salir cuando pulsemos la tecla ESCAPE. La rotación respecto al eje Y la realiza la función yaw. Podemos rotar un SceneNode en torno a cualquiera de sus tres ejes: X (pitch), Y(yaw), Z(roll), existiendo funciones miembro en SceneNode para cada una de esas rotaciones. La comprobación de tecla pulsada se hará mediante la función isKeyDown de la clase InputReader. El objeto eventProcessor que creamos al comienzo del código contiene internamente un objeto de tipo InputReader que obtendremos mediante el código:

velocidad posible, por lo que dicho código no se ejecutará igual de rápido en distintos PC. Además animo a eliminar la luz que creamos anteriormente (basta con pasar false a la función luz->setVisible) para comprobar la gran diferencia de velocidad entre tener o no tener luz. El resto del código no es necesario comentarlo ya que es autoexplicativo. Por último nos queda mencionar la función cargaRecursos(). Dicha función, que se muestra en el Listado 3, se encarga de ir recorriendo los directorios donde tenemos los recursos de nuestra aplicación (modelos, texturas, materiales,…) e ir cargándolos. Ese

código será casi siempre así por lo que bastará normalmente un cortar y pegar en las nuevas aplicaciones que creéis. Es muy importante establecer bien el fichero resources.cfg que se tiene que encontrar en el directorio de nuestra aplicación. En dicho fichero se indican los directorios donde nuestra función cargaRecursos tiene que buscar los recursos utilizados. En el Listado 4 se muestra el contenido de dicho fichero para el resources.cfg incluido en los ejemplos de OGRE3D. Aunque de ahí nos sobren muchas cosas para nuestra aplicación, en este artículo no le daremos más vueltas al asunto y lo usaremos tal cual. Hay que tener en cuenta que debes colocar esos recursos en el lugar adecuado o sustituir lo que aparece en resources.cfg por tus propios directorios. Es muy fácil equivocarse en este paso (siempre se queda algún directorio sin copiar, se pone mal algún nombre,…) y al arrancar la aplicación únicamente nos saltará una excepción con muy poca información de lo que ocurrió. Para saber de donde viene el problema el OGRE3D nos deja el fichero OGRE.log en el directorio de nuestra aplicación donde va dejando información de lo que hace. De esta forma examinando lo último escrito en ese fichero podemos saber o al menos intuir qué es lo que falló. Este primer ejemplo nos permite comprender el funcionamiento básico de OGRE3D, así como realizar nuestros primeros pasos con este motor 3D. En siguientes artículos veremos cómo cargar nuestras propias mallas realizadas desde Blender, animarlas, gestionar los eventos, etc.

eventProcessor->getInputReader()

Es intuitivo darse cuenta que la función isKeyDown consulta si la tecla indicada por parámetro (los códigos correspondientes se pueden consultar en la ayuda que viene con OGRE) está pulsada, en cuyo caso nos devuelve true. El renderizado de la escena se realiza en la llamada root->renderOneFrame(), que como su nombre indica renderiza (dibuja) la escena que hay en ese momento y retorna. Hay que tener en cuenta también que el EventProcessor captura eventos en cada cuadro renderizado, por lo que si eliminamos la llamada a renderOneFrame no responderá el teclado. Como se puede ver, nuestro código no realiza ningún control de frames por segundo sino que simplemente renderiza a la máxima

Sobre los autores Daniel Barrientos Carrera ([email protected]) es Ingeniero Superior en Informática por la Universidad de Valladolid y actual doctorando en la Universidad Carlos III de Madrid. Actualmente trabaja como profesor en la Universidad Europea de Madrid, donde entre otras cosas imparte clases en el Master en Desarrollo y Diseño de Videojuegos. Es experto en visión artificial y artífice del sistema de control automático de las velas del Desafío Español. Enrique Puertas Sanz (enrique.puertas@ uem.es) es Ingeniero Superior en Informática por la Universidad Europea de Madrid donde actualmente imparte clases en temas como Taller de Software Libre y Comunicación

www.lpmagazine.org

Hombre-Máquina. Actualmente desarrolla su doctorado en la Universidad Politécnica de Madrid. Su bitácora personal se encuentra en http://www.enriquepuertas.com. José Carlos Cortizo Pérez ([email protected]) es Ingeniero Superior en Informática y actualmente realiza su doctorado en la Universidad Carlos III de Madrid. Es profesor en la Universidad Europea de Madrid donde, entre otras cosas, imparte la asignatura de Motores de Juegos en el Master en Diseño y Desarrollo de Videojuegos. Así mismo, es miembro fundador e investigador principal de AINetSolutions (http://www.ainetsolutions.com) empresa dedicada a ofrecer servicios de minería de datos, seguridad, etc.

61

Related Documents


More Documents from "Josua Obando"