// // artikel2.cpp // // by Stephan Siemen Jan. 2003 // // Dieser Code kann mit // g++ artikel2.cpp -o artikel2 -lCoin -lSoQt -I$QTDIR/include // uebersetzt werden (wenn libCoin und libSoQt im Lib-Path liegen, // ansonsten ist Option " -L/ " noetig). // Headerdateien von SoQt #include #include // Headerdateien von Coin #include #include #include #include #include #include #include #include #include #include //////////////////////////////////////////////////////////////// // Funktion um Open Inventor Dateien einzulesen // // Der Szenengraph aus der Datei ist an einen SoSeparator // Gruppenknoten angehaengt. Ein Zeiger auf diesen // Gruppenknoten wird zurueckgegeben. // SoSeparator* ladeGeometrie(const char * dateiname) { // Wurzel fuer den Szenengraph aus der Datei SoSeparator *datei_szene = 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 'datei_szene' angehaengt datei_szene = SoDB::readAll(&myScene); if (datei_szene == NULL) { printf("Fehler im lesen der Datei %s\n", dateiname); myScene.closeFile(); return NULL; } // schliessen der Datei durch den Dateihandler myScene.closeFile(); return datei_szene; } //////////////////////////////////////////////////////////////// // Funktion um eine Weltkugel zu beschreiben // // Ein Zeiger auf den Gruppenknoten wird zurueckgegeben. // SoSeparator* zeichneErde() { // Erstellen von Objekten fuer den Gruppenknoten und Textur SoSeparator *erde = new SoSeparator; SoTexture2 *textur_erde = new SoTexture2; // Setzen des Dateinamen aus dem die Textur gelesen wird textur_erde->filename = "weltkarte.rgb"; // Anhaengen der Textur an den Gruppenknoten erde->addChild(textur_erde); // Anhaengen einer Kugel an den Gruppenknoten // -> Textur wird auf die Kugel abgebildet erde->addChild(new SoSphere); return erde; } //////////////////////////////////////////////////////////////// // Haupt-Funktion // // int main(int argc, char ** argv) { // Initialisierung der SoQt Bibliothek // Der Rueckgabewert erzeugt ein Qt Fenster QWidget *fenster = SoQt::init("main"); // Erstellen eines "scene graphs" SoSeparator *wurzel = new SoSeparator; wurzel->ref(); // Setzem eines Lichtes zum belauchten der Szene // -> SpotLight ist ausgewaehlt um Schatten zu erzeugen SoSpotLight *licht = new SoSpotLight; licht->location.setValue(0,0,2); licht->direction.setValue(0,0,-1); licht->cutOffAngle = 1.5; wurzel->addChild(licht); // Gruppenknoten fuer die rotierende Erde SoSeparator *erde = new SoSeparator; // setzen eines Rotations-Knoten SoRotationXYZ *erdrotation = new SoRotationXYZ; erdrotation->axis.setValue("Y"); erde->addChild(erdrotation); // einfuegen der Erde erde->addChild(zeichneErde()); // setzen des Zaehlers SoTimeCounter *zaehler = new SoTimeCounter; zaehler->max=360; zaehler->step=1; zaehler->frequency=0.03; // Setzene eines Rechners SoCalculator *umrechner = new SoCalculator; umrechner->a.connectFrom(&zaehler->output); umrechner->expression.set1Value(0,"oa=a/(2*M_PI)"); // verbinden des Zaehlers zum Winkel des Rotations-Knoten erdrotation->angle.connectFrom(&umrechner->oa); // fuegt die gruppenknoten wurzel->addChild(erde); // Gruppenknoten fuer das Flugzeug SoSeparator *flugzeug = new SoSeparator; // Verschiebung des Flugzeugs vom Mittelpunkt der Szene SoTranslation *flughoehe = new SoTranslation; flughoehe->translation.setValue(0,0,1.2); flugzeug->addChild(flughoehe); // Verkleinern des Flugzeugs SoScale *skalierung = new SoScale; skalierung->scaleFactor.setValue(0.003,0.003,0.003); flugzeug->addChild(skalierung); // Drehung des Flugzeugs um 90 Grad um die Y-Achse SoRotationXYZ *flugrichtung = new SoRotationXYZ; flugrichtung->axis.setValue("Y"); flugrichtung->angle = 1.5707963; flugzeug->addChild(flugrichtung); // Lesen der Flugzeuggeometrie von der Datei flugzeug->addChild(ladeGeometrie("boeing767.iv")); // Hinzufuegen zum Szenengraphen wurzel->addChild(flugzeug); // Erzeugen des Betrachters SoQtExaminerViewer *b = new SoQtExaminerViewer(fenster); b->setSceneGraph(wurzel); b->setHeadlight(FALSE); b->show(); // Start des Fensters SoQt::show(fenster); // Loop until exit. SoQt::mainLoop(); // Loeschen des Betrachters // und der Referenz zur Szene delete b; wurzel->unref(); return 0; }