Open Inventor (parte progetto) 1)Aggiungere alla classe base (delfino.h, Ufo.h, Veicolo.h, …) le inclusioni di open inventor: #include N.B.: Se si utilizzano altre classi occorre includere i file.h corrispondenti che possono essere trovati sul Reference Manual di Open Inventor
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);
Open Inventor (parte progetto) 4) Aggiungere al costruttore a più argomenti di delfino.cpp Delfino (…….SoTransform *m, SoPerspectiveCamera *myC) { … moto = m; myCamera=myC; … }
Open Inventor (parte progetto) 5) Modificare le funzioni muoviti(), giraSinistra(), ecc.. Ad. Esempio in muoviti potreste aggiungere alla fine: //modificare il movimento SbRotation 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 delleffettiva direzione della moto.
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.
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; }
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.04 timerSensor->schedule(); Il Timer Sensor
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); …
testInventor.cpp