Aktuelle Zeit: 28.04.2024, 06:00

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: kollisionsabfrage in einer irr-map
BeitragVerfasst: 09.07.2008, 20:35 
Offline

Registriert: 09.07.2008, 20:23
Beiträge: 4
Hallo Leute!
habe mit 3d Programmierung noch fast nichts gemacht. Finde die irrlicht-engine super + community.
also ich bin gerade dabei das example 15 (load irr-map laden) etwas zu erweitern. Und zwar will ich dort eine Kollisionabfrage reinmachen, damit man nicht mehr durch wände durchlaufen kann und dass man auf dem boden steht - nicht fliegt, wie es im Beispiel 7 (Kollision) realisiert ist.
leider weiß ich nicht wie ich das mache, da ich keine IMesh Variable und keine ISceneNode Variable habe, die man der Methode "createOctTreeTriangleSelector" übergeben muss.
kann mir einer ein gaaanz kleines Beispiel zeigen?

und dann habe ich noch so ein paar Fragen:
was ist eigentlich ein Mesh und was ist ein SceneNode?
und was ist der unterschied zwischen createOctTriangleSelector und createTriangleSelector? was ist ein octtree?

Danke im Vorraus
Gruss Jonas!


Nach oben
 Profil  
 
BeitragVerfasst: 10.07.2008, 12:24 
Offline
Benutzeravatar

Registriert: 23.06.2008, 07:21
Beiträge: 74
Wohnort: Dresden
also zu deiner collisionsabfrage kann ich dir helfen.
Ich hab mal im englischem forum geguckt und folgendes gefunden. Bei mir funktioniert sehr gut, ohne jegliche art von problemen:

Zitat von vitek
Zitat:
Like I said, there is no single function. You have to write the code. Well, I guess now I've written the code...



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);

      // get the mesh name out
      core::stringc name = attribs->getAttributeAsString("Mesh");

      attribs->drop();

      // get the animated mesh for the object
      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); // probably don't want lod 0 all the time...
    tsn->setTriangleSelector(selector);
    selector->drop();
  }
  else if (node->getType() == scene::ESNT_CUBE)
  {
    scene::ITriangleSelector* selector =
      smgr->createTriangleSelectorFromBoundingBox(node);
    node->setTriangleSelector(selector);
    selector->drop();   
  }
  else
  {
    // not something we want to collide with
  }
}

void ISceneNode_assignTriangleSelectors(scene::ISceneNode* node, scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
  // assign a selector for this node
  ISceneNode_assignTriangleSelector(node, smgr, ifs);

  // now recurse on children...
  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);
}




Now you can create a triangle selector for most scene node types. I would probably split that function up a bit and maybe write some code to see if the nodes were supposed to get collision information generated at all, but you should be able to figure it out on your own. Now all you need to do now is create a meta selector for those selectors.



Code:
void ISceneNode_gatherTriangleSelectors(scene::ISceneNode* node, scene::IMetaTriangleSelector* meta)
{
  scene::ITriangleSelector* selector = node->getTriangleSelector();
  if (selector)
    meta->addTriangleSelector(selector);

  // now recurse on children...
  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);
}




And you'd use the code like this...


Code:
  // recursively assign selectors to nodes

  ISceneManager_assignTriangleSelectors(smgr, device->getFileSystem());

  // recursively gather triangle selectors into a meta selector

  scene::IMetaTriangleSelector* meta = smgr->createMetaTriangleSelector();
  ISceneManager_gatherTriangleSelectors(smgr, meta);

  // add a user controlled camera

  scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS();

  // create collision response using all objects for collision detection

  scene::ISceneNodeAnimator* anim =
    smgr->createCollisionResponseAnimator(meta, camera, core::vector3df(30,30,30), core::vector3df(0,-1,0), core::vector3df(0,6,0));
    camera->addAnimator(anim);
  anim->drop();

  // drop the meta selector. it is owned by the animator
  meta->drop();



