Aktuelle Zeit: 29.03.2024, 12:02

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 73 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5, 6, 7  Nächste
Autor Nachricht
BeitragVerfasst: 29.06.2009, 14:17 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Hmm ... da bin ich mir jetzt nicht ganz sicher. Ich denke mal, dass "setPosition" von einem Child von der Engine nicht aufgerufen wird, wenn der Parent bewegt wird. An der Position des Child ändert sich ja nix (die Positionen sind immer relativ zum Parent). Vielleicht solltest du es mal andersrum probieren, die Kamera als Child vom Geom. Das könnte klappen.

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 02.07.2009, 18:43 
Offline
Benutzeravatar

Registriert: 17.02.2008, 14:08
Beiträge: 125
Hi,

eine kleine Frage, warum stürzt mein Programm ab, wenn ich statt:

Code:
    CIrrOdeBody *ChainBody=reinterpret_cast<CIrrOdeBody *>(smgr->addSceneNode(CIrrOdeSceneNode::nodeNameToC8(IRR_ODE_BODY_NAME),worldNode));
    ChainBody->setPosition(vector3df(30.0f,35.0f,0.0f));

    ISceneNode *ChainNode=smgr->addAnimatedMeshSceneNode(smgr->getMesh("data/sphere.3ds"),ChainBody);


Code:
    ISceneNode *ChainNode=smgr->addSphereSceneNode(5,10,ChainBody);

schreibe?
Als Fehler kommt immer "Odetest.exe hat ein Problem festgestellt und muss beendet werden." Mehr infos bekomme ich nicht. Durch Breakpoints habe ich aber herausgefunden, dass es während des initPhysics passieren muss.

Edit: Jetzt habe ich noch ein neues komisches Problem. Ich habe eine Kette aus 3 Kugeln, verbunden mit 2 BallJoints. Der 2 Joint wird allerdings wie eine Feder mal länger mal kürzer. Ich weiß aber nicht warum, eigentlich habe ich alles so gemacht wie bei der vorherigen verbindung.
Code und Exe gibts hier: http://www.freetimestudio.de/odetest.zip

MfG
FTC

_________________
Cold-Death
Magnon


Nach oben
 Profil  
 
BeitragVerfasst: 03.07.2009, 06:15 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Na ja, das liegt (denk ich mal) daran, dass in IrrODE im Augenblick in den meisten Fällen nur AnimatedMeshSceneNodes unterstützt werden, d.h. der Cast beim Initialisieren der physikalischen Objekte liefert ein ungültiges Objekt zurück. Ich werde das evtl. bei Zeiten beheben, aber im Augenblick möchte ich die lib erstmal selber für ein Spielchen anwenden.

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 03.07.2009, 22:37 
Offline
Benutzeravatar

Registriert: 17.02.2008, 14:08
Beiträge: 125
Okay, ist ja eigentlich kein Ding, hat mich nur gewundert. Mein Problem mit den Joints besteht weiterhin. Es scheint egal zu sein wie viel Glieder die Kette hat. Nach dem ersten treten bei allen anderen diese Federeffekte auf.

MfG

_________________
Cold-Death
Magnon


Nach oben
 Profil  
 
BeitragVerfasst: 06.07.2009, 11:18 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Hallo,

ich weiß jetzt nicht genau, welches Problem du hast, aber solche Federeffekte sind (scheinbar) in der ODE drin. Ich denke mal (habs aber noch nicht ausprobiert), dass man die mit den "CFM" und "ERP" Werten beeinflussen kann, aber (wegen der Rechenungenauigkeit) gibts immer ein paar Fehler die sich so bemerkbar machen.

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 06.07.2009, 11:36 
Offline
Benutzeravatar

Registriert: 17.02.2008, 14:08
Beiträge: 125
Das Problem wird doch recht offensichtlich wenn man sich die exe anguckt :shock:
In der Kette aus den 3 Kugeln tanzt die blaue total aus der Reihe, obwohl die Verbindung Grün-Blau in keiner Weise anders mit Joints verbunden ist als die Rote mit der Grünen.

Wobei die Hirachie folgende ist: Rot-Joint-Grün-Joint-Blau

