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.
Linkercolocamos 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.