lunes, 30 de junio de 2008

Crear una aplicación básica en Ogre

Buenas, esto si es un dolor de cabeza para cualquiera que esté empezando con este buen motor.

Requisitos:

-C++ (está demás ponerlo, pero casos se han visto)
-Visual Studio 2005 o 2008 express
-Ogre Eihort version 1.47 o superior


Configuración del visual studio,usando lo básico de Visual C++:

abrimos el Visual C++ y creamos una aplicación nueva y seleccionamos win32project y le colocamos un nombre y pasamos a la siguiente ventana.

Seleccionamos Windows application en la otra ventana y seleccionamos la casilla de empty project. Con esto evitamos que se creen varios archivos innecesarios.

primero agregamos un archivo de tipo cpp, en el menú project, seleccionamos add new item. Le damos un nombre por ejemplo main.

ahora a la parte de la configuración del proyecto. En el menú project, seleccionamos properties o presionamos alt +f7, vamos a configurar para modo de depuración(debug).


imagen 2: C/C++

Seleccionamos C/C++ en el árbol de opciones( señalado en la imagen 2 por un círculo rojo) y pro cedemos a configurar en la etiqueta general la opción: Additional Include Directories agregando


$(OGRE_HOME)\include
$(OGRE_HOME)\samples\include


Ahora con la parte de encadenamiento mal llamada linkeo que en español no existe. Me refiero a la sección del Linker( círculo rojo en la imagen 3).


imagen 3. Linker


colocamos en la etiqueta general la opción Additional Include Directories


$(OGRE_HOME)\lib


y en la etiqueta Input en la opción Additional Dependencies las librerías que se van a encadenar.


OgreMain_d.lib
OIS_d.lib




NOTA:
los errores al compilar el programa que se producen cuando se ve de este estilo " error LNK2019: unresolved external symbol ", es porque faltan algunos de los .lib's o un archivo fuente .cpp( .c en el caso de C puro).

notese que las librerias son llevan un _d acompañando el nombre, esto está indicando que solo son para compilar en modo depuración(debug). Para release las librerías no incluyen esa parte.


Bueno, ya estamos listos para empezar a escribir code.

Usaremos lo que trae Ogre cómo predeterminado para hacer la aplicación. Me refiero a "ExampleApplication.h" y "ExampleFrameListener.h". es suficiente incluir "ExampleApplication.h" ya que este contiene el otro.


#include "ExampleApplication.h"

Hacemos la clase heredada de FrameListener


class testingFrameListener : public ExampleFrameListener
{
private:
SceneManager* mSceneMgr;
public:
testingFrameListener(SceneManager *sceneMgr, RenderWindow* win, Camera* cam)
: ExampleFrameListener(win, cam,false,false),
mSceneMgr(sceneMgr)
{
}

bool frameStarted(const FrameEvent& evt)
{
bool ret = ExampleFrameListener::frameStarted(evt);


return ret;

}

};






class testingApp : public ExampleApplication
{
public:
testingApp()
{}

~testingApp()
{
}

protected:

virtual void createCamera(void)
{
// Creando La camara
mCamera = mSceneMgr->createCamera("PlayerCam");

// Posición a 500 en la dirección Z
mCamera->setPosition(Vector3(0,15,50));
// mirar a lo largo de -Z
mCamera->lookAt(Vector3(0,0,30));
mCamera->setNearClipDistance(5);

}

virtual void createViewports(void)
{
// Crear un viewport
Viewport* vp = mWindow->addViewport(mCamera);
vp->setBackgroundColour(ColourValue(0.1,0.1,0.1));

// Alterar the camera para que concuerde con el wl Viewport
mCamera->setAspectRatio(
Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
}




// Sobrecargar el método createScene es obligatorio
virtual void createScene(void)
{

mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5,0.5));
mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);

//agregando un plano
Plane plane( Vector3::UNIT_Y, 0 );
MeshManager::getSingleton().createPlane("ground",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);
Entity* planeN = mSceneMgr->createEntity( "GroundEntity", "ground" );

mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(planeN);
planeN->setMaterialName("Examples/Rockwall");
planeN->setCastShadows(false);


// Crear una luz
Light* l = mSceneMgr->createLight("MainLight");
l->setType( Light::LT_POINT );
l->setPosition(-5,100,100);



}

// Create new frame listener
void createFrameListener(void)
{
mFrameListener= new testingFrameListener(mSceneMgr, mWindow, mCamera);
mRoot->addFrameListener(mFrameListener);
}
};





y para poder ejecutarlo se necesita el punto de entrada


#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char *argv[])
#endif
{
// Create application object
testingApp app;



try {
app.go();
} catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
std::cerr << "Una excepción ha ocurrido: " <<>


Y a compilar, buena suerte en con Ogre, se necesita saber C++ en un grado medio y mucha paciencia.

2 comentarios:

pedro sanjuan dijo...

amigo buenos dias, de antemanos lo felicito por su tuto, tambien soy ing. de sistemas y me interesa mucho el desarrollo de video juegos...
despues de probar tu codigo y corregir uno errores que salian, me veo en la penosa necesidad de preguntarte algo, cuando esta cargar el debug,carga todos los dll, pero no corrre tya que sale el siguiente error si me puedes colaborar te lo agradeceria
The program '[2452] ogre_test.exe: Native' has exited with code -858993460 (0xcccccccc).

pedro sanjuan dijo...

amigo ya soluciono el problema pero, pero ahora me sale el siguiente
The program '[2760] ogre_test.exe: Native' has exited with code 1 (0x1).

Bienvenidos

Hola dejenme darle una cordial bienvenida a este blog, en el cual si el tiempo me lo permite y las ganas mantendré actualizado con respecto a información de programación, games, motores y en especial Ogre3D.