Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con Orgre3D

Iniciado por caza, 04 de Junio de 2012, 04:26:22 PM

« anterior - próximo »

caza

Hola!

Bueno, tengo este código copiado (para después hacer unos ejercicios) y me da error grave... no se si es por que no encuentra los archivos necesarios o no se...

Código (cpp) [Seleccionar]
#include <ogre.h>
#include <OIS\OIS.h>

using namespace Ogre;

class ExitListener : public FrameListener
{
public:
   ExitListener(OIS::Keyboard*keyboard):mKeyboard(keyboard)
   {
   }

   bool frameStarted(const FrameEvent& evt)
   {
      mKeyboard->capture();
      return !mKeyboard->isKeyDown(OIS::KC_ESCAPE);
   }

private:
   OIS::Keyboard *mKeyboard;
};

// La clase Application contendra los metodos para inicializar una aplicacion Ogre.
class Application
{
public: // Al invocar al metodo go se realizaran las inicializaciones de los subsistemas en el orden indicado
   void go()
   {
      createRoot();
      defineResources();
      setupRenderSystem();
      createRenderWindow();
      initializeResourceGroups();
      setupScene();
      setupInputSystem();
      createFrameListener();
      startRenderLoop();
   }

   ~Application()
   {
      mInputManager->destroyInputObject(mKeyboard);
      OIS::InputManager::destroyInputSystem(mInputManager);
       
      delete mListener;
      delete mRoot;
   }

private:
   Root*mRoot;
   OIS::Keyboard*mKeyboard;
   OIS::InputManager*mInputManager;
   ExitListener*mListener;

   // El objeto root es el núcleo de Ogre, nada se puede hacer en ogre si previamente no se crea root
   void createRoot()
   {
      mRoot = new Root();
   }

   void defineResources()
   {
      String secName, typeName, archName;
      ConfigFile cf;
      cf.load("resources.cfg");
      ConfigFile::SectionIterator seci = cf.getSectionIterator();
      while(seci.hasMoreElements())
      {
         secName = seci.peekNextKey();
         ConfigFile::SettingsMultiMap*settings = seci.getNext();
         ConfigFile::SettingsMultiMap::iterator i;
         for(i=settings->begin(); i!=settings->end(); ++i)
         {
            typeName = i->first;
            archName = i->second;
            ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);
         }
      }
   }


   
   // En este paso se indica aspectos refernetes a la configuracion grafica con la que se va a mostrar la aplicacion
   //( OpenGL o DirectX, resolucion, anti aliasing y pantalla completa) 
   void setupRenderSystem()
   {
      RenderSystem *rs = mRoot->getRenderSystemByName("Direct3D9 Rendering Subsystem");
      mRoot->setRenderSystem(rs);
      rs->setConfigOption("Full Screen", "No");
      rs->setConfigOption("Video Mode", "800 x 600 @ 32-bit colour");
   }

   

   // Crear la ventana principal
   void createRenderWindow()
   {
      mRoot->initialise(true, "tutorial");

   }

   void initializeResourceGroups()
   {
      TextureManager::getSingleton().setDefaultNumMipmaps(5);
      ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
   }

   // En este apartado es donde se monta la escena: se colocab camaras, luces, objetos, efectos, etc...
   void setupScene()
   {// Creamos el SceneManager
      SceneManager* mSceneMgr = mRoot->createSceneManager(ST_GENERIC, "default Smanager");

      // Creamos y configuramos la camara
      Camera* cam;
      cam = mSceneMgr->createCamera("cámara");
      cam->setNearClipDistance(1);
      cam->setFarClipDistance(500);
      cam->setPosition(150.0, 120.0, 0.0);
      cam->lookAt(0.0, 50.0, 0.0);

      // Creamos la luz
      Light* light = mSceneMgr->createLight("luz1");
      light->setType(Light::LT_POINT);
      light->setPosition(0, 100, 0);
      light->setDiffuseColour(0.4, 0.4, 0.4);
      light->setSpecularColour(0.2, 0.3, 0.2);
      Viewport *vp = mRoot->getAutoCreatedWindow()->addViewport(cam);

      // Luz ambiente
      mSceneMgr->setAmbientLight(ColourValue(0.2,0.2,0.2));

      // Creamos un objeto
      Entity* ent;
      ent = mSceneMgr->createEntity("Robot", "robot.mesh");
      SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("RobotNode");
      node->setPosition(0.0,0.0,0.0);
      node->attachObject(ent);

   }

   // Sistema de entrada
   void setupInputSystem()
   {
      size_t windowHnd = 0;
      std::ostringstream windowHndStr;
      OIS::ParamList pl;
      RenderWindow * win = mRoot->getAutoCreatedWindow();

      win->getCustomAttribute("WINDOW", &windowHnd);
      windowHndStr<<windowHnd;
      pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
      mInputManager = OIS::InputManager::createInputSystem(pl);

      try
      {
         mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, false));
      }
      catch (const OIS::Exception&e)
      {
         throw Exception(42, e.eText, "Application::setupInputSystem");
      }
   }


   void setupCEGUI()
   {
   }

   // Gestiona los eventos de la ventana principal
   void createFrameListener()
   {
      mListener = new ExitListener(mKeyboard);
      mRoot->addFrameListener(mListener);
   }

   // Bucle de repintdo
   void startRenderLoop()
   {
      mRoot->startRendering();
   }
};

int main(int argc, char **argv)
{
   try
   {
      Application app;
      app.go();
   }

   catch(Exception&e)
   {
      fprintf(stderr, "An exception has ocurred %s\n", e.getFullDescription().c_str());
   }

   return 0;
}

caza

Este es el error grave...
Excepción no controlada en 0x5e303e21 en EsqueletoOgre.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0xcccccd0c.

TrOnTxU

Cita de: caza en 04 de Junio de 2012, 04:32:40 PM
Este es el error grave...
Excepción no controlada en 0x5e303e21 en EsqueletoOgre.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0xcccccd0c.

Tiene pinta de puntero no inicializado o mal inicializado, 0xcccccd0c no debiera ser una posición "normal" de memoria.

Traza el programa cuando "pete" y averigua que puntero te has dejado por inicializar. Basta con ver la instrucción en la que se queda el programa y a que variables accede en la misma. Cuando averigues que puntero es tienes que trazar de donde viene, y como se inicializa.

Si el puntero que falla, es de la "implementacion" de Ogre, ý tienes las librerias ya compiladas, seguramente no puedas ver el source. Con lo que tienes que "subir" la pila de ejecución, hasta las llamadas de tu "programa". Un vez ahi ves que instrucción es, a que clases o "sistema" estás accediendo, y que te has dejado por inicializar.


Otra cosa es estes utilizando librerias que no corresponden con tu compilador: por ejemplo utilizar librerias compiladas en vs2008, y enlazarlas con un mingw.

Como también dices puede que no encuentre un recurso en disco, asi que es mejor que hagas primero una prueba sin cargar nada al principio para averiguarlo.

Sea cual sea el problema. SImplifica al máximo tu porgrama y ves probando por partes hasta encontrar la parte que falla. Si falla todo, seguramente sea que no enlazas las librerias que corresponden.


Un saludo.
Vicent: Linked-In  ***  ¡¡Ya tengo blog!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.