Con il fine settimana appena passato, mi sono rimesso a lavorare su OpenBoat. Finalmente sono riuscito a risolvere il problema di OpenGL (in breve: mi stavo scrivendo una piccola libreria 3D) utilizzando QGLViewer e PyQGLViewer. Questa libreria (ed i suoi binding per python) in pratica incapsula il widget OpenGL delle librerie Qt, liberandomi dal problema di dovermi gestire tutto. OpenBoat è già stato convertito a questo nuovo widget ed è nuovamente al punto pre-conversione, con due vantaggi:

  • ho tutta una serie di cose come zoom, rotazione continua e così via gratis
  • ho eliminato un bel pò di codice
 

Uno dei problemi che devo affrontare nel porting (anche se sarebbe corretto parlare di riscriuttura) di FREE!Ship è la gestione grafica del modello. In pratica come disegno le varie viste.In questo caso oltretutto, guardare i sorgenti originali non ha senso: sembrano non usare assolutamente OpenGL e sembrerebbe che l’autore si sia scritto tutta la parte di gestione della grafica, con il risultato di avere 640 Kb di codice che disegna da spulciare. D’altronde non sono riuscito a trovare una libreria 3D che incapsuli le OpenGL che sia abbastanza facile da installare sia su Linux che su Windows, e quindi mi sono ritrovato a fare tutto a manina. Questo approccio ha i suoi vantaggi (è immediatamente portabile visto che lo sto facendo in python) ma anche i suoi svantaggi (uno fra tutti è che si deve scrivere un sacco di codice in più)In ogni caso, visto le difficoltà nel reperire una buona libreria, la migliore che ho trovato è libQGLViewer: è un incubo installarla sotto Windows ma la terrò sotto controllo, mi sono messo di buzzo buono e ho cominciato a scrivere codice. Il risultato di alcune ore di hacking selvaggio è che ho una bella classe, che eredita da QGLWidget e che implementa parte di quello che serve, anche se in maniera tutt’altro che ottimale, ma soprattutto ho un’infrastruttura pronta per proseguire nello sviluppo, nonostante ci siano ancora un po’ di problemi da risolvere (uno su tutti: quando scelgo di mostrare tutti e due i lati dello scafo, viene visualizzato correttamente solo su una vista, a caso per giunta) Per il momento ho messo a punto lo zoom e le viste 2D, anche se queste ultime le devo sistemare per usare, se possibile, glOrtho() al posto di glRotatef(), approccio che mi sembra più corretto.

 

Se mentre programmi con Python (ma credo valda anche per altri linguaggi) utilizzando OpenGL ottieni questo errore, una della cause può essere che chiami la funzione glBegin() un numero di volte maggiore della funzione glEnd()Questo simpatico errore (avevo messo la glBegin() in un ciclo e la glEnd() fuori) mi ha tenuto bloccato per due giorni…

 

Dopo un periodo di assestamento dovuto al viaggio di andata e ritorno verso QGraphicView, OpenBoat sta andando avanti. A questo punto, dopo aver accantonato l’idea di avere due stack di codice diversi per le viste 2D e 3D, dopo aver (follemente) pensato di avere un oggetto diverso per ogni vista, sono arrivato ad un risultato quasi decente: allo stato attuale OpenBoat disegna mezzo scafo ed il codice che serve a disegnare lo scafo completo sta arrivando.Questo punto è importante per vari motivi, non ultimo il fatto che è un passo cruciale nello sviluppo. Da qui infatti, una volta finito di implementare il motore di disegno, posso partire per implementare tutte le funzionalità legate al disegno e alla sua modifica. La scaletta dei lavori che attualmente penso di seguire è la seguente:

  1. finire il disegno della matrice di punti del mezzo scafo
  2. implementare il disegno dello scafo completo (abbastanza banale a dire la verità)
  3. implementare la modifica delle opzioni del programma
  4. completare il disegno dello scafo con le spline per avere il profilo corretto

Forse non sarà questo l’ordine, altre cose importanti da fare sono la gestione delle viste, il poter selezionare un oggetto, l’implementazione delle Subdivide Surface, non so a priori cosa mi servirà per andare avanti. Ad ogni modo, quello che era iniziato quasi per scommessa e su cui nessuno ci credeva (io per primo a dire la verità ) sta lentamente andando avanti e forse vedrà la luce.

© 2011 G.R.Y.S. Suffusion theme by Sayontan Sinha