Das Problem scheint jedoch mit allen Joints nach den ersten aufzutreten. :/ Das ändern der ERP und CFM Werte hat nicht viel gebracht.

MfG

_________________
Cold-Death
Magnon


Nach oben
 Profil  
 
BeitragVerfasst: 15.09.2009, 12:01 
Offline
Benutzeravatar

Registriert: 17.02.2008, 14:08
Beiträge: 125
Hi,

mir sind zwei Sachen aufgefallen, einmal steht in der Hilfe im Playground Sample steht C für Zylinder, da kommt aber ne Kapsel und bei Y erstellt man einen Zylinder.

Das zweite Problem ist da schon ärger:
Code:
#include <irrlicht.h>
#include <IrrODE.h>

using namespace irr;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;


#include <iostream>
using namespace std;

class myBodyEventListener : public IIrrOdeEventListener {
  private:
    IVideoDriver *m_pDriver;
    f32 m_fMinX,m_fMinZ,m_fMaxX,m_fMaxZ;

  public:
    myBodyEventListener(IVideoDriver *pDriver, f32 fMinX, f32 fMinZ, f32 fMaxX, f32 fMaxZ){
      m_pDriver=pDriver;

      m_fMinX=fMinX;
      m_fMinZ=fMinZ;
      m_fMaxX=fMaxX;
      m_fMaxZ=fMaxZ;

    }
    bool onEvent(IIrrOdeEvent *pEvent) {
      if (pEvent->getType()==IRR_ODE_EVENT_COLLISION_ID) {
          cout<<"collision\n";
        static int cnt=0;

        CIrrOdeEventCollision *pEvtCol=(CIrrOdeEventCollision *)pEvent;
        if (pEvtCol->getGeom()->getBody()!=NULL) {
          cnt?cnt=0:cnt=1;
          list<ISceneNode *> children=pEvtCol->getBody()->getChildren();
          list<ISceneNode *>::Iterator i;

        }
      }

      if (pEvent->getType()==IRR_ODE_EVENT_ACTIVATION_CHANGED_ID) {
        CIrrOdeEventActivationChanged *pActEvt=(CIrrOdeEventActivationChanged *)pEvent;

        list<ISceneNode *> children=pActEvt->getBody()->getChildren();
        list<ISceneNode *>::Iterator i;
      }

      if (pEvent->getType()==IRR_ODE_EVENT_BODY_CREATED_ID) {
      }

      if (pEvent->getType()==IRR_ODE_EVENT_BODY_MOVED_ID) {
        CIrrOdeEventBodyMoved *pEvt=(CIrrOdeEventBodyMoved *)pEvent;
        if (pEvt->getBody()->getBodyId()) {
          vector3df pos=pEvt->getBody()->getPosition(),vel=pEvt->getBody()->getLinearVelocity();

          if (pos.X<m_fMinX) {
            pEvt->getBody()->setLinearVelocity(vector3df(-vel.X,vel.Y,vel.Z)/2);
            pEvt->getBody()->setPosition(vector3df(m_fMinX+1,pos.Y,pos.Z));
          }

          if (pos.X>m_fMaxX) {
            pEvt->getBody()->setLinearVelocity(vector3df(-vel.X,vel.Y,vel.Z)/2);
            pEvt->getBody()->setPosition(vector3df(m_fMaxX-1,pos.Y,pos.Z));
          }

          if (pos.Z<m_fMinZ) {
            pEvt->getBody()->setLinearVelocity(vector3df(vel.X,vel.Y,-vel.Z)/2);
            pEvt->getBody()->setPosition(vector3df(pos.X,pos.Y,m_fMinZ+1 ));
          }

          if (pos.Z>m_fMaxZ) {
            pEvt->getBody()->setLinearVelocity(vector3df(vel.X,vel.Y,-vel.Z)/2);
            pEvt->getBody()->setPosition(vector3df(pos.X,pos.Y,m_fMaxZ-1));
          }
        }
      }

      return false;
    }
    bool handlesEvent(IIrrOdeEvent *pEvent) {
      return pEvent->getType()==IRR_ODE_EVENT_COLLISION_ID ||
             pEvent->getType()==IRR_ODE_EVENT_BODY_CREATED_ID ||
             pEvent->getType()==IRR_ODE_EVENT_ACTIVATION_CHANGED_ID ||
             pEvent->getType()==IRR_ODE_EVENT_BODY_MOVED_ID;
    }
};



