Aktuelle Zeit: 23.04.2024, 22:14

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Objektinfos aus irr-Datei auslesen?
BeitragVerfasst: 23.09.2008, 07:58 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Hallo Freunde!

Habe lange nicht mehr geschrieben... :D

Mir stellt sich schon seit längerem eine Frage:
Kann ich die Objektinfos aus einer irr-Datei auslesen? Also... ich erkläre kurz.
Ich habe mit irrEdit eine Welt konstruiert, habe nun die irr-Datei oder von mir aus auch xml-Datei erstellt.
Lese weiter diese Datei durch mein Game ein und die Welt erscheint, alles schö nund gut.
Gibt es jetzt für mich eine Möglichkeit, die ganzen Objekte (Cubes, Skybox, Light, Meshes, Cameras, etc) aus der irr-Datei, die eingelesen wurde, anzusprechen und zb. durch mein Programm zu ändern.
Ich weiß, das Objekte eine Id und einen Namen besitzen können, das wäre für mich ein Anhaltspunkt dafür.
Wie sieht nun die Praxis aus...? Es wäre ziemlich blöd, wenn es nicht gehen würde.
Nah angenommen, ich lade ein animiertes Mesh durch die irr-Datei mit dem Namen "character0" und Id von mir aus "1". Wie kann ich nun dieses Objekt ermitteln und es steuern, Eigenschaften verändern, etc. Ich habe es schließlich nicht durch das Programm als Objekt erstellt, sondern es wurde geladen. In der GUI kann man ja schließlich auch Buttons, etc. über die Id abfragen.

Ich hoffe ihr könnt mir da weiterhelfen.


Nach oben
 Profil  
 
BeitragVerfasst: 24.09.2008, 15:14 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
ISceneManager::getSceneNodeFromId oder FromName

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
BeitragVerfasst: 24.09.2008, 18:27 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Hallo nochmal!

Genau diese Funktion habe ich gesucht. Okay es klappt auch.
Nur, ein Problem hätte ich da noch: Wie bekomme ich nun Collision für das Terrain, Meshes, etc. hin? Ich habe schließlich kein Mesh (getMesh...), auf das ich verweisen kann, nur ein ISceneNode-Zeiger.
Hättet ihr eine Idee, wie man das machen könnte?


Nach oben
 Profil  
 
BeitragVerfasst: 24.09.2008, 19:14 
Offline

Registriert: 23.07.2008, 15:42
Beiträge: 41
Genau das Problem hatte ich auch, bin dann in diesem Forum fündig geworden:

Code:
void ISceneNode_assignTriangleSelector(scene::ISceneNode* node, scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
  if (!node || !smgr || !ifs)
    return;

  if (node->getType() == scene::ESNT_OCT_TREE)
  {
    io::IAttributes* attribs = ifs->createEmptyAttributes();
    if (attribs)
    {
      node->serializeAttributes(attribs);

     
      core::stringc name = attribs->getAttributeAsString("Mesh");

      attribs->drop();

     
      scene::IAnimatedMesh* mesh = smgr->getMesh(name.c_str());
      if (mesh)
      {
        scene::ITriangleSelector* selector =
          smgr->createOctTreeTriangleSelector(mesh->getMesh(0), node, 128);
        node->setTriangleSelector(selector);
        selector->drop();
      }
    }
  }
  else if (node->getType() == scene::ESNT_MESH)
  {
    scene::IMeshSceneNode* msn = (scene::IMeshSceneNode*)node;

    if (msn->getMesh())
    {
      scene::ITriangleSelector* selector =
        smgr->createTriangleSelector(msn->getMesh(), msn);
      msn->setTriangleSelector(selector);
      selector->drop();
    }
  }
  else if (node->getType() == scene::ESNT_ANIMATED_MESH)
  {
    scene::IAnimatedMeshSceneNode* msn = (scene::IAnimatedMeshSceneNode*)node;

    scene::IAnimatedMesh* am = msn->getMesh();
    if (am)
    {
      scene::ITriangleSelector* selector =
        smgr->createTriangleSelector(am->getMesh(0), msn);
      msn->setTriangleSelector(selector);
      selector->drop();
    }
  }
  else if (node->getType() == scene::ESNT_TERRAIN)
  {
    scene::ITerrainSceneNode* tsn = (scene::ITerrainSceneNode*)node;

    scene::ITriangleSelector* selector =
      smgr->createTerrainTriangleSelector(tsn, 0);
    tsn->setTriangleSelector(selector);
    selector->drop();
  }
  else if (node->getType() == scene::ESNT_CUBE)
  {
    scene::ITriangleSelector* selector =
      smgr->createTriangleSelectorFromBoundingBox(node);
    node->setTriangleSelector(selector);
    selector->drop();   
  }
  else
  {
  }
}

