You are on page 1of 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

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.

P
ese al enorme esfuerzo invertido en potenciar
linux@software.com.pl

la usabilidad de los sistemas Linux, tratando Lo que aprenderás


de atraer usuarios desde otras plataformas, aun
Con este artículo aprenderás a compilar e instalar OG-
encontramos mucha gente que se siente reacia
RE3D, así como a crear una escena desde OGRE, cargar
a dar el salto, debido muchas veces al poco soporte que
una malla, crear un punto de luz, un suelo, un cielo y una
tienen los videojuegos en el mundo Linux.
cámara. Esto servirá de base para posteriores artículos
Y es que, seamos realistas, los juegos tienen mucho
donde aprenderemos a cargar nuestras propias mallas,
tirón: desde que se popularizó el uso de los ordenadores
mover los objetos, etc.
personales como herramienta doméstica, el sector del vi-
deojuego ha sido el que ha impulsado grandes cambios en La pregunta que debemos hacernos entonces es: ¿por
nuestros ordenadores personales. Fueron los videojuegos qué la industria del videojuego no acaba de introducirse en
los que hicieron que se popularizaran las tarjetas de sonido el mundo Linux?
(las míticas Adlib o Sound Blaster), las potentes tarjetas La respuesta parece sencilla: actualmente no hay mer-
gráficas actuales que liberan al procesador de realizar cado como para que las grandes compañías se interesen en
muchos de los complejos cálculos necesarios en los juegos sacar versiones para Linux. Hoy en día, la producción de
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 Lo que debes saber
videojuego que acaba de salir al mercado y que exprime
Para seguir adecuadamente este artículo conviene que
los recursos de nuestra máquina, ¿por qué vamos a cam-
tengas unos conocimientos medios de C++ así como
biar a un Sistema Operativo en el que no puedo jugar a mi
algunos conocimientos de manejo de gráficos.
juego favorito?

56 Linux+ 5/2007
para programadores
Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D

