OGRE 3D Motores Gráficos
OGRE 3D – Motores Gráficos
OGRE 3D Motores Gráficos
Contents 1
Comenzando con Ogre 3D ......................................................................................... 2 Inicialización automática I ............................................................................................................. 2 Inicialización automática II ............................................................................................................ 4 Inicialización Manual I ................................................................................................................... 4
OGRE 3D Motores Gráficos
1
Comenzando con Ogre 3D
Los motores gráficos suelen facilitarse como SDK (Software Development Kit) que se instalan sobre nuestro IDE. Son muchos los motores gráficos disponibles a día de hoy liberados en Internet. Estos motores pueden descargase gratuitamente, pero en cambio no pueden explotarse con fines comerciales. Para ello será necesario pagar las licencias necesarias. En este manual vamos a ver el motor gráfico Ogre 3D. Para ello, debemos ir a la web http://www.ogre3d.org/ y descargarnos de la sección Downloads el SDK. Una vez descargado lo instalamos. Ya instalado, podremos comenzar a realizar proyectos con Ogre 3D. Es importante hacer constar antes que Ogre 3D esta diseñado según la filosofía OOP.
Inicialización automática I Para empezar a utilizar Ogre 3D tenemos que inicializar al mismo. Para ello, debemos crear una instancia de Root. Esta es la clase principal de Ogre sobre la cual se irán realizando todas las diferentes acciones. Al invocar una nueva instancia Root podemos indicar diferentes nombres de ficheros, los cuales contendrán los plugins a cargar por Ogre. Estos nombres de ficheros se pueden especificar con ruta absoluta o relativa. Root *root = new Root(); Root *root = new Root("plugins.cfg"); Root *root = new Root("/config/plugins.cfg", "C:\config\ogre.cfg"); Root *root = new Root("plugins.cfg", "ogre.cfg", "ogre.log"); Cada parámetro pasado al constructor de la nueva clase Root tiene una finalidad distinta. El primer fichero, plugins.cfg, indica a Ogre 3D una lista de plugins (DLL o .so en Linux) que cargará para poder realizar las acciones necesarias durante su ejecución. El contenido de uno de estos ficheros suele ser similar a: # Define plugin folder PluginFolder=. # Define plugins Plugin=RenderSystem_Direct3D9 Plugin=RenderSystem_GL Plugin=Plugin_ParticleFX Plugin=Plugin_BSPSceneManager Plugin=Plugin_OctreeSceneManager Plugin=Plugin_CgProgramManager El segundo parámetro tiene como finalidad facilitar a Ogre 3D la configuración de hardware existente con una serie de parámetros de configuración acerca de la tarjeta gráfica. Este archivo es denominado applet. El contenido de este fichero tiene un aspecto similar al siguiente: Render System=Direct3D9 Rendering Subsystem [Direct3D9 Rendering Subsystem] Allow NVPerfHUD=No Anti aliasing=None Floating-point mode=Fastest Full Screen=No Rendering Device=ATI MOBILITY RADEON X600 VSync=No Video Mode=800 x 600 @ 32-bit colour [OpenGL Rendering Subsystem] Colour Depth=32 Display Frequency=60 FSAA=0 Full Screen=Yes RTT Preferred Mode=FBO VSync=No Video Mode=1024 x 768
En cambio, para evitar tener que hacer nosotros este fichero de configuración, disponemos de una serie de funciones, aunque realmente limitadas. Por ello, por lo general suele utilizarse un applet diseñado por uno mismo manualmente. Para
OGRE 3D Motores Gráficos
ello, podemos invocar a la función showConfigDialog(). Esta función es un método de la clase Root que permite mostrar una nueva ventana emergente desde la cual el usuario podría seleccionar y configurar diferentes parámetros.
Esta función creará un fichero denominado ogre.cfg. Además, disponemos de más métodos de la clase Root que nos facilitan esta tarea. Por ejemplo, si deseamos cargar el fichero de configuración en caso de existir o crear uno nuevo si no. Incluso podemos almacenar una copia del fichero: if (!root->restoreConfig()) root->showConfigDialog(); root->saveConfig();
El tercer parámetro indica a Ogre 3D el nombre del fichero de log, donde serán reflejados aquellos errores durante la ejecución. Tenemos la opción de indicarlo durante la ejecución del constructor o definirlo por nuestra parte de la siguiente forma: // create an instance of LogManager prior to using LogManager::getSingleton() LogManager* logMgr = new LogManager; Log *log = LogManager::getSingleton().createLog("mylog.log", true, true, false); // third param is not used since we already created a log in the previous step Root *root = new Root("", ""); La función createLog dispone de diferentes parámetros. El segundo tiene como objetivo hacer este el fichero de log por defecto. El tercero le indica a Ogre que envíe los mensajes de std::cerr a este fichero de log. De esta forma, estaríamos obligados a escribir todos los mensajes de log sobre el mismo fichero. En cambio, podemos capturar los mensajes mediante un listener y trabajar con este mensaje según nuestra necesidad: class MyLogListener : public LogListener { public: void write (const String& name, const String& message, LogMessageLevel level, bool maskDebug) { // redirect log output here as needed }; } MyLogListener *myListener = new MyLogListener; // this is the same as calling LogManager::getSingletonPtr() after the
OGRE 3D Motores Gráficos
// LogManager has first been instanced; the same pointer value is returned LogManager *logMgr = new LogManager; LogMgr->addListener(myListener); logMgr->createLog("mylog.log", true, false, true); logMgr->setLogDetail(LL_NORMAL); Root *root = new Root("", "", "mylog.log"); La función createLog dispone de diferentes parámetros. El segundo tiene como objetivo hacer este el fichero de log por defecto. El tercero le indica a Ogre que envíe los mensajes de std::cerr a este fichero de log. De esta forma, estaríamos obligados a escribir todos los mensajes de log sobre el mismo fichero. En cambio, podemos capturar los mensajes mediante
Inicialización automática II Una vez creada la instancia de la clase Root debemos inicializar Ogre 3D. Para ello, debemos crear una instancia del objeto RenderWindow a la que la asociaremos la ventana generada automáticamente (indicado por el primer parámetro de la función initialise) por Root cuando inicializamos el componente. Basta con ejecutar las siguientes sentencias: root->initialise(true, "My Render Window"); RenderWindow *window = root->getAutoCreatedWindow(); Acabamos de crear un RenderWindow que es el espacio o área donde Ogre 3D dibujará el contenido. Ahora debemos crear una cámara. Para ello usaremos las siguientes líneas de código: Camera *cam = sceneMgr->createCamera("MainCamera"); cam->setNearClipDistance(5); cam->setFarClipDistance(1000); cam->setAspectRatio(Real(1.333333)); Es importante destacar el atributo setAspectRatio, donde indicaremos la proporcionalidad, por lo general 4:3, es decir, 1.333. Una vez creada la cámara, añadiremos un viewport de la siguiente forma: Viewport *vp = window->addViewport(camera); vp->setBackgroundColour(ColourValue(0, 0, 0));
Inicialización Manual I Una vez creada la instancia de la clase Root debemos inicializar Ogre 3D. Para ello, debemos crear una instancia del objeto RenderWindow a la que la asociaremos la ventana generada automáticamente (indicado por el primer parámetro de la función initialise) por Root cuando inicializamos el componente. Basta con ejecutar las siguientes sentencias: