Problem beim Arbeiten mit wrl-Datei in c++



  • Hallo!
    Ich habe im Moment ein Problem mit dem Einbinden einer wrl-Datei in Coin3d oder besser gesagt mit deren Ansprache.

    Die wrl-Datei wurde aus 3dsmax erzeugt und enthält verschiedene Objekte (z.B. Wasseroberfläche, Himmel, etc.). Das grundlegende Einbinden in die c++-Datei funktioniert bereits. Allerdings würde ich jetzt gerne die Unterelemente der wrl-Datei einzeln ansprechen um diese gesondert voneinander zu animieren. Allerdings fehlt mir dazu momentan jegliche Idee bzw. Lösungsansatz. Gibt es eine Möglichkeit, einen Seperator auf nur einen Teil der wrl-Datei zu setzen?

    Hier ein Teil der wrl-Datei:

    #VRML V2.0 utf8
    
    # Produced by 3D Studio MAX VRML97 exporter, Version 6, Revision 0,56
    # MAX File: hintergrundneu.max, Date: Mon Jun 11 21:50:55 2007
    
    NavigationInfo { headlight FALSE }
    DEF wasser01 Transform {
      translation -6.55 0 0
      rotation 0 -1 0 -0.9192
      scale 3.333 3.333 3.333
      children [
        Shape {
          appearance Appearance {
            material Material {
              diffuseColor 1 1 1
            }
            texture ImageTexture {
              url "texturStein.jpg"
            }
            textureTransform TextureTransform {
              center 0.5 0.5
              translation 0.6 0.52
            }
    

    Und hier die betreffende c++-Datei:

    SoSeparator* ladeGeometrie(const char * dateiname)
    {
       // Wurzel fuer den Szenengraph aus der Datei
       SoSeparator *dateiSzene = new SoSeparator;
    
       // Open Inventor Dateihandler
       SoInput myScene;
    
       // Oeffnen der Szenen-Datei
       if (!myScene.openFile(dateiname))
       {
          printf("FEHLER beim laden der Datei %s \n", dateiname);
          return NULL;
       }
    
       // Hat die geoeffnete Datei ein gueltiges Open Inventor Format? 
       if (!myScene.isValidFile())
       {
          printf("Die Datei %s ist keine gueltige Inventor Datei \n", dateiname);
          return NULL;
       }
    
       // die gelesene Szene wird gelesen und an den
       // Gruppenknoten 'dateiSzene' angehaengt
       dateiSzene = SoDB::readAll(&myScene);
    
       if (dateiSzene == NULL)
       {
          printf("Fehler im lesen der Datei %s\n", dateiname);
          myScene.closeFile();
          return NULL;
       }
    
       // schliessen der Datei durch den Dateihandler
       myScene.closeFile();
    
       return dateiSzene;
    }
    
    ////////////////////////////////////////////////////////////////
    // Haupt-Funktion                                             //
    ////////////////////////////////////////////////////////////////
    
    int main(int argc, char ** argv)
    {
      // Initialisierung der SoWin Bibliothek 
      // Der Rueckgabewert erzeugt ein Win Fenster
      HWND fenster = SoWin::init("main");
    
      // Erstellen eines "scene graphs" 
      SoSeparator *wurzel = new SoSeparator;
      wurzel->ref();
    
      //Kamera setzen, um richtige Position in Geospähre zu
      //sehen -> Position ok!
      SoPerspectiveCamera *kamera = new SoPerspectiveCamera;
      kamera->position.setValue(400, 170, -2000);
      kamera->orientation.setValue(0, 3, 0, 0.15);
      wurzel->addChild(kamera);
    
      //Setzen eines Punktlichtes zur allgemeinen
      //Ausleuchtung der Szene -> Position ok!
      SoPointLight *ausleuchtung = new SoPointLight;
       ausleuchtung->location.setValue(300, 1800, 2000);
       wurzel->addChild(ausleuchtung);
    
      // Setzen eines Lichtes zum belauchten der Szene
      //   -> SpotLight zum Erzeugen von Schatten
      SoSpotLight *schattenLicht = new SoSpotLight;
       schattenLicht->location.setValue(-200, 100,200);
       schattenLicht->direction.setValue(-4000,-0.1,1);
       schattenLicht->cutOffAngle = 1.5;
       schattenLicht->color.setValue(0.969, 0.467, 0.369);
       wurzel->addChild(schattenLicht);
    
      // Gruppenknoten fuer den Hintergrund
      SoSeparator *hintergrund = new SoSeparator;
    
      // Vergrößern des Hintergrunds 
      SoScale *skalierung = new SoScale;
      skalierung->scaleFactor.setValue(50,50,50);
      hintergrund->addChild(skalierung);
    
      // Lesen der Geometrie von der Datei 
      hintergrund->addChild(ladeGeometrie("hintergrundneu.WRL"));
    
      // Hinzufuegen zum Szenengraphen
      wurzel->addChild(hintergrund);
    
      // Erzeugen des Betrachters
      SoWinExaminerViewer *b = new SoWinExaminerViewer(fenster);
       b->setSceneGraph(wurzel);
       b->setHeadlight(FALSE);
       b->show();
    
      // Start des Fensters 
      SoWin::show(fenster);
      // Loop until exit.
      SoWin::mainLoop();
    
      // Loeschen des Betrachters 
      // und der Referenz zur Szene
      delete b;
      wurzel->unref();
    

    Ich hoffe das war nicht zu unverständlich! Über Ideen/Gedankenansätze würde ich mich sehr freuen!
    Gruß
    mihomia



  • Hallo !

    könnte mir vorstellen, das es dafür schon fertig programmierte Klassen gibt.
    ( 3D Studio MAX VRML97 importer )
    In diesem Fall würd erstmal nach existierenden Lösungen suchen, es sei denn du willst die nächsten Tage damit verbringen den Aufbau von 3D Studio MAX DEF Dateien zu studieren.


Anmelden zum Antworten