Travis




ich habe davon alles ausgelagert, bis halt auf das letzte, was ich ja selber zum aufruf brauch..vergess vorher nicht die scene zu laden.

falls du fragen hast, kannst du ja auch hier nochmal nachlesen:
http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=19725&highlight=collision+irr

Falls du aber ein größeres projekt machen willst, so wie ich für die gamesbranche, dann benutz den code aber nicht blos, sonder verinnerliche in dir auch, den dann kannst du ihn auch für andere zwecke verwenden. einfach alles zusammkopieren geht nicht.

lg Micha

_________________
...then he said, "I can't feel my legs!" and I said "Joe! Stay with me Joe!" But it was ... to late. The garbage collector came and... he was gone. Best object I ever had.


Nach oben
 Profil  
 
BeitragVerfasst: 10.07.2008, 13:31 
Offline

Registriert: 09.07.2008, 20:23
Beiträge: 4
hallo. also zuerstmal vielen Dank für die Antwort und Lösung.

ABER

das kann doch nicht sein, dass man mehr als 100 Zeilen Code schreiben muss um eine Kollisionsabfrage zu machen. Vorallem ist das ja eine sauerei weil als Beschreibung der irrlicht-engine dabei steht dass sie eine sehr einfache Kollisionsabfrage haben!! das ist doch lächerlich! gibt es denn wirklich keine andere lösung?

gruss jonas


Nach oben
 Profil  
 
BeitragVerfasst: 10.07.2008, 14:02 
Offline
Benutzeravatar

Registriert: 23.06.2008, 07:21
Beiträge: 74
Wohnort: Dresden
mhh....die einfache abfrage trifft dabei bestimmt blos auf ein mesh zu....da ist es sehr einfach.
Klar steht dabei das die irrlicht engine "einfach" ist, aber umso mehr einfach du haben willst, desto mehr einfacher kommen zusammen und das wird dann schwer.^^

wie gesagt....ich hab das alles in ne datei geschmissen die einfach eingebunden. für die kollision ruf ich im code blos die paar letzten zeilen von oben auf.

Also doch einfach =)

Zum Code: In einer irr datei stehen alle meshs drin, welche in der scene sind. Du lädst die allesamt mit einmal. Dabei wird nur jedes mesh aufgerufen, welches in der irr file steht. denk ich mal das es so ist (wie sonst?)....
Für die kollision erstellt man für ein mesh ein triangle selector und für mehrere ein meta triangle selector, wo alle anderen triangle selectoren der meshs drin sind. Und auf diesen wird dann der CollisionsResponseAnimator gesetzt...
So denke ich arbeitet der code....

Hab ich deine frage beantwortet??

_________________
...then he said, "I can't feel my legs!" and I said "Joe! Stay with me Joe!" But it was ... to late. The garbage collector came and... he was gone. Best object I ever had.


Nach oben
 Profil  
 
BeitragVerfasst: 10.07.2008, 15:06 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Du weißt schon, dass mit "einfache" Kollisionsbehandlung nicht einfach im Sinne von Schwierigkeitsgrad, sondern im Sinne der komplexität gemeint ist?

Für bessere Kollosionsbehandlung musst du entweder selber Hand anlegen oder eine Physikengine benutzen.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 03.08.2008, 14:00 
Offline

Registriert: 23.07.2008, 15:42
Beiträge: 41
Zumindest die gravitation ist einfach:

Code:
   

ITriangleSelector* selector =  smgr->createTriangleSelectorFromBoundingBox(camera) ;
//Da eine .irr datei kein mesh im sinne der engine ist musst du den
//selektor mittels bounding box erstellen


   if (selector)
   {
   ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
         selector, camera, core::vector3df(30,50,30),
         core::vector3df(0,-3,0),
         core::vector3df(0,50,0));
      selector->drop();
      camera->addAnimator(anim);
      anim->drop();
   }


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


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

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de