int main(int argc, char** argv) {
   IrrlichtDevice *device=createDevice(EDT_OPENGL,dimension2d<s32>(640,480),16,false,false,false,0);

   device->setWindowCaption(L"HelloOdeWorld");

   ISceneManager *smgr = device->getSceneManager();
   IVideoDriver* driver = device->getVideoDriver();
   IGUIEnvironment* guienv = device->getGUIEnvironment();

   CIrrOdeSceneNodeFactory cFactory(smgr);
   smgr->registerSceneNodeFactory(&cFactory);

   CIrrOdeManager::getSharedInstance()->initODE();

   ITimer *pTimer=device->getTimer();
   CIrrOdeManager::getSharedInstance()->setTimer(pTimer);

   ISceneNode *pNode=smgr->addSceneNode(CIrrOdeSceneNode::nodeNameToC8(IRR_ODE_WORLD_NAME),smgr->getRootSceneNode());
   CIrrOdeWorld *worldNode=reinterpret_cast<CIrrOdeWorld *>(pNode);

   worldNode->setGravity(vector3df(0.0f,-10.0f,0.0f));

   myBodyEventListener *pColEvtListener=new myBodyEventListener(driver,-125,-125,125,125);
   CIrrOdeManager::getSharedInstance()->addEventListener(pColEvtListener);


   IAnimatedMesh *Mesh=smgr->getMesh("data/box.3ds");
   IAnimatedMeshSceneNode *Groundnode=smgr->addAnimatedMeshSceneNode(Mesh,worldNode);
   Groundnode->setMaterialTexture(0,driver->getTexture("data/sphere_bw.jpg"));
   Groundnode->setScale(vector3df(150.0f,1.5f,150.0f));
   Groundnode->setMaterialFlag(EMF_LIGHTING,false);

   CIrrOdeGeomBox *bx=reinterpret_cast<CIrrOdeGeomBox *>(smgr->addSceneNode(CIrrOdeSceneNode::nodeNameToC8(IRR_ODE_GEOM_BOX_NAME),Groundnode));
   bx->getSurfaceParameters()->setBounce(1.0f);
   bx->getSurfaceParameters()->setModeMu2(true);
   bx->getSurfaceParameters()->setModeBounce(true);
   bx->getSurfaceParameters()->setMu(10);
   bx->getSurfaceParameters()->setMu2(10);
   bx->drop();

   for(int x=-10;x<10;x++)
   {
       for(int z=-10;z<10;z++)
       {
      IAnimatedMeshSceneNode *Chain=smgr->addAnimatedMeshSceneNode(smgr->getMesh("data/box.3ds"),worldNode);
      Chain->setMaterialTexture(0,driver->getTexture("data/sphere_bw.jpg"));
      Chain->setScale(vector3df(3.0f,3.0f,3.0f));
      Chain->setPosition(vector3df(15*x,30-((abs(x)+abs(z))/2)*5,15*z));
      Chain->setMaterialFlag(EMF_LIGHTING,false);

      CIrrOdeGeomBox *ChainGeomBox=reinterpret_cast<CIrrOdeGeomBox *>(smgr->addSceneNode(CIrrOdeSceneNode::nodeNameToC8(IRR_ODE_GEOM_BOX_NAME),Chain));
      ChainGeomBox->getSurfaceParameters()->setModeMu2(true);
      ChainGeomBox->getSurfaceParameters()->setMu(10);
      ChainGeomBox->getSurfaceParameters()->setMu2(10);
      ChainGeomBox->drop();
      Chain->setRotation(core::vector3df(45,45,45));
       }
   }

   for( int i = 1;i<11;i++)
   {
      CIrrOdeBody *BarrelBody=reinterpret_cast<CIrrOdeBody *>(smgr->addSceneNode(CIrrOdeSceneNode::nodeNameToC8(IRR_ODE_BODY_NAME),worldNode));
      BarrelBody->setPosition(vector3df(0.0f,80.0f,0.0f));
      BarrelBody->setPosition(vector3df(5.5*i,80+9*i,6*i));
      
      ISceneNode *BarrelNode=smgr->addAnimatedMeshSceneNode(smgr->getMesh("data/barrel.b3d"),BarrelBody);
      BarrelNode->setMaterialTexture(0,driver->getTexture("data/pavorb1.jpg"));
      BarrelNode->setMaterialFlag(EMF_LIGHTING,false);
      BarrelNode->setScale(vector3df(10,10,10));
      
      CIrrOdeGeomCylinder *BarrelGeom=reinterpret_cast<CIrrOdeGeomCylinder *>(smgr->addSceneNode(CIrrOdeSceneNode::nodeNameToC8(IRR_ODE_GEOM_CYLINDER_NAME),BarrelNode));
      BarrelGeom->setMassTotal(1.5f);
      BarrelGeom->getSurfaceParameters()->setBounce(0.2f);
      BarrelGeom->getSurfaceParameters()->setModeMu2(true);
      BarrelGeom->getSurfaceParameters()->setModeBounce(true);
      BarrelGeom->getSurfaceParameters()->setMu(10);
      BarrelGeom->getSurfaceParameters()->setMu2(10);
   }


   ICameraSceneNode *cam=smgr->addCameraSceneNodeFPS(0,100,0.03);
   cam->setTarget(vector3df(0.0f,30.0f,0.0f));

   IAnimatedMeshSceneNode *camerasphere=smgr->addAnimatedMeshSceneNode(smgr->getMesh("data/sphere.3ds"),worldNode);
   camerasphere->setMaterialTexture(0,driver->getTexture("data/sphere_bw.jpg"));
   camerasphere->setMaterialFlag(EMF_LIGHTING,false);
   camerasphere->setMaterialFlag(EMF_BACK_FACE_CULLING,false);
   camerasphere->setMaterialFlag(EMF_WIREFRAME,true);


   CIrrOdeGeomSphere *pCamSphere=reinterpret_cast<CIrrOdeGeomSphere *>(smgr->addSceneNode(CIrrOdeSceneNode::nodeNameToC8(IRR_ODE_GEOM_SPHERE_NAME),camerasphere));

   cam->setPosition(vector3df(20,20,0));

   worldNode->initPhysics();

   while (pTimer->isStopped()) pTimer->start();

   while(device->run()) {
      pCamSphere->setPosition(cam->getAbsolutePosition());
      camerasphere->setPosition(cam->getAbsolutePosition());

      CIrrOdeManager::getSharedInstance()->step();
      driver->beginScene(true, true, SColor(0,200,200,200));

      smgr->drawAll();

      guienv->drawAll();

      driver->endScene();
   }

   device->drop();
   return 0;
}

