Desarrollo de Juegos en Linux Con OGRE3D

6

Click here to load reader

Transcript of Desarrollo de Juegos en Linux Con OGRE3D

Page 1: Desarrollo de Juegos en Linux Con OGRE3D

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

56 Linux+ 5/2007

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

57www.lpmagazine.org

linux

@so

ftwar

e.co

m.p

l

Desarrollo de Juegos en Linux con OGRE3DLa 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.

Daniel Barrientos Carrera, Enrique Puertas Sanz, José Carlos Cortizo Pérez

Pese 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 vi-deojuego 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 microproce-sadores. 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 cam-biar a un Sistema Operativo en el que no puedo jugar a mi juego favorito?

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 mer-cado como para que las grandes compañías se interesen en sacar versiones para Linux. Hoy en día, la producción de

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

Lo que debes saber

Con este artículo aprenderás a compilar e instalar OG-RE3D, 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.

Lo que aprenderás

Page 2: Desarrollo de Juegos en Linux Con OGRE3D

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

56 Linux+ 5/2007

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

57www.lpmagazine.org

un videojuego es un proceso largo y costoso. El presupuesto de algunos videojuegos supe-ra 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 dis-puesta 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 pue-den conseguir resultados que poco tienen que envidiar a otras herramientas comer-ciales.

El motor OGRE3DOGRE3D (Object-Oriented Graphics Rendering Engine, http://www.ogre3d.org) es un motor de renderizado 3D orientado a escenas es-crito 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 in-tuitivas (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 de-sarrollar 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 plata-forma (actualmente podemos desarrollar en Linux y compilar el juego en Windows, o in-cluso desarrollar en Linux y mediante cross-compiling obtener también los ejecutables

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

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

Listado 1. Compilación e instalación de OGRE3D

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

?.tar.bz2

cd OGREnew

./bootstrap

./configure (Para nvidia añadir --

with-platform=GLX)

make

make install (ejecutar como root)

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

while( !eventProcessor->getInputReader()->isKeyDown(KC_ESCAPE) ) {

nodoNinja->yaw( Radian(0.1) );

root->renderOneFrame();

}

delete eventProcessor;

delete root;

return 0;

}

Page 3: Desarrollo de Juegos en Linux Con OGRE3D

58

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

Linux+ 5/2007 59

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

www.lpmagazine.org

chup, etc.), múltiples efectos de postproce-sado (hdr, niebla, ruido, etc.), así como mu-chas 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 co-mo base a la hora de impartir el Master enDiseño y Desarrollo de Videojuegos de la Uni-versidad Europea de Madrid.

OGRE3D está licenciado bajo LGPL (que se convertirá en una doble licencia cuando salga la versión para XBox debi-do a las royalties) y cuenta con una gran y muy activa comunidad de desarrollado-res (http://www.ogre3d.org/phpBB2/), de he-cho se desarrollaron 6 proyectos dentro del último Google Summer of Code rela-cionados con ampliaciones y mejoras de OGRE3D, lo cual muestra tanto el interés que suscita como el interés de la comuni-dad porque crezca.

Instalando OGRE3D en GNU/LinuxExisten binarios de OGRE3D tanto para De-bian, como para Fedora Core y Ubuntu, así como se puede compilar e instalar OG-RE3D desde los fuentes. Instalar OGRE3D mediante paquetes precompilados es tarea relativamente simple (podemos conse-guir más información sobre esto en http://www.OGRE3d.org/wiki/index.php/Installing_An_SDK#Linux), por lo que aquí nos centra-remos en la compilación e instalación des-de los fuentes. Antes que nada hay que com-

probar los prerrequisitos tanto para poder compilar OGRE3D así como para su pos-terior utilización (las siguientes versiones funcionan correctamente al compilar OG-RE3D 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 ba-jaremos 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 <número de procesos> 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 dispo-nibles). Una vez la compilación termine de forma satisfactoria, las aplicaciones de

ejemplo pueden ser construidas en el direc-torio ./OGREnew/Samples/Common/bin.

Configurando nuestro primer Juego con KDevelopPodemos 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 disposi-ción en Linux, se ha elegido KDevelop por su madurez como producto así como su facilidad de integración a la hora de desa-rrollar con OGRE.

Configurar OGRE3D con KDevelop es realmente simple, basta con crearse un nuevo proyecto C++ simple y realizar las siguientes acciones:

• 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 ejecu-te en el directorio donde se encuentran los ejemplos para que al depurar no haya que copiar todos los recursos, bas-ta con ir a las opciones de proyecto, se-leccionar la opción de directorio propio y seleccionar el directorio <RaizDeOGRE>/Samples/Common/bin.

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

Listado 3. Código de la función cargaRecursos

void cargaRecursos() {

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);

}

}

