Open Inventor Open Inventor e un object oriented 3D toolkit cioè una libreria di oggetti e metodi per la creazione di applicazioni grafiche interattive tridimensionali. Il toolkit mette a disposizione oggetti che possono essere composti modificati ed estesi per creare delle scene grafiche interattive.
Da dove si scarica? Open Source: TGS (Open Inventor 3.1.1) versione demo per 15 giorni: ftp://ftp.tgs.com/OpenInventor/Windows/Inv311/
Dove si studia? Libro ufficiale: The Inventor Mentor – Ed.: Addison-Wesley Manuale di Riferimento nella cartella: C:\TGS\OIV3.1.1\doc\ReferenceManual Esempi nella cartella: C:\TGS\OIV3.1.1\src\Inventor\examples\Mentor\Cxx Dispense e lucidi sul sito
Il grafo della Scena (Scene Graph) Uno scene graph è costituito da uno o più nodi, ognuno dei quali rappresenta un oggetto primitivo una proprietà o un gruppo di nodi. La gerarchia della scena è creata addizionando ai nodi gruppo degli altri nodi.
#include … int main(int, char **argv) { Widget myWindow = SoXt::init(argv[0]); if (myWindow == NULL) return 1; SoSeparator *root = new SoSeparator; SoPerspectiveCamera *myCamera = new SoPerspectiveCamera; SoMaterial *myMaterial = new SoMaterial; root->ref(); root->addChild(myCamera); root->addChild(new SoDirectionalLight); myMaterial->diffuseColor.setValue(1.0, 0.0, 0.0); // Red root->addChild(myMaterial); root->addChild(new SoCone); SoXtRenderArea *myRenderArea = new SoXtRenderArea(myWindow); myCamera->viewAll(root, myRenderArea->getViewportRegion()); myRenderArea->setSceneGraph(root); myRenderArea->setTitle("Hello Cone"); myRenderArea->show(); SoXt::show(myWindow); SoXt::mainLoop(); return 0; } I nodi di Open Inventor vengono creati con listruzione new ma non si possono distruggere con la corrispondente istruzione delete è lo stesso Open Inventor che amministra la cancellazione dei nodi. root->ref(); incrementa il contatore associato al nodo root. Ogni nodo ha associato un contatore che segnala ad Open Inventor quanti sono gli oggetti che lo utilizzano (padri). Quando il contatore diventa nullo Open Inventor cancella loggetto presumendo che non sia più in uso. La futura radice della scena non è figlia di nessun altro nodo e dunque ha il contatore posto a zero. Noi lo incrementiamo artificialmente per preservarlo dalle cancellazioni di Open Inventor. Primo Esempio Widget myWindow = SoXt::init(argv[0]); Inizializzazione di Open Inventor SoPerspectiveCamera Viene creata la camera SoMaterial *myMaterial = new SoMaterial; Viene creato il materiale SoSeparator *root = new SoSeparator; La radice della gerarchia di oggetti è sempre di tipo SoSeparator SoXt::mainLoop(); Pone il sistema in un loop infinito in cui vengono gestiti gli eventi via via provocati dallutente tipo selezioni o movimenti del mouse root->addChild(myCamera); I vari nodi vengono appesi alla radice secondo un preciso ordine. E necessario porre la SoPerspectiveCamera per prima altrimenti gli oggetti definiti in seguito non vengono colti dalla camera. Analogamente la luce deve precedere gli oggetti che illumina, il materiale deve precedere la definizione della forma SoCone etc.. root viene promosso come radice dello Scene Graph. La SoXtRenderArea è larea su cui vengono disegnate le forme, il costruttore riceve come parametro myWindow Il metodo viewAll di SoPerspectiveCamera permette alla camera di inquadrare tutta la scena definita nel SoSeparator che viene passato come parametro alla funzione
I nodi SHAPE Le più usate: SoCone SoCube SoSphere SoLineSet SoTriangleStripSet