Newsgroup: it.comp.lang.delphi
Titolo: Disegnare un poligono nello spazio

Salve,
sto lavorando di recente alla realizzazione di un motore grafico 3D in
Delphi 5. Ho finito di costruire la libreria che gestisce la conversione
delle coordinate reali dei vertici delle figure in "coordinate schermo".
Ora sono bloccato nella realizzazione del motore di rendering: non so
proprio come tracciare i poligoni e la loro superficie.
Premessa: -= Non ho alcuna intenzione di usare librerie grafiche =-
dal momento che il mio lavoro dovrà essere successivamente
implementato in C/Java per girare su un piccolo controller
programmabile (so che è una follìa ma...).
Avevo pensato di tracciare un piano ricavandone i coefficienti della
equazione imponendo il passaggio per i vertici del poligono.
Successivemente lo stesso sarebbe stato limitato dalle rette vincolari
passanti per i vertici stessi. Però, quando ho provato a disegnare il
piano per intero sullo schermo, ho cronometrato ca. 15 sec.
Non è bello che un motore grafico consenta il rendering a max 0,067 fps!!!
C'è qualcuno che può suggerirmi una soluzione più veloce?
Grazie! ;-)
P.S.: Ho pensato già al fatto di restringere la zona di refresh al
rettangolo che incornicia completamente la figura, ma mi devo
mettere nelle condizioni peggiori possibili (parecchi poligoni di
estensione ragionevole).

C'č qualcuno che puň suggerirmi una soluzione piů veloce?
I poligoni vanno scomposti in parti piu' piccole (puoi usare un
algoritmo ricorsivo sulle facce).
Le facce vanno ordinate secondo il proprio Z-order, calcolato come
media delle profondita' dei vertici spaziali di ogni faccia.
Poi, dalla piu' profonda alla meno profonda, vanno disegnate
nell'ordine.
In ogni caso, esiste OpenGL, che riesce a fare tutto per conto tuo.
--
Andrea Laforgia (UIN 87230455)
----------------------------------------------------------
Non scrivetemi per e-mail, se non richiesto espressamente.
No replies in private e-mail, unless explicitly requested.
----------------------------------------------------------

Grazie,
ma, come ho già detto, dal momento che dovrò realizzare un
hardware implementando le funzioni che finora ho scritto solo
sotto forma di programma, non posso usare librerie di codice
già pronto. L'ideale sarebbe quello di programmare usando il
Watcom C++ per liberarmi da qualsiasi tentazione, ma non
dispongo di questo linguaggio di programmazione.
Usare le OpenGL o i DirectX significa impedirmi di "buttare"
il codice in un circuito programmabile.
Per quanto riguarda la questione sul rendering ci siamo fraintesi
nell'uso dei termini. Quando ho parlato di poligono intendevo
una faccia, un semplice triangolo. In effetti, la parte che mi
manca è proprio quella che mi consente di disegnare una faccia
con il suo riempimento variabile a seconda delle modalità usate
nel rendering. E' semplice disegnare una faccia in modalità "flat"
dal momento che l'oggetto canvas supporta i metodi per
disegnare i poligoni. Non è altrettanto facile fare la stessa cosa
tenendo conto dell'opacità, della trasparenza e della texture
della superficie, della luce d'ambiente, della luce diffusa e della
spot-light ad una distanza variabile dall'oggetto.
La tecnica dell'ordinamento Z l'avevo intuita studiando il
percorso che avrei dovuto fare con l'aiuto del mio professore
di matematica: uno dei primi problemi che ci siamo posti nella
fase di rendering è stato quello di stabilire la distanza media
(come la chiamavamo noi con un termine improprio dal
momento che è la media delle distanza dei vertici della faccia)
del poligono per disegnare prima le faccie più distanti. Non
conoscevamo questo metodo ma lo avevamo intuito e ti
ringrazio di cuore per aver confermato una delle ipotesi
fondamentali che mi serviranno per continuare il progetto.
Ti sarei molto grato, vista l'esperienza che presumo tu abbia,
se mi aiutassi a scrivere il codice per il rendering delle facce,
per il calcolo dell'illuminamento dato l'angolo di incidenza con
la luce, per l'applicazione della texturizzazione, dei fondi opachi
e lucenti, per la trasparenza e l'anti-aliasing.
Se non è troppo disturbo mi servirebbe sapere come si fa ad
andare a schermo pieno con possibilità di scegliere la risoluzione
usando codice Delphi (ho provato a usare l'interrupt 10h
ignorando il fatto che ero in modalità protetta, ma sopratutto
sperando in un miracolo).
Grazie                        :-)

P.S.: Esiste una guida on-line, possibilmente in italiano, che mi
illustri brevemente le tecniche per il rendering 3D.
Rigrazie, ciao!