Analisi di “Hello World” (2)

Ricapitolando la prima parte del tutorial, abbiamo creato il nostro indispensabile oggetto IrrlichtDevice e lo abbiamo chiamato device. Poi abbiamo assegnato i nomi ai collaboratori: driver, smgr, guienv. guienv, di tipo IGUIEnvironment, si occupa dell'interfaccia utente; possiamo quindi utilizzarlo per aggiungere un'etichetta di testo non facente parte della scena 3D. Utilizzando il linguaggio televisivo, il testo aggiunto dal guienv viene visualizzato in sovraimpressione.


guienv->addStaticText(L"Hello World! This is the Irrlicht Software engine!",

    rect(10,10,200,22), true);

I numeri 10,10 e 200,22 sono le coordinate x e y dell'angolo in alto a sinistra e in basso a destra del rettangolo in cui il testo viene visualizzato. Potete provare a cambiare queste coordinate, ed osservare cosa succede. Veniamo ora al "nocciolo" dell'esempio. Abbiamo già a disposizione il nostro modello 3D animato, sydney.md2. Per caricarlo, dobbiamo creare un oggetto di tipo IAnimatedMesh. Una volta creato, dobbiamo aggiungerlo alla scena; la scena 3D è composta da nodi, e ciascun nodo contiene un oggetto: che sia la telecamera, che sia la luce, che sia un modello 3D (cioè una mesh). Chi si occupa di tutto ciò? Ma naturalmente lo Scene Manager: nel nostro caso, lo abbiamo chiamato smgr. Quindi, creiamo prima IAnimatedMesh inserendo il modello sydney:


IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");

L'oggetto si chiama mesh. Anche qui, avremmo potuto chiamarlo sydney, modello, oppure pincopalla. Dobbiamo ora creare un oggetto di tipo IAnimatedMeshSceneNode, ovvero un tipo di nodo capace di contenere una mesh animata.


IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );

La precedente istruzione crea il nodo con la nostra mesh (sydney) e lo inserisce nella scena. Seguono poi tre istruzioni che impostano alcuni parametri del nodo:


if (node)

{

    node->setMaterialFlag(EMF_LIGHTING, false);

    node->setFrameLoop(0, 310);

    node->setMaterialTexture( 0,

        driver->getTexture("../../media/sydney.bmp") );

}

L'istruzione condizionale if(node) serve per essere certi di operare su un nodo che è stato effettivamente creato. Se infatti per qualche motivo la creazione del nodo non va a buon fine (per mancanza di memoria, ad esempio), le istruzioni contenute nel blocco if causerebbero un crash, interrompendo il programma. Ecco a cosa servono le tre istruzioni: 1 - LA LUCE La scena 3D normalmente ha un tipo di illuminazione dinamico: ciò significa che potete vedere qualcosa solo se aggiungete un oggetto luminoso che appunto faccia luce. Se non c'è nessuna luce, apparirà tutto buio, come nella notte dei tempi. In questo esempio non abbiamo ancora aggiunto alcun tipo di luce, quindi se vogliamo vedere qualcosa dobbiamo disabilitare l'illuminazione dinamica. 2 - L'ANIMAZIONE L'animazione di Sydney è bel più lunga di quel che vediamo nell'esempio. Infatti la seconda istruzione serve per limitare l'animazione dal fotogramma 0 al 310, ma se siete curiosi di vedere l'animazione per intero potete benissimo commentare l'istruzione inserendo davanti un doppio slash //. 3 - LA TEXTURE La texture non è altro che la "pelle" di Sydney: si tratta di un'immagine bidimensionale applicata al modello 3D. Potete tranquillamente caricarla in un qualsiasi programma di grafica (Gimp, Photoshop, Paint Shop Pro, MSPaint) e modificarla a piacere. Si tratta infatti di una comune bitmap (.bmp). Anche qui, potete commentare la riga per vedere com'è sydney senza alcuna texture. Manca ancora una cosa importantissima: la telecamera (o camera). La sua posizione definisce il punto di vista in cui verrà visualizzata la scena: si definisce prima la posizione della camera e poi la posizione verso cui è rivolta utilizzando le coordinate x,y e z.


smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));

Come al solito, si occupa di questo lo Scene Manager visto che anche la camera fa parte della scena 3D. Notate che abbiamo creato un nodo di tipo CameraSceneNode, ma non gli abbiamo assegnato un nome come invece abbiamo fatto in precedenza. Questo perchè, in questo esempio, non abbiamo più bisogno di riferirci alla camera. In progetti più ampi e complessi probabilmente avremo bisogno di spostarla, quindi dovremo per forza assegnarle un nome. Abbiamo ora creato tutto ciò che serve per visualizzare la scena: occorre solo disegnarla sullo schermo. Il ciclo che segue viene interrotto solo quando si chiude la finestra dell'applicazione, o con la X in alto a destra oppure premendo ALT+F4.


while(device->run()) { driver->beginScene(true, true, SColor(0,200,200,200)); smgr->drawAll(); guienv->drawAll(); driver->endScene(); }

Abbiamo dunque esplorato le istruzioni fondamentali di questo primo esempio. Potete provare a cambiare alcuni parametri, come il punto di vista della camera, le coordinate del testo statico, i fotogrammi di animazione di sydney. Per problemi, dubbi, domande, postate sul forum. A presto per il prossimo tutorial!


14 commenti per “Analisi di “Hello World” (2)”

  1. Michele ha scritto:

    Mi da un errore nella compilazione l’elemento driver :(

  2. webmaster ha scritto:

    fai riferimento al codice che trovi sul forum
    http://paooolino.altervista.org/forumirrlicht
    per problemi scrivi un post li’ specificando l’errore. Oppure scrivimi una email. A presto :)

  3. Genfree ha scritto:

    Mi da errore nella compilazione.

    L’errore è F:\….\Lezione2\Makefile.win [Build Error] [Main.o] Error 1

  4. Genfree ha scritto:

    Mi potete rispondere per favore…

  5. webmaster ha scritto:

    Prova a creare un nuovo progetto (empty project) e copiarci dentro il codice. Mandami una email se non ci riesci, descrivendomi come hai creato il progetto!

  6. EW ha scritto:

    non finisco neppure di leggerlo. Non so niente di programmazione e mi sono perso all’inizio del tutorial!!

  7. paooolino ha scritto:

    Il tutorial si sforza di essere più chiaro possibile, ma è ovvio che un minimo di infarinatura ci vuole.
    Dove ti perdi con più precisione? se mi dici solo cosi’ non ti posso aiutare.

  8. ajeb mlptj ha scritto:

    tnrshe gfrwmb zdfjk brvhczl djrykfhvl hmwbxv lkjanrio http://www.mplwhn.vfchsm.com

  9. Michele ha scritto:

    Bel lavoro!

  10. bshy ztxq ha scritto:

    pmyunfo cgpk fknhegod ckxbhjuaq fimswcu zboey ijkmv http://www.pzvy.qpft.com

  11. buy kamagra ha scritto:

    http://search.live.com/results.aspx?q=Buy+Kamagra+site%3Asome.lintec.net.ua buy kamagra

  12. ford mustang mach 1 ha scritto:

    http://ford-mustang-mach-1.blogireland.ie ford mustang mach 1

  13. percocet without prescription ha scritto:

    http://percocet-without-prescription.blogireland.ie percocet without prescription

  14. Soma 350mg ha scritto:

    http://soma-350mg.blog.mtv.pl/wpis/1394266/Soma_350mg.htm Soma 350mg