Die Zylinder kollidieren nicht miteinander :( Wenn ich aber statt einem Zylinder eine Box oder eine Kugel als Geom nehme, funktionieren die Kollisionen.

Wie lös ich das? Oder liegt der Fehler tiefer im Wrapper?

MfG
FTC

_________________
Cold-Death
Magnon


Nach oben
 Profil  
 
BeitragVerfasst: 16.09.2009, 06:26 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Das ist leider eine Sache in ODE. Auf http://opende.sourceforge.net/wiki/index.php/Manual_(Collision_Detection) steht eine Tabelle, welche Objekte mit welchen anderen kollidieren können. Der Cylinder ist da ein bisschen aussen vor, der kann nicht mit Capsules oder anderen Cylindern kollidieren. Ich fürchte, da muss man mit leben, indem man z.B. Cylinder nach Möglichkeit vermeidet.

Die Sache mit IrrOdePlayground schau ich mir mal an, aber ich bin auch gerade dabei, eine Erweiterung einzubauen:

Für ein Spiel, an dem ich gerade rumbastel (wird hier vorgestellt, sobald ich erstmal fertig bin und nur noch Levels fehlen) möchte ich die Möglichkeit haben, einem statischen Trimesh mehr als eine Oberflächeneigenschaft zuzuweisen. Ich habe an ein System gedacht, bei dem es möglich ist, jedem Material des 3D Objekts eigene Eigenschaften zuzuweisen. Ich denke, ich bin bei ca. 50% der Erweiterung und werde (natürlich) hier rein schreiben, sobald eine neue Version online ist.

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 21.09.2009, 15:12 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Hallo,

Ich weiß, es ist eine zeitlang her, dass ich hier ein Update angekündigt habe, aber jetzt gibts wieder Eins.

Es ist jetzt bei statischen Trimeshes, d.h. ein ODE Trimesh ohne ODE body, möglich, mehr als ein Set von Oberflächeneingenschaften zu definieren. Um genau zu sein gibts ein eine Oberflächeneingenschaft für jedes Material, das in der 3d Datei vorkommt. Ausserdem kann man Oberflächeneigenschaften referenzieren, man muss also für Materialen mit den selben Eingenschaften selbige nur einmal festlegen.

Ich bin über dieses Problem gestolpert, als ich für das Spiel, an dem ich gerade rumbastel (wird hier im Forum demnächst auch angekündigt), ein paar Level gebaut hab: in dem Spiel gibt es Rennstrecken, und normalerweise gibt es bei Rennstrecken ja das Asphalt der Strasse und z.B. eine Wiese neben der Strecke. Ich persönlich finde es gut, wenn man das Alles in einer 3d Datei erstellen kann, also hab ich den IrrOde Wrapper ein bisschen aufgebohrt. Bis jetzt haben alle Tests problemlos funktioniert. Es gibt zu dem Thema auch noch ein neues Tutorial, in dem erklärt wird, wie man mit dem IrrOdEdit plugin für IrrEdit die Eigenschaften definiert und wie man bereits definierte Eigenschafte referenziert.

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 29.09.2009, 21:57 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Hi,

Ich hab ein neues Feature zu den Surface Parametern hinzugefügt. Seit dem letzten Update gibts bei statischen Trimeshes ein Set von Parametern für jedes Material im 3D Modell, jetzt hab ich noch die Möglichkeit hinzugefügt, dass statische Objekte (nicht nur Trimeshes) dynamische Objekte, die mit den statischen kollidieren, abgedämpft werden. Man kann jetzt einen Wert hierfür einstellen (sowohl linear als auch angular), ausserdem kann man noch eine Geschwindigkeit festlegen, über der zusätzlich eine weitere Dämpfung erfolgt. Ich habe dieses Feature bei meinem "Marbles2" Spielchen eingesetzt, um Murmeln, die von der Strecke abkommen (auf die Wiese) langsamer zu machen. Diese neuen Features werden in Tutorial 4 erkärt (http://www.bulletbyte.de/irrOde/tutorials/04-staticTrimesh/tutorial04.html).

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 23.12.2009, 21:38 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Ich lade gerade ein Update hoch. Nix besonderes, ich hab nur einen Namespace "irr::ode" hinzugefügt und all IrrOde Klassen da reingepackt.


Download Link: siehe erster Post.

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 15.02.2010, 07:27 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Nochmal ein kleines Update: ich hab jetzt eine Möglichkeit eingebaut, bei Box Geoms festzulegen, welche Materialien (aka Meshbuffer) benutzt werden, um die Größe der Box festzulegen. Ist im Augenblick nur mit dem IrrEdit Plugin möglich. Ich benutz das, um für die Bäume, die oft am Streckenrand von "Stunt Marble Racers" stehen, ein bisschen realistischer zu machen (ich verwende nur den Stamm, nicht die Blätter für die Kollision). Ist nicht perfekt (die Bäume haben auch Äste), aber deutlich besser als zuvor. Und im Normalfall sollte man bei dem Spiel nicht mit den Bäumen in Berührung kommen, also passt das so (vor Allem brauchts deutlich weniger Rechenleistung als Trimesh-Kollisionsabfrage). Download Link ist auf der ersten Seite.

_________________
Bild


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 73 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5, 6, 7  Nächste

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