Motores 3D: Ogre3D

Escrito por aserrano. Posteado en Desarrollo, Motores 3D, Torque

Cualquier juego 3D que se precie debe tener un motor idem.

En el caso de Ogre, lo primero que deberíamos matizar es que no es un motor de juegos. Ogre sólo es un motor 3D y muy bueno por cierto. Viene además complementado con CEGUI y OIS.

Realmente estas dos librerías no forman parte del desarrollo de Ogre en sí, pero sus desarrolladores las han usado para poder complementar Ogre.

La primera es una archi-conocida ‘GUI’, es decir una interfaz gráfica de usuario que nos permitirá crear diálogos, cajas de edición de texto, cajas de lista, etc y la segunda es una librería de interfaz de usuario, es decir, nos permitirá manejar el teclado, ratón y joystick.

Destacable de este motor es su facilidad inicial de uso, aunque eso sí, se requiere un nivel medio-alto de C++. Mi recomendación por tanto al respecto es que si no tienes ese perfil, lo primero que debes hacer, es adquirir un conocimiento medio de C++ y sobre todo sentirte cómodo con herramientas de desarrollo C++ como visual C++ Express Edition.

Ogre se presenta en dos paquetes, un SDK, listo para desarrollar, muy recomendable para novatos, y otro en formato código fuente, mucho mas propio de usuarios avanzados y que nos permitirá, por ejemplo, depuración dentro del código de Ogre.

Los chicos de Ogre han realizado una tarea excelente y han querido hacer su herramienta universal y además de ser multiplataforma para Linux, Windows y Macintosh, compila bajo los compiladores C++ mas usados, Visual C++, MingW o gcc bajo linux (que me perdonen la gente de Mac porque desconozco el compilador que usan ellos 🙁 ).

Ogre se complementa además, con muchas herramientas de exportación de editores gráficos 3D como blender, 3D studio, Maya, etc. y un paquete de demos, que recomiendo bajar para que veamos las magníficas capacidades de este motor (también tenemos disponibles sus código fuentes que nos puede servir de aprendizaje).

Este engine también cuenta como caracterísitica el estar implementado a base de plugins, que lo hace ser muy versatil en ese sentido. Para la plataforma Windows tenemos dos motores de renderizado, uno para DirectX y otro para OpenGL y para Linux, logicamente, sólo contamos con soporte OpenGL.

Además de los plugins de renderizado, tenemos plugins de partículas o los plugins de escenario, y entre estos, los hay para interiores y exteriores (terrenos). Realmente podríamos hacer uso de cada uno de ellos en cualquier circunstancia, pero la razón de cada uno de ellos es su optimización que será mejor si se le da el uso apropiado.

Para la versión de desarrollo existe además un plugin de renderizado de portales del que haremos un artículo específico por su importancia, ya que aporta una de las características mas demandadas en un juego.

Ogre viene con una plantilla que hará un primer desarrollo inicial muy simple. No es el objeto de este artículo pero expondré la creación de una aplicación inicial en Ogre a modo de ejemplo.

[code lang=”cpp”]
#include “ExampleApplication.h”

class TutorialApplication : public ExampleApplication
{
protected:
public:
TutorialApplication()
{
}

~TutorialApplication()
{
}
protected:
void createScene(void)
{
mSceneMgr->setAmbientLight( ColourValue( 1, 1, 1 ) );

Entity *ent1 = mSceneMgr->createEntity(“Robot”, “robot.mesh” );

SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode(

“RobotNode” );

node1->attachObject( ent1 );

}
};

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include “windows.h”

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
TutorialApplication app;

try {
app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(),

“An exception has occurred!”, MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, “An exception has occurred: %sn”,
e.getFullDescription().c_str());
#endif
}

return 0;
}
[/code]

Este código hereda la clase ExampleApplication que monta todo el esqueleto para poder usar Ogre y se encarga de toda la inicialización de recursos y plugins de la misma.

Destacable de todo este código es la fase de creación de nuestra escena. Creamos una luz, una entidad, la vinculamos a un nodo de nueva creación, que estará en la posición vectorial (0,0,0) y finalmente el nuevo nodo es añadido a la escena.

[code lang=”cpp”]

void createScene(void)
{
mSceneMgr->setAmbientLight( ColourValue( 1, 1, 1 ) );

Entity *ent1 = mSceneMgr->createEntity(“Robot”, “robot.mesh” );

SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode(

“RobotNode” );

node1->attachObject( ent1 );

}

[/code]

A partir de aquí todo este esqueleto montará el bucle y el manejo de la interfaz de usuario y nos permitirá ver dicho “mesh” en pantalla.

He querido dar con este artículo un esbozo inicial de lo que es Ogre y una min-aplicación para que se vea su sencillez inicial de uso.

Mucho mas allá de esto, el código lo podríamos complicar todo lo que quisieramos y si queremos salir de una inicialización básica, deberemos crear nuestro propio bucle de juego y nuestra propia inicialización. Es posible que veamos algo de eso en otro artículo.

Próximo artículo Ogre 1.5.0: motor de renderizado PCZSceneManager.

Referencias:

El código fuente aquí expuesto pertenece a la wiki de Ogre y es de dominio público (salvo error u omisión eso es lo que pone al pie de su página)

Ogre3D Web oficial
Ogre3D Wiki

"Trackback" Enlace desde tu web.

Deja un comentario

Time limit is exhausted. Please reload CAPTCHA.

Nota legal

(C) Antonio Serrano 2012