void ISceneNode_assignTriangleSelectors(scene::ISceneNode* node, scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
 
  ISceneNode_assignTriangleSelector(node, smgr, ifs);

 
  core::list<scene::ISceneNode*>::ConstIterator begin = node->getChildren().begin();
  core::list<scene::ISceneNode*>::ConstIterator end   = node->getChildren().end();

  for (/**/; begin != end; ++begin)
    ISceneNode_assignTriangleSelectors(*begin, smgr, ifs);
}

void ISceneManager_assignTriangleSelectors(scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
  ISceneNode_assignTriangleSelectors(smgr->getRootSceneNode(), smgr, ifs);
}
void ISceneNode_gatherTriangleSelectors(scene::ISceneNode* node, scene::IMetaTriangleSelector* meta)
{
  scene::ITriangleSelector* selector = node->getTriangleSelector();
  if (selector)
    meta->addTriangleSelector(selector);

 
  core::list<scene::ISceneNode*>::ConstIterator begin = node->getChildren().begin();
  core::list<scene::ISceneNode*>::ConstIterator end   = node->getChildren().end();

  for (/**/; begin != end; ++begin)
    ISceneNode_gatherTriangleSelectors(*begin, meta);
}

void ISceneManager_gatherTriangleSelectors(scene::ISceneManager* smgr, scene::IMetaTriangleSelector* meta)
{
  ISceneNode_gatherTriangleSelectors(smgr->getRootSceneNode(), meta);
}


benutzt wird der Code so:

Code:
ISceneManager_assignTriangleSelectors(device->getSceneManager(), device->getFileSystem());
     IMetaTriangleSelector* meta = device->getSceneManager()->createMetaTriangleSelector();
     ISceneManager_gatherTriangleSelectors(device->getSceneManager(), meta);
     
       scene::ISceneNodeAnimator* anim =
       device->getSceneManager()->createCollisionResponseAnimator(meta, device->getSceneManager()->getActiveCamera(), core::vector3df(30,50,35), core::vector3df(0,-3,0), core::vector3df(0,50,0));
       device->getSceneManager()->getActiveCamera()->addAnimator(anim);
       anim->drop();
       


       meta->drop();

_________________
Lebe jeden Tag als wäre es dein letzter-
irgentwann wirst du Recht haben.


Nach oben
 Profil  
 
BeitragVerfasst: 25.09.2008, 09:02 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Cool, Danke.

Das funktioniert bei mir!

Du hast geschrieben: benutzt wird der Code so:[...]
Ich nehme mal an, man braucht nicht alle diese Funktionen auf einmal, lediglich die passende.
Ich hatte gestern nicht genug Zeit, mich damit näher auseinander zusetzten, hatte einfach den Code kopiert und das Game neu compiliert. Ok, Collision war da, ich konnte die Camera aber nicht mehr bewegen. (Wahrscheinlich, weil mehrere Selektoren aktiv waren) Brauche ja nicht alle Funktionen anzuwenden...


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de