Newsgroup: it.comp.lang.pascal
Titolo: Libreria grafica 3D

Visto che c'è qualcuno oltre a me a cui interessa l'argomento, sono deciso a
mandarvelo. Domani vi mando in allegato il lavoro che ho fatto, per adesso
non c'è l'ho su questo pc.
(ricordate che non sono un programmatore professionista, il programma è
abbastanza rozzo come  stile, non me ne vogliate). Appena posso crerò
qualche pagina htlm cosi da poter trovare tutto li.
Il proggetto mi è veuto in mente per caso, a scuola. Io ho 15,5 anni,
frequento il 2° anno dell'ITIS E.Fermi di Giarre CT. Ho iniziato a
programmare in pascal dall'età di dieci anni (il mio primo 486!!!).
Lo sto portando avanti solo a scopo amatoriale, e come attività didattica.
La mia prof è restata davvero sbalordita quando ha visto (sullo schermo di
misero 486sx, che abbiamo a scuola) un bel parallelepipedo che girava su se
stesso in 3D.
Per adesso gli unici che lavorano su questo programma sono io (che ho fatto
il 95% del lavoro) e un mio amico che mi da una mano.
Quindi cerco qualcuno che mi aiuti veramente e che creda nel progetto.
Chi vuole partecipare faccia un reply a questo msg e ci metteremo daccordo.
................Chi ha un po' di tempo per approfondire legga
sotto..............
Premetto che fino a poco tempo fa non conoscevo molto della trigonometria
che ho dovuto imparare forzatamente per poter raggiungere determinati scopi,
cmq sono un buon autodidatta e me la cavo benissimo in matematica.
Il proggetto si basa su una unit (lo chiamata Lib3d, almeno per ora). Sto
aggiungendo man mano tutte le varie figure geometriche. (approposito sto
cercado una regola (o un insieme di regole) che mi permetta di calcolare
(naturalmente in 3D, quindi x,y,z) un qualsiasi poliedro convesso, qualcuno
a un'idea??)
Più o meno il funzionamento è questo.
Quando si deve creare una struttura 3D, dapprima si da il centro (come se
fosse il "cursore grafico" sullo schermo) poi ogni pezzo verrà calcolato
tentendo conto della posizione del centro. Il pezzo potrà essere ruotato
rispetto a qualsiasi asse considerando come il "cursore grafico" il centro
di rotazione. Spostando il cursore si sposta anche tutto il pezzo.
Quindi per poter costruire un pezzo 3D è necessario prima di tutto il
centro, gli angoli (per la rotazione) e poi i relativi pezzi (linee,
parallelepipedi, cubi, etc...)
Una volta calcolati tutti i punti in x,y,z essi vengono passati (tramite
un'apposita
procedura) a coordinate 2D dello schermo e quindi visualizzate. Il tipo di
prospettiva può variare: basta cambiare la procedure che esegue il setup del
pixel (credo che si chiami così, o sbaglio?). In questo modo oltre alla
semplice (si fa per dire :-D ) prospettiva (tipo quella di 3D Studio Max),
si potranno disegnare pezzi in assonometria per esempio (lasciando invariata
tutta la parte riguardante le coordinate 3D). In questo modo è anche facile
cambiare il punto di osservazione. Siccome ogni singolo punto viene
calcolato con la medesima procedura, si può usare sempre la stessa procedura
per cambiar il punto di vista.
Il calcolo è molto imponente. Per calcolare anche una semplice linea
occorono, oltre alle numerossissime divisioni, richiami alle funzioni sin,
cos, arctan (necessari per la rotazione) , radici quadre, arrotondamenti
vari. Senza coprocessore matematico è quasi impossibile. Su un 486 senza
coproc. mat.  per fare una rotazione completa di un parallelepipedo rispetto
a un solo asse ci sono voluti circa 4 min. Su un petium 150 o più la cosa è
accettabilissima, su un p2 è perfetto.
Ultimamente sto lavorando su un sistema per caricare (con una lista o una
coda) tutte le singole linee o punti già calcolati in memoria, in modo che
al momento della cancellazione sullo schermo non sarà più necessario
ricalcolare ogni punti (come fa il programma fin ora), basta prenderli dalla
memoria.
Invece di usare varie procedure per disegnare i vari solido, o deciso di
usare una sola funzione che usa come variebile un record. Questo record che
ho chiamato Oggetto3D è un record a campi varianti in modo che si adatti ai
diversi tipo di solidi. Ho deciso di addottare questa scelta per vari
motivi:
-per semplicità (una sola procedura per qualsiasi tipo di pezzo 3D, cambia
solo il modo di inserire i dati)
-per rendere l'inserimento dei dati più agevole e schematizzato (basterà
inserire i dati in un vettore contenuto dentro al record)
-per salvare su file
Naturalmente poi ci sarà una procedura a cui verà dato il record. Questa
procedura verificherà di che tipo è questo record e chiamerà la relativa
procedura interna, necessaria per la costruzione del pezzo 3D.
Al momento ho costruito la libreria e due demo.

