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.