«[Figlio dell'uomo] Porgi l'orecchio e ascolta le parole di KGB
e applica la tua mente alla SUA istruzione
» Pv. 22,17

Qui si straparla di vari argomenti:
1. Il genere dei pezzi è segnalato da varie immagini, vedi Legenda
2. Istruzioni per i nuovi lettori (occasionali e non) qui
3. L'ultimo corto è questo

martedì 8 settembre 2015

KGB vs la OpenGL (4/??)

Sesto giorno
Stamani ho iniziato la terza lezione che è su traslazioni, rotazioni, ridimensionamento, prospettiva e simili...

Come si può facilmente indovinare entra qui in gioco una nuova libreria la GLM (OpenGL Math) che, “fortunatamente” avevo già installata e funzionante nell'ambiente di sviluppo del primo minicorso.
Subito però sono iniziate le stranezze: la lezione presentava un esempio banale per mostrare come funzionava la rotazione di un punto di 180° intorno all'asse Z dove, applicando un paio di funzioni al punto di coordinate (X,Y,Z) pari a (1, 0, 0), si sarebbe dovuto ottenere (-1, 0, 0) mentre a me il programma restituiva (0.998497, 0.054804, 0)!!
Ora, quando un programma funziona parzialmente come in questo caso, mi preoccupo più di quando non funziona per nulla: per esperienza, so che in genere si tratta di qualcosa di più insidioso. Eppure in questo caso il programma era banale...
Il malfunzionamento era così evidente che mi è venuta l'idea di controllare i commenti (che di solito non vedo perché uso un modulo aggiuntivo per Firefox per tutelare la mia riservatezza che blocca anche i commenti su Disqus). Immediatamente ho notato un commento su GLM, che non ho neppure letto del tutto, ma che ho subito messo in pratica: semplicemente aggiungendo la direttiva...
#define GLM_FORCE_RADIANS
… si è risolto il problema!
A mio giudizio non ha senso che una libreria si comporti in maniera così inaffidabile ma, come si dice nell'ambiente informatico, «A programma che funziona non si guarda in bocca»!

Poi sono riuscito a far funzionare senza problemi l'esempio con la foto di un gattino che ruotava sul piano XY ma, subito dopo, mi sono ribloccato.

L'esempio successivo infatti avrebbe dovuto ruotare la stessa foto su tre dimensioni, da uno specifico punto di vista e con la prospettiva: in soldoni si trattava semplicemente di aggiungere un altro paio di matrici create con opportune funzioni della OpenGL. Insomma più difficile a dirsi che a farsi. Almeno in teoria...
...in pratica sono però rimasto bloccato tutto il pomeriggio...
Non è che l'esempio non funzionasse del tutto, piuttosto vedevo ruotare una macchia di colore come se il punto di vista si trovasse a pochi millimetri dalla foto...
Ho ricontrollato svariate volte il codice (che non posso copiare e incollare in toto a causa della diversa libreria per la gestione delle finestre) ma non vi vedevo problemi. Poi ho iniziato a cercare di isolare il problema semplificando il codice e, ad esempio, inserendo matrici identiche per capire quale fosse quella che non funzionava. Ma il funzionamento era alquanto stravagante e non mi è riuscito giungere a nessuna conclusione. Ho fatto molti altri esperimenti che non ricordo (da questo punto di vista aiuta essere fantasiosi come me) ma anche le modifiche più banali non mi funzionavano. Poi verso le 18:00 ho iniziato a preparare la cena (acceso il forno per il pollo arrosto e raccolto in giardino erbette aromatiche...).

La pausa mi ha fatto bene: talvolta si inizia a fare modifiche su modifiche senza fermarsi a riflettere con calma. In cucina invece ho avuto modo di pensarci in maniera più distaccata.
Inizialmente avevo deciso di mettermi a studiare la GLM per bene in maniera da capire esattamente cosa non funzionava ma poi mi è venuta un'idea: non sarà un problema di versione?

Dopo cena ho controllato: la versione fornita nel vecchio ambiente di sviluppo era la 0.9.4.0 mentre quella che si trovava in linea era la 0.9.7.0... Insomma la versione che usavo non era proprio la più aggiornata ma neppure qualcosa di estremamente obsoleto, però... hai visto mai?
Così ho scaricato l'ultima versione della GLM (non c'è bisogno di compilarla) e l'ho inserita in una cartella parallela a quella già presente con la versione 0.9.4.0. Da buon pappagallino informatico ho modificato l'archivio CMAKE in maniera da rimpiazzare il nome della vecchia cartella GLM con la nuova e...
…incredibile: ha subito funzionato!!

Nella mia ignoranza mi permetto comunque una critica: se una libreria si comporta in maniera così erratica (senza mai segnalare alcun errore ma fornendo risultati incomprensibili) come questa GLM allora tutti i sorgenti che l'adoperano dovrebbero verificarne la versione: in questa maniera si eviterebbe di far perdere tempo inutilmente a chi, come me, non conosce le sue insidie...

Alla fine della lezione c'erano due esercizi: il primo era facilissimo mentre per il secondo mi manca pochissimo (*1).

Nota (*1): l'esercizio consiste nel far ruotare la foto lungo l'asse X quando si preme la barra dello spazio e farla poi rallentare dolcemente fino a fermarsi. A me ruota ma non rallenta dolcemente: suppongo che la mia formula matematica non sia adeguata...

Settimo giorno
Oggi ho ripreso da dove ero arrivato: ho spidocchiato il mio codice per capire come mai la mia versione del secondo esercizio non funzionava.
Mi concentravo sulla formula matematica ma, a tutte le prove che facevo, sembrava andare bene: alla fine l'errore era banale e da tutt'altra parte...
Semplicemente inizializzavo una variabile all'interno del ciclo principale invece che fuori da esso: un errore da principiante che avrei dovuto individuare dopo pochi secondi mentre invece mi è occorsa circa un'ora! Come dicevo sono arrugginito... molto...

Finalmente ho poi cominciato la quarta lezione su profondità e stencil.
La profondità è banale perché fa tutto la scheda video: basta attivarla con un'apposita funzione e, automaticamente, i poligoni (nel mio caso triangoli) che stanno dietro ad altri non vengono disegnati...
L'argomento stencil è invece molto più complesso e, alla prima lettura della teoria non ci ho capito quasi niente!
Fortunatamente l'esempio di uso era molto chiaro e, basandomi su di esso, e rileggendo poi la teoria, sono riuscito a chiarirmi le idee. In pratica gli stencil sono affini alla profondità ma devono essere interamente gestiti via codice. Garantiscono maggiore flessibilità ma al prezzo di una difficoltà d'uso molto maggiore.

A fine lezione non c'erano i soliti esercizi ma l'autore forniva due collegamenti su come usare gli stencil per generare ombre e per evidenziare i bordi di un oggetto tridimensionale: la prima di queste operazioni mi è parsa decisamente più complessa e le indicazioni fornito dal sito collegato erano troppo vaghe per dare più di un'idea superficiale; invece evidenziare i bordi era decisamente più semplici e sono riuscito a implementare tale tecnica nel mio cubo ruotante. Ecco la prova!

Nessun commento:

Posta un commento