//inicializa recursos.

ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

}

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 es-to, haz sudo make install de nuevo y todo debería funcionar.

Nota para usuarios de Ubuntu

Page 4: Desarrollo de Juegos en Linux Con OGRE3D

58

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

Linux+ 5/2007 59

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

www.lpmagazine.org

Nuestro primer programa con OGREA 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 Samp-les) y que nos facilita algunas tareas pero- que más adelante nos limitará bastante.

Nuestro objetivo en este primer pro-grama 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 ESCA-PE, momento en el que la aplicación termi-nará. El resultado de ejecutar nuestro códi-go se muestra en la Figura1

Como es nuestra primera aplicación con OGRE3D no vamos a hacer grandes

alardes de diseño y estructuraremos el pro-grama 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 explicare-mos el funcionamiento de la función carga-Recursos.

Las variables utilizadas se encuentran al comienzo de la función main y represen-tan a las clases principales de OGRE3D que se pasan a describir a continuación:

RootEsta clase representa la raíz, como su nombreindica, 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

root = new Root()

Inmediatamente después en el código se mu-estra 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 configu-ración (presionando aceptar) se inicializa la aplicación mediante la línea de código

root->initialise(false)

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

RenderWindowRepresenta la ventana sobre la que OGRE3D renderizará (dibujará) sus contenidos. Da-do 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 pan-talla completa (en cuyo caso ignoraría el tamaño indicado antes) o no. En nuestro caso elegimos que no sea a pantalla comp-leta.

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

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

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

Zip=../../media/packs/skybox.zip

Figura 1. Resultado visible de nuestro primer ejemplo utilizando OGRE3D

Page 5: Desarrollo de Juegos en Linux Con OGRE3D

60

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

Linux+ 5/2007 61

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

www.lpmagazine.org

y despacharlos al lugar apropiado. En con-creto a nosotros nos interesa en este ejem-plo para detectar pulsaciones de teclas y po-der así terminar nuestra aplicación tras pulsar ESCAPE.

SceneManagerEsta clase se encarga de la gestión de la es-cena gráfica y es probablemente el más im-portante y de la que depende la eficiencia fi-nal del motor. Se crea mediante la línea de código:

sceneMgr= root->createSceneManager

(ST_GENERIC)

El parámetro pasado a dicha función se re-fiere al tipo de gestor de escenario que se quiere crear y dependerá del tipo de entorno 3D que tengamos. Existen otros tipos ade-más de ST_GENERIC, como ST_INTERIOR para niveles de juego en interiores, ST_EX-TERIOR para entornos representados me-diante mapas de alturas… En este ejemplo no nos vamos a preocupar de este parámet-ro y podemos dejarlo en ST_GENERIC para la mayoría de nuestras aplicaciones sen-cillas.

ViewportNecesario crearlo para ver algo. No es lo mis-mo que RenderWindow ya que puede haber varios Viewport en una misma RenderWin-dow permitiendo así tener distintas vistas de un entorno en pantalla o entornos com-pletamente diferentes. Por ahora creamos un único Viewport mediante la función ren-derWindow->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.

CameraComo su nombre indica es la cámara a través de la cual veremos el mundo. Se crea en la línea de código:

sceneMgr->createCamera(“camara1”)

siendo el parámetro pasado el nombre de la cámara.

