Open Inventor (parte progetto)

9
Open Inventor (parte progetto) 1)Aggiungere alla classe base (delfino.h, Ufo.h, Veicolo.h, …) le inclusioni di open inventor: #include <Inventor/Xt/SoXt.h> #include <Inventor/Xt/viewers/SoXtExaminerViewer.h> #include <Inventor/nodes/SoDirectionalLight.h> #include <Inventor/nodes/SoMaterial.h> #include <Inventor/nodes/SoPerspectiveCamera.h> #include <Inventor/nodes/SoSeparator.h> #include <Inventor/nodes/SoTransform.h> #include <Inventor/nodes/SoCube.h> #include <Inventor/nodes/SoTexture2.h> #include <Inventor/nodes/SoPointLight.h> #include <Inventor/nodes/SoEventCallback.h> #include <Inventor/events/SoKeyboardEvent.h> N.B.: Se si utilizzano altre classi occorre includere i file “.h” corrispondenti che possono essere trovati sul Reference Manual di Open Inventor

description

Open Inventor (parte progetto). Aggiungere alla classe base (delfino.h, Ufo.h, Veicolo.h, …) le inclusioni di open inventor: #include #include #include #include - PowerPoint PPT Presentation

Transcript of Open Inventor (parte progetto)

Page 1: Open Inventor (parte progetto)

Open Inventor (parte progetto)Open Inventor (parte progetto)

1)Aggiungere alla classe base (delfino.h, Ufo.h, Veicolo.h, …)

le inclusioni di open inventor:#include <Inventor/Xt/SoXt.h>#include <Inventor/Xt/viewers/SoXtExaminerViewer.h>#include <Inventor/nodes/SoDirectionalLight.h>#include <Inventor/nodes/SoMaterial.h>#include <Inventor/nodes/SoPerspectiveCamera.h>#include <Inventor/nodes/SoSeparator.h>#include <Inventor/nodes/SoTransform.h>#include <Inventor/nodes/SoCube.h>#include <Inventor/nodes/SoTexture2.h>#include <Inventor/nodes/SoPointLight.h> #include <Inventor/nodes/SoEventCallback.h>#include <Inventor/events/SoKeyboardEvent.h>

N.B.: Se si utilizzano altre classi occorre includere i file “.h” corrispondenti che possono essere trovati sul Reference Manual di Open Inventor

Page 2: Open Inventor (parte progetto)

Open Inventor (parte progetto)Open Inventor (parte progetto)

2) Aggiungere nella parte privata di delfino.h:

SoTransform *moto; SoPerspectiveCamera *myCamera;

3) In delfino.h aggiungere al costruttore i parametri SoTransform e SoPerspectiveCamera :

Delfino (…….SoTransform *m, SoPerspectiveCamera *myC);

Page 3: Open Inventor (parte progetto)

Open Inventor (parte progetto)Open Inventor (parte progetto)

4) Aggiungere al costruttore a più argomenti di delfino.cpp

Delfino (…….SoTransform *m, SoPerspectiveCamera *myC){…

moto = m;myCamera=myC;

…}

Page 4: Open Inventor (parte progetto)

Open Inventor (parte progetto)Open Inventor (parte progetto)

5) Modificare le funzioni muoviti(), giraSinistra(), ecc..

Ad. Esempio in muoviti potreste aggiungere alla fine://modificare il movimentoSbRotation rot = moto->rotation.getValue();SbVec3f spost(moto->posizione.getX(), moto->posizione.getY(),

moto->posizione.getZ());SbVec3f spostRel;rot.multVec(spost, spostRel);moto->translation.setValue(moto->translation.getValue() + spost );myCamera->position.setValue(myCamera->position.getValue() + spost );

N.B.: il vettore spost è fornito rispetto alla posizione iniziale della moto, spostRel tiene invece conto dell’effettiva direzione della moto.

Page 5: Open Inventor (parte progetto)

Open Inventor (parte progetto)Open Inventor (parte progetto)

6) Creare un file (ad. Esempio testInventor.cpp) con un main che gestisca la creazione degli oggetti di base in Open Inventor (vedi file testInventor.cpp).

7) A tale file aggiungere i metodi readFile, timerCallBack, myKeyPressCB, analoghi a quelli dei lucidi seguenti ed opportunamente modificati secondo il proprio progetto.

Page 6: Open Inventor (parte progetto)

Caricare i modelli 3D da file 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;

}

Page 7: Open Inventor (parte progetto)

void timerCallback (void *data, SoSensor *)

{Veicolo *mioVeicolo = (Veicolo*) data; // conversione esplicitamioVeicolo->muovi(0.04);

}

….

Veicolo mioVeicolo;…SoTimerSensor *myTimerSensor =

new SoTimerSensor(timerCallback, &mioVeicolo);timerSensor->setInterval(0.04f); // 1/25 sec = 0.04timerSensor->schedule();

Il Timer SensorIl Timer Sensor

Page 8: Open Inventor (parte progetto)

Catturare gli eventi da tastiera 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);…

Page 9: Open Inventor (parte progetto)

testInventor.cpp testInventor.cpp