un videojuego es un proceso largo y costoso. para Windows). Además, OGRE3D provee mente el nivel de detalle de forma progre-
El presupuesto de algunos videojuegos supe- soporte para programas de vértices y sha- siva, provee exportadores para la mayoría
ra incluso al de grandes super producciones ders personalizados escritos en GLSL, HLSL, de los programas de modelado 3D (3D Stu-
cinematográficas. Cg y en ensamblador, gestiona automática- dio Max, Maya, Blender, LightWave, Sket-
Pero Linux y el mundo del Software
Libre cuentan con un importante factor a su Listado 2. Programa principal de nuestro primer juego con OGRE
favor que puede hacer que todo esto cambie
en un futuro: una enorme comunidad dis- int main( ) {
puesta a colaborar, y multitud de recursos Root *root;
libres para la creación de videojuegos. Con RenderWindow *renderWindow;
herramientas como Blender u OGRE3D (que EventProcessor *eventProcessor;
usaremos para este pequeño tutorial) se pue- SceneManager *sceneMgr;
den conseguir resultados que poco tienen Camera *camara;
que envidiar a otras herramientas comer- Viewport *viewPort;
ciales. Entity *ninja;
Light *luz;
El motor OGRE3D SceneNode *nodoNinja;
OGRE3D (Object-Oriented Graphics Rendering root = new Root();
Engine, http://www.ogre3d.org) es un motor //mostramos ventana de configuracion
de renderizado 3D orientado a escenas es- if (!root->showConfigDialog() ) {
crito en C++ y diseñado para hacer más fácil delete root;
e intuitivo el desarrollo de aplicaciones que return 0;
utilizan aceleración 3D. OGRE3D abstrae }
los detalles de utilización de las librerías root->initialise(false);
gráficas subyacentes (Direct3D y OpenGL) //creamos ventana
y provee una interfaz basada en clases in- renderWindow = root->createRenderWindow("Mi primer programa con
tuitivas (gestor de escena, nodo del grafo de OGRE",600,600,false);
escena, cámara, etc.). A pesar que OGRE3D eventProcessor = new EventProcessor();
no pueda ser definido como un motor de eventProcessor->initialise(renderWindow);
juegos completo, sí que provee muchas eventProcessor->startProcessingEvents();
facilidades, así como plugins para extender sceneMgr = root->createSceneManager(ST_GENERIC);
la funcionalidad del motor como pueda ser camara = sceneMgr->createCamera("camara1");
ODE (motor de físicas), lo cual lo convierte viewPort = renderWindow->addViewport(camara);
en una herramienta muy potente al alcance cargaRecursos();
de todos. //establecemos el ambiente para que haya algo
OGRE3D es multiplataforma (Windows, sceneMgr->setAmbientLight(ColourValue(0.3,0.3,0.3));
Linux, Mac Os X), lo cual nos permite de- sceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
sarrollar juegos fácilmente portables entre sceneMgr->setSkyBox(true,"Examples/StormySkyBox");
diversas plataformas, de hecho ya se está ninja = sceneMgr->createEntity("ninja1","ninja.mesh");
trabajando en una versión de OGRE3D para luz = sceneMgr->createLight( "luz1" );
XBox, lo que permitirá migrar juegos que luz->setType(Light::LT_POINT);
desarrollemos para Linux a esta nueva plata- luz->setPosition( 0,100,-100);
forma (actualmente podemos desarrollar en luz->setVisible( true );
Linux y compilar el juego en Windows, o in- nodoNinja = sceneMgr->getRootSceneNode()->createChildSceneNode("nodoNinja
cluso desarrollar en Linux y mediante cross- ");
compiling obtener también los ejecutables nodoNinja->attachObject( ninja );
nodoNinja->setPosition( 0, 0, 0 );
Listado 1. Compilación e instalación de camara->setPosition(0 ,100 , -400 );
OGRE3D camara->setDirection( 0, 0, 1 );
//BUCLE PRINCIPAL
tar xjf ./OGRE-linux_osx-v1-0- while( !eventProcessor->getInputReader()->isKeyDown(KC_ESCAPE) ) {
?.tar.bz2 nodoNinja->yaw( Radian(0.1) );
cd OGREnew root->renderOneFrame();
./bootstrap }
./configure (Para nvidia añadir -- delete eventProcessor;
with-platform=GLX) delete root;
make return 0;
make install (ejecutar como root) }

www.lpmagazine.org 57
para programadores
Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D

ejemplo pueden ser construidas en el direc-


Listado 3. Código de la función cargaRecursos
torio ./OGREnew/Samples/Common/bin.
void cargaRecursos() {
ConfigFile cf; Configurando nuestro
cf.load("resources.cfg"); primer Juego con KDevelop
// Go through all sections & settings in the file Podemos utilizar OGRE3D directamente
ConfigFile::SectionIterator seci = cf.getSectionIterator(); con gcc pero conviene utilizar un editor que
String secName, typeName, archName; nos facilite la organización de un proyecto
while (seci.hasMoreElements()) { y sus archivos. Dentro de la gran variedad
secName = seci.peekNextKey(); de editores que tenemos a nuestra disposi-
ConfigFile::SettingsMultiMap *settings = seci.getNext(); ción en Linux, se ha elegido KDevelop por
ConfigFile::SettingsMultiMap::iterator i; su madurez como producto así como su
for (i = settings->begin(); i != settings->end(); ++i) { facilidad de integración a la hora de desa-
typeName = i->first; rrollar con OGRE.
archName = i->second; Configurar OGRE3D con KDevelop es
ResourceGroupManager::getSingleton().addResourceLocation( realmente simple, basta con crearse un nuevo
archName, typeName, secName); proyecto C++ simple y realizar las siguientes
} acciones:
}
//inicializa recursos. • Abrir el archivo configure.in y añadir lo
ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); 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@
chup, etc.), múltiples efectos de postproce- probar los prerrequisitos tanto para poder AM_CXXFLAGS=@OGRE_CFLAGS@,
sado (hdr, niebla, ruido, etc.), así como mu- compilar OGRE3D así como para su pos- • Para conseguir que el programa se ejecu-
chas otras características que lo convierten terior utilización (las siguientes versiones te en el directorio donde se encuentran
en una opción muy a tener en cuenta a la funcionan correctamente al compilar OG- los ejemplos para que al depurar no
hora de desarrollar un videojuego; de hecho RE3D 1.0.3): haya que copiar todos los recursos, bas-
esto le ha llevado a ser el motor elegido co- ta con ir a las opciones de proyecto, se-
mo base a la hora de impartir el Master en • automake 1.6+, leccionar la opción de directorio propio
Diseño y Desarrollo de Videojuegos de la Uni- • autoconf 2.50+, y seleccionar el directorio <RaizDeOGRE>/
versidad Europea de Madrid. • make 3.80, Samples/Common/bin.
OGRE3D está licenciado bajo LGPL • libtool 1.5.6,
(que se convertirá en una doble licencia • pkg-config 0.17.2, Una vez realizados estos pasos ya podemos
cuando salga la versión para XBox debi- • gcc 3.3.5, desarrollar nuestros propios juegos sin más
do a las royalties) y cuenta con una gran • g++ 3.3.5, complicaciones.
y muy activa comunidad de desarrollado- • cpp 3.3.5,
res (http://www.ogre3d.org/phpBB2/), de he- • Freetype2 2.1.x+,
cho se desarrollaron 6 proyectos dentro • zziplib 0.12.x+,
del último Google Summer of Code rela- • FreeImage, Nota para usuarios de Ubuntu
cionados con ampliaciones y mejoras de • libpng, libmng, libtiff, libjpeg (para
Cuando hagas make install puedes obtener
OGRE3D, lo cual muestra tanto el interés FreeImage).
un error como éste:
que suscita como el interés de la comuni-
dad porque crezca. Una vez cumplidos los prerrequisitos, nos ba- "/usr/bin/install: cannot stat
jaremos la última versión de OGRE3D desde `.libs/libOGREMain.lai': No such
Instalando OGRE3D la página web de OGRE3D y lo compilaremos file or directory"
en GNU/Linux y lo instalaremos mediante los comandos que
Existen binarios de OGRE3D tanto para De- aparecen en el Listado 1. Si ocurre, lo que necesitas hacer es:
bian, como para Fedora Core y Ubuntu, Conviene notar que se puede sustituir
cp OGREMain/src/libOGREMain.la
así como se puede compilar e instalar OG- make por make -j <número de procesos>
OGREMain/src/.libs/libOGREMain.lai
RE3D desde los fuentes. Instalar OGRE3D para compilar varios archivos en paralelo,
vi OGREMain/src/.libs/
mediante paquetes precompilados es tarea lo cual puede acelerar la compilación de
libOGREMain.lai
relativamente simple (podemos conse- forma considerable si contamos con varios
guir más información sobre esto en http:// procesadores o un procesador multicore (es
y cambiar en la línea 25 "installed=no"
www.OGRE3d.org/wiki/index.php/Installing_ recomendable que el número de procesos
a "installed=yes". Una vez salvado es-
An_SDK#Linux), por lo que aquí nos centra- sea dos veces el número de cores dispo-
to, haz sudo make install de nuevo y todo
remos en la compilación e instalación des- nibles). Una vez la compilación termine
debería funcionar.
de los fuentes. Antes que nada hay que com- de forma satisfactoria, las aplicaciones de

58 Linux+ 5/2007
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 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

Listado 4. Contenido del fichero resources.cfg

# Resource locations to be added to


the 'boostrap' path
# This also contains the minimum Figura 1. Resultado visible de nuestro primer ejemplo utilizando OGRE3D
you need to use the OGRE3Dexample alardes de diseño y estructuraremos el pro- El parámetro booleano pasado a dicha fun-
framework grama en 2 funciones, el main y la función ción indica si se quiere que OGRE3D cree
[Bootstrap] cargaRecursos. Se muestra en el Listado 2 el automáticamente una ventana. En nuestro
Zip=../../media/packs/OGRECore.zip código de la función main ya que ésta es caso le decimos que no, y la crearemos poste-
# Resource locations to be added to la que realiza las tareas que nos interesan riormente nosotros.
the default path principalmente y más adelante explicare-
[General] mos el funcionamiento de la función carga- RenderWindow
FileSystem=../../media Recursos. Representa la ventana sobre la que OGRE3D
FileSystem=../../media/fonts Las variables utilizadas se encuentran renderizará (dibujará) sus contenidos. Da-
FileSystem=../../media/materials/ al comienzo de la función main y represen- do que anteriormente le dijimos al root que
programs tan a las clases principales de OGRE3D que no nos crease dicha ventana, lo tendremos
FileSystem=../../media/materials/ se pasan a describir a continuación: que hacer nosotros, mediante la línea de
scripts código
FileSystem=../../media/materials/ Root
textures Esta clase representa la raíz, como su nombre renderWindow = root-
FileSystem=../../media/models indica, de una aplicación hecha con OGRE. >createRenderWindow("Mi primer
FileSystem=../../media/overlays Es necesario crearla antes de cualquier otra programa con OGRE",600,600,false)
FileSystem=../../media/particle cosa, y se hace simplemente mediante la
FileSystem=../../media/gui línea de código El primer parámetro es bastante evidente
FileSystem=../../media/ y es la cadena que aparecerá en la barra de
DeferredShadingMedia root = new Root() título de la ventana. Después se le indica
Zip=../../media/packs/cubemap.zip el tamaño de dicha ventana (ancho y alto)
Zip=../../media/packs/ Inmediatamente después en el código se mu- y por último si queremos que esté a pan-
cubemapsJS.zip estra la ventana de configuración que viene talla completa (en cuyo caso ignoraría el
Zip=../../media/packs/dragon.zip con OGRE, que es la que se muestra en la tamaño indicado antes) o no. En nuestro
Zip=../../media/packs/ Figura 2. caso elegimos que no sea a pantalla comp-
fresneldemo.zip Una vez pasada esa ventana de configu- leta.
Zip=../../media/packs/ ración (presionando aceptar) se inicializa la
OGREtestmap.zip aplicación mediante la línea de código EventProcessor
Zip=../../media/packs/skybox.zip Es necesario crear un objeto de esta clase
root->initialise(false) para que OGRE3D pueda capturar eventos

www.lpmagazine.org 59
para programadores
Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D

Viewport de proceso, ya que implica muchos cálculos.


Necesario crearlo para ver algo. No es lo mis- Por eso es necesario no abusar de este ele-
mo que RenderWindow ya que puede haber mento y usarlo solamente en casos muy es-
varios Viewport en una misma RenderWin- peciales. Mediante la elección apropiada de
dow permitiendo así tener distintas vistas texturas se puede conseguir los mismos efec-
de un entorno en pantalla o entornos com- tos que conseguiríamos más cómodamente
pletamente diferentes. Por ahora creamos con luces.
un único Viewport mediante la función ren-
derWindow->addViewport, la cual necesita SceneNode
como parámetro un objeto de tipo Camera Representa un nodo de la escena. Los nodos
que será la cámara que plasmará lo que ve sirven para organizar los objetos dentro de la
en ese viewport. escena y poder llevar a cabo los algoritmos que
el SceneManager tiene implementados para
Figura 2. Ventana de inicialización del sistema
Camera su representación. Es obligatorio que nuestros
gráfico
Como su nombre indica es la cámara a través objetos Entity estén asociados a un nodo. Mien-
y despacharlos al lugar apropiado. En con- de la cual veremos el mundo. Se crea en la tras no lo estén, dichos objetos no pertenece-
creto a nosotros nos interesa en este ejem- línea de código: rán a la escena y por tanto no serán renderi-
plo para detectar pulsaciones de teclas y po- zados. La creación de un SceneNode se hace
der así terminar nuestra aplicación tras sceneMgr->createCamera(“camara1”) a través de la función:
pulsar ESCAPE.
siendo el parámetro pasado el nombre de la nodoNinja = sceneMgr-
SceneManager cámara. >getRootSceneNode()-
Esta clase se encarga de la gestión de la es- >createChildSceneNode
cena 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 y la asociación de nuestro ninja al nodo me-
nal del motor. Se crea mediante la línea de formados por mallas (archivos con extensión diante:
código: mesh). En el directorio media/models del OG-
RE3D se incluyen unos pocos. Dichos mo- nodoNinja->attachObject(ninja)
sceneMgr= root->createSceneManager delos se crearán con cualquier herramienta
(ST_GENERIC) de diseño como 3DStudio o Blender, para los Serán entonces los nodos los que se posicio-
cuales ya existen exportadores que convier- nen en el mundo y no las entidades en sí.
El parámetro pasado a dicha función se re- ten el formato propio de dichas aplicacio- Estas son entonces las clases básicas de
fiere al tipo de gestor de escenario que se nes en el mesh que necesita OGRE. OGRE3D (por supuesto tiene muchas cosas
quiere crear y dependerá del tipo de entorno Nuestro ninja será un Entity que se crea más) necesarias para empezar a hacer algo
3D que tengamos. Existen otros tipos ade- mediante la función: básico. Antes de pasar a explicar el resto del
más de ST_GENERIC, como ST_INTERIOR código es necesario conocer qué sistema de
para niveles de juego en interiores, ST_EX- ninja =sceneMgr->createEntity(“ninja1 coordenadas utiliza OGRE3D, que es el co-
TERIOR para entornos representados me- ”,”ninja.mesh”). mún en este tipo de aplicaciones. OGRE3D
diante mapas de alturas… En este ejemplo utiliza un sistema de coordenadas dextrógi-
no nos vamos a preocupar de este parámet- El primer parámetro es el nombre que le da- ro, en el cual el eje Z apunta hacia fuera de
ro y podemos dejarlo en ST_GENERIC para remos a la entidad y el segundo es el nom- la pantalla, el eje Y hacia arriba y el eje X
la mayoría de nuestras aplicaciones sen- bre del fichero que contiene el modelo del hacia la derecha. La notación para indicar
cillas. ninja. vectores es la usual (x,y,z). En la Figura 3
se muestra dicho sistema de coordenadas.
Light Por esa razón el ninja se sitúa en la posición
Representa las luces que tengamos en nues- (0,0,0), la cámara se sitúa en (0,100,-400), es
tro entorno. Se pueden crear de varios tipos decir, hacia el fondo de la pantalla. Con el fin
y para nuestro caso hemos creado una luz de que la cámara pueda ver a nuestro ninja
puntual mediante el codigo: tenemos que decirle que apunte hacia él,
y esto lo hacemos mediante la función set-
luz=sceneMgr->createLight(“luz1”) Direction(0,0,1) donde le decimos a la
cámara que coloque su eje z (que correspon-
El tipo de luz se establece mediante la fun- de a la línea de visión) en dirección Z del
ción: mundo positivo, es decir, estará mirando
hacia fuera de la pantalla, hacia nosotros.
luz->setType(Light::LT_POINT) Una vez colocados todos los elementos
en su lugar pasamos a realizar el bucle que
Figura 3. Sistema de coordenadas utilizado por Es muy importante señalar que al poner luces se encargará de llevar a cabo las tareas que
OGRE3D en la escena se ralentiza mucho la velocidad apuntamos al comienzo de esta sección: rotar

60 Linux+ 5/2007
para programadores
Desarrolla tus propios juegos desde 0 en GNU/Linux con OGRE3D

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
Figura 4. Capturas de pantalla de varios juegos desarrollados con Ogre3D que muestran algunas de las
nombre,…) y al arrancar la aplicación úni-
capacidades de este motor
camente nos saltará una excepción con muy
continuamente nuestro ninja respecto a su velocidad posible, por lo que dicho código no poca información de lo que ocurrió. Para sa-
eje Y y salir cuando pulsemos la tecla ES- se ejecutará igual de rápido en distintos PC. ber de donde viene el problema el OGRE3D
CAPE. Además animo a eliminar la luz que crea- nos deja el fichero OGRE.log en el directorio
La rotación respecto al eje Y la realiza la mos anteriormente (basta con pasar false a la de nuestra aplicación donde va dejando
función yaw. Podemos rotar un SceneNode función luz->setVisible) para comprobar información de lo que hace. De esta forma
en torno a cualquiera de sus tres ejes: X la gran diferencia de velocidad entre tener examinando lo último escrito en ese fichero
(pitch), Y(yaw), Z(roll), existiendo funciones o no tener luz. podemos saber o al menos intuir qué es lo
miembro en SceneNode para cada una de El resto del código no es necesario comen- que falló.
esas rotaciones. tarlo ya que es autoexplicativo. Este primer ejemplo nos permite com-
La comprobación de tecla pulsada se Por último nos queda mencionar la fun- prender el funcionamiento básico de OGR-
hará mediante la función isKeyDown de la ción cargaRecursos(). Dicha función, que E3D, así como realizar nuestros primeros
clase InputReader. El objeto eventProcessor que se muestra en el Listado 3, se encarga de ir pasos con este motor 3D. En siguientes ar-
creamos al comienzo del código contiene in- recorriendo los directorios donde tenemos tículos veremos cómo cargar nuestras pro-
ternamente un objeto de tipo InputReader que los recursos de nuestra aplicación (modelos, pias mallas realizadas desde Blender, ani-
obtendremos mediante el código: texturas, materiales,…) e ir cargándolos. Ese marlas, gestionar los eventos, etc.

eventProcessor->getInputReader()

Es intuitivo darse cuenta que la función is- Sobre los autores


KeyDown consulta si la tecla indicada por Daniel Barrientos Carrera (danbar@uem.es) Hombre-Máquina. Actualmente desarrolla su
parámetro (los códigos correspondientes se es Ingeniero Superior en Informática por la doctorado en la Universidad Politécnica de
pueden consultar en la ayuda que viene con Universidad de Valladolid y actual docto- Madrid. Su bitácora personal se encuentra
OGRE) está pulsada, en cuyo caso nos de- rando en la Universidad Carlos III de Ma- en http://www.enriquepuertas.com.
vuelve true. drid. Actualmente trabaja como profesor en José Carlos Cortizo Pérez (jccp@ainetso-
El renderizado de la escena se realiza en la Universidad Europea de Madrid, donde lutions.com) es Ingeniero Superior en Infor-
la llamada root->renderOneFrame(), que entre otras cosas imparte clases en el Mas- mática y actualmente realiza su doctorado
como su nombre indica renderiza (dibuja) ter en Desarrollo y Diseño de Videojuegos. en la Universidad Carlos III de Madrid. Es pro-
la escena que hay en ese momento y retor- Es experto en visión artificial y artífice del fesor en la Universidad Europea de Madrid
na. Hay que tener en cuenta también que el sistema de control automático de las velas donde, entre otras cosas, imparte la asigna-
EventProcessor captura eventos en cada cua- del Desafío Español. tura de Motores de Juegos en el Master en
dro renderizado, por lo que si eliminamos la Enrique Puertas Sanz (enrique.puertas@ Diseño y Desarrollo de Videojuegos. Así mis-
llamada a renderOneFrame no responderá el uem.es) es Ingeniero Superior en Informática mo, es miembro fundador e investigador prin-
teclado. por la Universidad Europea de Madrid donde cipal de AINetSolutions (http://www.ainetso-
Como se puede ver, nuestro código no actualmente imparte clases en temas como lutions.com) empresa dedicada a ofrecer ser-
realiza ningún control de frames por segundo Taller de Software Libre y Comunicación vicios de minería de datos, seguridad, etc.
sino que simplemente renderiza a la máxima

www.lpmagazine.org 61

You might also like