EntityRepresenta a los objetos de nuestro mundo formados por mallas (archivos con extensión mesh). En el directorio media/models del OG-RE3D se incluyen unos pocos. Dichos mo-delos se crearán con cualquier herramienta de diseño como 3DStudio o Blender, para los cuales ya existen exportadores que convier-ten el formato propio de dichas aplicacio-nes en el mesh que necesita OGRE.

Nuestro ninja será un Entity que se crea mediante la función:

ninja =sceneMgr->createEntity(“ninja1

”,”ninja.mesh”).

El primer parámetro es el nombre que le da-remos a la entidad y el segundo es el nom-bre del fichero que contiene el modelo del ninja.

LightRepresenta las luces que tengamos en nues-tro 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 fun-ción:

luz->setType(Light::LT_POINT)

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

de proceso, ya que implica muchos cálculos. Por eso es necesario no abusar de este ele-mento y usarlo solamente en casos muy es-peciales. Mediante la elección apropiada detexturas se puede conseguir los mismos efec-tos que conseguiríamos más cómodamente con luces.

SceneNodeRepresenta 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 su representación. Es obligatorio que nuestros objetos Entity estén asociados a un nodo. Mien-tras no lo estén, dichos objetos no pertenece-rán a la escena y por tanto no serán renderi-zados. La creación de un SceneNode se hace a través de la función:

nodoNinja = sceneMgr-

>getRootSceneNode()-

>createChildSceneNode

y la asociación de nuestro ninja al nodo me-diante:

nodoNinja->attachObject(ninja)

Serán entonces los nodos los que se posicio-nen 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 co-mún en este tipo de aplicaciones. OGRE3D utiliza un sistema de coordenadas dextrógi-ro, 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 set-Direction(0,0,1) donde le decimos a la cámara que coloque su eje z (que correspon-de 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

Figura 2. Ventana de inicialización del sistema gráfico

Figura 3. Sistema de coordenadas utilizado por OGRE3D

Page 6: Desarrollo de Juegos en Linux Con OGRE3D

60

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

Linux+ 5/2007 61

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

www.lpmagazine.org

continuamente nuestro ninja respecto a su eje Y y salir cuando pulsemos la tecla ES-CAPE.

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 in-ternamente un objeto de tipo InputReader que obtendremos mediante el código:

eventProcessor->getInputReader()

Es intuitivo darse cuenta que la función is-KeyDown 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 de-vuelve 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 retor-na. Hay que tener en cuenta también que el EventProcessor captura eventos en cada cua-dro 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

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 crea-mos 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 comen-tarlo ya que es autoexplicativo.

Por último nos queda mencionar la fun-ció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 encon-trar 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 aplica-ció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 susti-tuir lo que aparece en resources.cfg por tus propios directorios. Es muy fácil equivo-carse en este paso (siempre se queda algún directorio sin copiar, se pone mal algún nombre,…) y al arrancar la aplicación úni-camente nos saltará una excepción con muy poca información de lo que ocurrió. Para sa-ber 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 com-prender el funcionamiento básico de OGR-E3D, así como realizar nuestros primeros pasos con este motor 3D. En siguientes ar-tículos veremos cómo cargar nuestras pro-pias mallas realizadas desde Blender, ani-marlas, gestionar los eventos, etc.

Daniel Barrientos Carrera ([email protected]) es Ingeniero Superior en Informática por la Universidad de Valladolid y actual docto-rando en la Universidad Carlos III de Ma-drid. Actualmente trabaja como profesor en la Universidad Europea de Madrid, donde entre otras cosas imparte clases en el Mas-ter 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 ([email protected]) 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

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 Infor-mática y actualmente realiza su doctorado en la Universidad Carlos III de Madrid. Es pro-fesor en la Universidad Europea de Madrid donde, entre otras cosas, imparte la asigna-tura de Motores de Juegos en el Master enDiseño y Desarrollo de Videojuegos. Así mis-mo, es miembro fundador e investigador prin-cipal de AINetSolutions (http://www.ainetso-lutions.com) empresa dedicada a ofrecer ser-vicios de minería de datos, seguridad, etc.

Sobre los autores

Figura 4. Capturas de pantalla de varios juegos desarrollados con Ogre3D que muestran algunas de las capacidades de este motor