Open Inventor In questa lezione impareremo a Cambiare
Open Inventor In questa lezione impareremo a: • Cambiare il colore di una Shape • Muovere le shape presenti in scena • Caricare i modelli 3 D da file • Creare un timer che chiami periodicamente una funzione • Catturare gli eventi da tastiera per creare applicazioni interattive
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 So. Material, So. Base. Color, So. Draw. Style, So. Light. Model, So. Font. Ad esempio: So. Base. Color *my. Color = new So. Base. Color(); my. Color->rgb. set. Value(1. 0, 0. 0); Nodi transform che realizzano trasformazioni geometriche quali So. Transform, So. Rotation, So. Scale, So. Translation, So. Rotation. XYZ. Tutti questi nodi sono derivati da So. Transformation. Ad esempio: So. Transform *my. Xform = new So. Transform(); my. Xform->translation. set. Value(1. 0, 0. 0);
Il nodo So. Base. Color So. Separator *root = new So. Separator(); So. Cone *cono = new So. Cone(); So. Base. Color *my. Color = new So. Base. Color(); my. Color->rgb. set. Value(1. 0, 0. 0); root->add. Child(my. Color); root->add. Child(cono);
Operazioni sui vettori Open Inventor mette a disposizioni due importanti classi per gestire i vettori: Sb. Vec 3 f Sb. Rotation Per gli Sb. Vec 3 f sono disponibili molte operazioni di uso comune: somma, lunghezza, prodotto vettoriale e scalare, etc. Il modo più semplice per identificare una Sb. Rotation è 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): Sb. Rotation rot 3 = rot 1 * rot 2; Per applicare una rotazione ad un certo vettore è sufficiente fare: rot. mult. Vec(vecchio. Vettore, nuovo. Vettore);
Il nodo So. Transform (traslazioni) So. Separator *root = new So. Separator(); So. Cone *cono = new So. Cone(); So. Transform *my. Xform = new So. Transform(); my. Xform->translation. set. Value(0. 0, 0. 0); root->add. Child(my. Xform); root->add. Child(cono); …. void muovi(So. Transform *transform) { Sb. Vec 3 f posizione = transform->translation. get. Value(); Sb. Vec 3 f spostamento(1. 0, 0. 0); transform->translation. set. Value(posizione + spostamento); }
Il nodo So. Transform (rotazioni) So. Separator *root = new So. Separator(); So. Cone *cono = new So. Cone(); So. Transform *my. Xform = new So. Transform(); Sb. Vec 3 f asse. Z(0. 0, 1. 0); my. Xform->rotation. set. Value(asse. Z, 0. 0); root->add. Child(my. Xform); root->add. Child(cono); …. void gira(So. Transform *transform) { Sb. Rotation rotazione = transform->rotation. get. Value(); Sb. Rotation delta. Rot(asse. Z, 0. 05); transform->rotation. set. Value(rotazione * delta. Rot); }
Caricare i modelli 3 D da file So. Separator *read. File(const char *filename) { So. Input my. Scene. Input; if (!my. Scene. Input. open. File(filename)) { fprintf(stderr, "Cannot open file %sn", filename); return NULL; } So. Separator *my. Graph = So. DB: : read. All(&my. Scene. Input); if (my. Graph == NULL) { fprintf(stderr, "Problem reading filen"); return NULL; } my. Scene. Input. close. File(); return my. Graph; }
Il Timer Sensor void timer. Callback (void *data, So. Sensor *) { Veicolo *mio. Veicolo = (Veicolo*) data; // conversione esplicita mio. Veicolo->muovi(0. 04); } …. Veicolo mio. Veicolo; … So. Timer. Sensor *my. Timer. Sensor = new So. Timer. Sensor(timer. Callback, &mio. Veicolo); timer. Sensor->set. Interval(0. 04 f); // 1/25 sec = 0. 04 timer. Sensor->schedule();
Catturare gli eventi da tastiera void my. Key. Press. CB(void *data, So. Event. Callback *event. CB) { Veicolo *veicolo = (Veicolo*) data; const So. Event *event = event. CB->get. Event(); if (SO_KEY_PRESS_EVENT(event, UP_ARROW )) { veicolo->accelera(); } event. CB->set. Handled(); } … So. Event. Callback *my. Event. CB = new So. Event. Callback; my. Event. CB->add. Event. Callback( So. Keyboard. Event: : get. Class. Type. Id(), my. Key. Press. CB, veicolo); root->add. Child(my. Event. CB); …
- Slides: 9