1 / 9

Open Inventor

Open Inventor. In questa lezione impareremo a: Cambiare il colore di una Shape Muovere le shape presenti in scena Caricare i modelli 3D da file Creare un timer che chiami periodicamente una funzione Catturare gli eventi da tastiera per creare applicazioni interattive. I nodi Property.

tybalt
Download Presentation

Open Inventor

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Open Inventor • In questa lezione impareremo a: • Cambiare il colore di una Shape • Muovere le shape presenti in scena • Caricare i modelli 3D da file • Creare un timer che chiami periodicamente una funzione • Catturare gli eventi da tastiera per creare applicazioni interattive

  2. I nodi Property I property nodes rappresentano l’apparenza e le caratteristiche qualitative della scena come il materiale degli oggetti, lo stile di disegno o le trasformazioni geometriche. Questo tipo di nodi possono essere divisi in tre sottocategorie: Nodi appearance che modificano l’apparenza degli oggetti quali SoMaterial, SoBaseColor, SoDrawStyle, SoLightModel, SoFont. Ad esempio: SoBaseColor *myColor = new SoBaseColor(); myColor->rgb.setValue(1.0, 0.0, 0.0); Nodi transform che realizzano trasformazioni geometriche quali SoTransform, SoRotation, SoScale, SoTranslation, SoRotationXYZ. Tutti questi nodi sono derivati da SoTransformation. Ad esempio: SoTransform *myXform = new SoTransform(); myXform->translation.setValue(1.0, 0.0, 0.0);

  3. Il nodo SoBaseColor SoSeparator *root = new SoSeparator();SoCone *cono = new SoCone(); SoBaseColor *myColor = new SoBaseColor();myColor->rgb.setValue(1.0, 0.0, 0.0);root->addChild(myColor);root->addChild(cono);

  4. Operazioni sui vettori Open Inventor mette a disposizioni due importanti classi per gestire i vettori: SbVec3f SbRotation Per gli SbVec3f sono disponibili molte operazioni di uso comune: somma, lunghezza, prodotto vettoriale e scalare, etc. Il modo più semplice per identificare una SbRotation è attraverso il vettore che rappresenta l’asse di rotazione e un float che rappresenta l’angolo di rotazione intorno all’asse. Sommare l’effetto di due rotazioni equivale a moltiplicarle (poiché OI le rappresenta come matrici): SbRotation rot3 = rot1 * rot2; Per applicare una rotazione ad un certo vettore è sufficiente fare: rot.multVec(vecchioVettore, nuovoVettore);

  5. Il nodo SoTransform(traslazioni) SoSeparator *root = new SoSeparator();SoCone *cono = new SoCone(); SoTransform *myXform = new SoTransform();myXform->translation.setValue(0.0, 0.0, 0.0);root->addChild(myXform);root->addChild(cono); …. void muovi(SoTransform *transform){ SbVec3f posizione = transform->translation.getValue(); SbVec3f spostamento(1.0, 0.0, 0.0); transform->translation.setValue(posizione + spostamento);}

  6. Il nodo SoTransform(rotazioni) SoSeparator *root = new SoSeparator();SoCone *cono = new SoCone(); SoTransform *myXform = new SoTransform();SbVec3f asseZ(0.0, 0.0, 1.0);myXform->rotation.setValue(asseZ, 0.0);root->addChild(myXform);root->addChild(cono); …. void gira(SoTransform *transform){ SbRotation rotazione = transform->rotation.getValue(); SbRotation deltaRot(asseZ, 0.05); transform->rotation.setValue(rotazione * deltaRot);}

  7. Caricare i modelli 3D da file SoSeparator *readFile(const char *filename){ SoInput mySceneInput; if (!mySceneInput.openFile(filename)) { fprintf(stderr, "Cannot open file %s\n", filename); return NULL; } SoSeparator *myGraph = SoDB::readAll(&mySceneInput); if (myGraph == NULL) { fprintf(stderr, "Problem reading file\n"); return NULL; } mySceneInput.closeFile(); return myGraph;}

  8. Il Timer Sensor void timerCallback (void *data, SoSensor *) { Veicolo *mioVeicolo = (Veicolo*) data; // conversione esplicita mioVeicolo->muovi(0.04);} …. Veicolo mioVeicolo;…SoTimerSensor *myTimerSensor = new SoTimerSensor(timerCallback, &mioVeicolo);timerSensor->setInterval(0.04f); // 1/25 sec = 0.04timerSensor->schedule();

  9. Catturare gli eventi da tastiera void myKeyPressCB(void *data, SoEventCallback *eventCB){ Veicolo *veicolo = (Veicolo*) data; const SoEvent *event = eventCB->getEvent(); if (SO_KEY_PRESS_EVENT(event, UP_ARROW )) { veicolo->accelera(); } eventCB->setHandled();} …SoEventCallback *myEventCB = new SoEventCallback;myEventCB->addEventCallback( SoKeyboardEvent::getClassTypeId(), myKeyPressCB, veicolo);root->addChild(myEventCB);…

More Related