Un bel di' Leo scrisse:
L> Visto che c'è qualcuno oltre a me a cui interessa l'argomento, sono deciso a
L> mandarvelo. Domani vi mando in allegato il lavoro che ho fatto, per adesso
L> non c'è l'ho su questo pc.
L> (ricordate che non sono un programmatore professionista, il programma è
L> abbastanza rozzo come  stile, non me ne vogliate). Appena posso crerò
L> qualche pagina htlm cosi da poter trovare tutto li.
L> 
se leggi in tempo, non allegare la tua unit al msg, ma copia/incollala.
Lo so che fa schifo, ma questo e' un NG in cui non possono essere inviati
files binari, ed alcuni server potrebbero non accettare il tuo msg :-(
L> Il proggetto mi è veuto in mente per caso, a scuola. Io ho 15,5 anni,
L> frequento il 2° anno dell'ITIS E.Fermi di Giarre CT. Ho iniziato a
L> programmare in pascal dall'età di dieci anni (il mio primo 486!!!).
Ammazza!! :-))
L> Il calcolo è molto imponente. 
Male :-(
L> Per calcolare anche una semplice linea
L> occorono, oltre alle numerossissime divisioni, richiami alle funzioni sin,
L> cos, arctan (necessari per la rotazione) , radici quadre, arrotondamenti
L> vari. Senza coprocessore matematico è quasi impossibile. Su un 486 senza
L> coproc. mat.  per fare una rotazione completa di un parallelepipedo rispetto
L> a un solo asse ci sono voluti circa 4 min. Su un petium 150 o più la cosa è
L> accettabilissima, su un p2 è perfetto.
Mmm... devi fare di meglio :-))
Scherzi a parte, un trucchetto.
Quando fai partire il programma, come prima cosa, costruisci un vettore di 360
elementi e lo chiami sin[].
Ci schiaffi dentro il seno di ogni angolo:
	for i:=1 to 360 do
		sin[i] := sin (i * pi / 180);
In questo modo velocizzi notevolmente i calcoli successivi, perche' il prog.
non deve piu' calcolare il seno degli angoli, ma semplicemente ricavare
il valore da un vettore.
Ovviamente fai lo stesso per tutte le funzioni trigonometriche che usi :-)
L> Invece di usare varie procedure per disegnare i vari solido, o deciso di
L> usare una sola funzione che usa come variebile un record. Questo record che
L> ho chiamato Oggetto3D è un record a campi varianti in modo che si adatti ai
L> diversi tipo di solidi. Ho deciso di addottare questa scelta per vari
L> motivi:
L> 
Questa non l'ho capita bene, ma aspetto di vedere il codice :-)
Ciao ciao!
-- 
Emanuele Cesena		
http://www.geocities.com/SiliconValley/Grid/8879
ami...@iol.it
 :)			 Occhio all'antispammer NOSPAZ!!
Scaricate ora Bubble 2000, ver. beta 1 :-)
http://gpi.eden.it/italianware/games/b2000b1.exe
 (900kb, ma il server e' buono!)
"Ogni attrezzo, quando cade, rotola fino al punto piu' inaccessibile
dell'officina", legge dell'Officina