Aggiungere una "terza dimensione" a una forma

Argomenti riguardanti il D3D di GameMaker e librerie esterne.
Rispondi
Avatar utente
Pasquiindustry
Membro super
Messaggi: 918
Iscritto il: 30/06/2011, 23:23
Specialità: ModernUI + Tweaks
Uso: GameMaker 8.1
Località: Conversano (bari)
Contatta:

Aggiungere una "terza dimensione" a una forma

Messaggio da Pasquiindustry »

Salve, volevo aggiungere una "terza dimensione" a una immagine semplice in *.png (ad esempio far diventare in 3D il mio logo, considerando che il rosso sia in realtà trasparente. Con Gamemaker è possibile? (a livello di modello)
Immagine
Immagine Immagine Immagine
I tacchini sanno volare!
Visite nel mondo:
Spoiler
Immagine

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Jak »

Usi le surface, vai di getpixel e ti ricavi un modello. Non è complicato anche se è lento(ma puoi sempre salvarti il modello a parte e quindi caricandolo come modello da file ci metti un niente)
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Pasquiindustry
Membro super
Messaggi: 918
Iscritto il: 30/06/2011, 23:23
Specialità: ModernUI + Tweaks
Uso: GameMaker 8.1
Località: Conversano (bari)
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Pasquiindustry »

Jak ha scritto:Usi le surface, vai di getpixel e ti ricavi un modello. Non è complicato anche se è lento(ma puoi sempre salvarti il modello a parte e quindi caricandolo come modello da file ci metti un niente)
Purtroppo capisco poco e niente di surface e 3d, però ho provato questo codice (esamino tutti i pixel e aggiungo un vertice alla primitiva se il pixel è bianco)

[create]

Codice: Seleziona tutto

numeroattualeriga=1
numeroattualecolonna=1
d3d_primitive_begin(pr_pointlist)
while (numeroattualecolonna!=sprite_get_height(image_index))
{
 while (numeroattualeriga!=sprite_get_width(image_index))
 {
 colorepixel=draw_getpixel(numeroattualeriga,numeroattualecolonna);
 if colorepixel=c_white d3d_vertex(x+numeroattualeriga,y+numeroattualecolonna,0);
 numeroattualeriga+=1;
 }
 numeroattualecolonna+=1;
}
[draw]

Codice: Seleziona tutto

if numeroattualeriga=sprite_get_width(image_index)
if numeroattualecolonna=sprite_get_height(image_index)
d3d_primitive_end()
naturalmente ho creato l'oggetto camera, nella quale c'è d3d_start() nel create e d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup) e l'ho modificata varie volte, ma il risultato è sempre un insieme di puntini bianchi (pare..)

questo è come appare il gioco (l'arancione è il colore di background)
Immagine

questa è l'immagine alla quale voglio aggiungere uno spessore (il grigio è la trasparenza).
Immagine

Non sono molto sicuro di come si usa il while, ho provato a fare questo tentativo.
Ho anche un dubbio sulla comaparazione di c_white e i pixel bianchi
A pensarci bene, poi, non credo neanche di riuscire nel mio intento con questo metodo...

(scusatemi per la confusione di questo post e vi ringrazio in anticipo per le eventuali risposte :D )
Immagine
Immagine Immagine Immagine
I tacchini sanno volare!
Visite nel mondo:
Spoiler
Immagine

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Jak »

Ovviamente non basta un vertice al modello, in genere serve almeno un cubo(opportunamente ottimizzato con vari script)
Inoltre è chiaro che per farlo devi avere una buona conoscenza di for e 3d.
Proverò a buttare giu uno script dopo cena se mi viene voglia ;)
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Jak »

Et voilà!
http://njgames.altervista.org/files_mis ... te_3d.gm81
Ho commentato tutto a dovere, se non capisci qualcosa dubito di poterti aiutare più di così. La soluzione migliore è certamente quella di imparare bene la sintassi di GM e le basi del 3d prima di voler fare cose come queste ma fortunatamente questo script potrebbe essere utile a qualcun'altro di più esperto. :sisisi:

L'esempio è molto semplice, il mio script ha due argomenti, lo sprite e la profondità e fa tutto da solo, te basta che disegni il modello che ti restituisce.
Potrei provare a fare delle ottimizzazioni allo script per ridurre notevolmente il numero di triangoli eliminando quelli perennemente invisibili. Forse domani lo faccio.

Lo script per chi non ha gm8.1:
Spoiler

Codice: Seleziona tutto

//create_3d_sprite(sprite_index,profondità)
//crea un modello 3d partendo dallo sprite con la profondità indicata
//il colore trasparente viene preso dal pixel in alto a destra
var mdl,srf,w,h,col_alpha,col;
//crea il modello
mdl=d3d_model_create();
//preleva le info dello sprite
w=sprite_get_width(argument0);
h=sprite_get_height(argument0);
//crea una surface e ci disegna lo sprite per poter leggerne i pixel
srf=surface_create(w,h);
surface_set_target(srf);
draw_sprite(argument0,0,0,0);
surface_reset_target();
//converte la profondità in z (quindi la inverte)
argument1=-argument1;
//prende il colore di trasparenza
col_alpha=surface_getpixel(srf,0,0);
//esegue per ogni pixel
for (i=0; i<w; i+=1)
{
    for (j=0; j<h; j+=1)
    {
        //controlla se il colore è quello di trasparenza
        //ed eventualmente colora il cubo appositamente
        col=surface_getpixel(srf,i,j);
        if (col!=col_alpha)
        {
            //aggiunge un cubo al modello, ridefinito a mano poichè
            //GM non gestisce i colori con le primitive
            //!!!ATTENZIONE!!! il cubo non ha normali e non è sistemato
            //per il culling quindi potrebbe dare problemi
            
            //faccia frontale
            d3d_model_primitive_begin(mdl,pr_trianglestrip);
            d3d_model_vertex_color(mdl,0+i,0+j,0,col,1);
            d3d_model_vertex_color(mdl,0+i,1+j,0,col,1);
            d3d_model_vertex_color(mdl,1+i,0+j,0,col,1);
            d3d_model_vertex_color(mdl,1+i,1+j,0,col,1);
            d3d_model_primitive_end(mdl);
            
            //riduce l'intensità del colore per le facce laterali
            col=make_color_hsv(color_get_hue(col),color_get_saturation(col),color_get_value(col)/3*2);
            
            //facce laterali
            d3d_model_primitive_begin(mdl,pr_trianglestrip);
            d3d_model_vertex_color(mdl,1+i,0+j,0,col,1);
            d3d_model_vertex_color(mdl,1+i,1+j,0,col,1);
            d3d_model_vertex_color(mdl,1+i,0+j,argument1,col,1);
            d3d_model_vertex_color(mdl,1+i,1+j,argument1,col,1);
            d3d_model_primitive_end(mdl);
            d3d_model_primitive_begin(mdl,pr_trianglestrip);
            d3d_model_vertex_color(mdl,0+i,0+j,0,col,1);
            d3d_model_vertex_color(mdl,0+i,1+j,0,col,1);
            d3d_model_vertex_color(mdl,0+i,0+j,argument1,col,1);
            d3d_model_vertex_color(mdl,0+i,1+j,argument1,col,1);
            d3d_model_primitive_end(mdl);
            d3d_model_primitive_begin(mdl,pr_trianglestrip);
            d3d_model_vertex_color(mdl,0+i,0+j,0,col,1);
            d3d_model_vertex_color(mdl,0+i,0+j,argument1,col,1);
            d3d_model_vertex_color(mdl,1+i,0+j,0,col,1);
            d3d_model_vertex_color(mdl,1+i,0+j,argument1,col,1);
            d3d_model_primitive_end(mdl);
            d3d_model_primitive_begin(mdl,pr_trianglestrip);
            d3d_model_vertex_color(mdl,0+i,1+j,0,col,1);
            d3d_model_vertex_color(mdl,0+i,1+j,argument1,col,1);
            d3d_model_vertex_color(mdl,1+i,1+j,0,col,1);
            d3d_model_vertex_color(mdl,1+i,1+j,argument1,col,1);
            d3d_model_primitive_end(mdl);
            
            //riduce ulteriormente l'intensità del colore per la faccia posteriore
            col=make_color_hsv(color_get_hue(col),color_get_saturation(col),color_get_value(col)/3*2);
            
            //faccia posteriore
            d3d_model_primitive_begin(mdl,pr_trianglestrip);
            d3d_model_vertex_color(mdl,0+i,0+j,argument1,col,1);
            d3d_model_vertex_color(mdl,0+i,1+j,argument1,col,1);
            d3d_model_vertex_color(mdl,1+i,0+j,argument1,col,1);
            d3d_model_vertex_color(mdl,1+i,1+j,argument1,col,1);
            d3d_model_primitive_end(mdl);
        }
    }
}
//restituisce il modello da disegnare
return mdl;
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Tizzio »

jak, ma non sarebbe meglio fondere i vertici del modello anzichè creare tanti parallelepipedi?
so' che non è semplice, ma così è parecchio lento.
viene un "highpoly", senza motivo

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Jak »

Tizzio ha scritto:jak, ma non sarebbe meglio fondere i vertici del modello anzichè creare tanti parallelepipedi?
so' che non è semplice, ma così è parecchio lento.
viene un "highpoly", senza motivo
Jak ha scritto:Potrei provare a fare delle ottimizzazioni allo script per ridurre notevolmente il numero di triangoli eliminando quelli perennemente invisibili. Forse domani lo faccio.
Tra l'altro è anche semplice ;)
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Tizzio »

Jak ha scritto:Potrei provare a fare delle ottimizzazioni allo script per ridurre notevolmente il numero di triangoli eliminando quelli perennemente invisibili. Forse domani lo faccio.
ottimo :D
ho aggiunto la rotazione della telecamera, e una sottrazione per centrare il modello, e trasformato in gmk (per chi non avesse gm81)
PS: direi anche di aggiungere la profondità secondo una mask in bianco e nero che funga da height map :)
Allegati
esempio_sprite_3d.gmk
(11.93 KiB) Scaricato 198 volte

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Jak »

Stavo per postare l'esempio con i triangoli ridotti(che alla fine son comunque parecchi con immagini relativamente grandi) e con l'aggiunta dello spostamento della posizione di disegno del modello tramite freccette per vedere meglio(anche se pure io potrei fare la rotazione della telecamera).
Heightmap? Bella idea, mi sa che userò l'alfa del colore per unificare il tutto in un'unico sprite nonchè essere più veloce.
EDIT: Ovviamente non ci sono funzioni per prelevare l'alfa del colore dalla surface :|
Mi tocca fare uno sprite a parte.
Ora che ci penso le heightmap non sono affatto facili come ottimizzazione del numero di triangoli :paura:
Ma per correttezza lo faccio istes visto che male non fa :sisisi:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Jak »

Nuova versione per gm8.0(anche se dovrebbe essere convertibile per gm6 e gm7)
http://njgames.altervista.org/files_mis ... ite_3d.gmk
Ora avete a disposizione i tasti per spostare modello e telecamera, le istruzioni in sovraimpressione e informazioni riguardanti fps e numero di triangoli del modello.
Nell'esempio avete 3 sprites di prova, basta che cambiate il codice nel create.
Non ho aggiunto altri commenti rispetto a prima, ci penserò quando aggiungerò il supporto alle heightmap(visto che ci metterò un po intanto vi rilascio la versione con tutto il resto)
Aggiunta l'opzione per centrare il modello(rubo le idee a tiz anche se il suo gmk non l'ho manco scaricato :lol: )
Dovrebbero mancare solo le heightmap, provvedo subito ma come ho detto per queste ci vorrà un po :sisisi:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Tizzio »

fatto ;)
Immagine

Però non è ottimizzato, quindi meglio il tuo, jak
Allegati
esempio_sprite_3d.gmk
(12.84 KiB) Scaricato 196 volte

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Jak »

Tizzio ha scritto:Però non è ottimizzato
E' proprio quella la parte più complessa :lol: (ma neanche tanto, solo che sto perdendo tempo col nuovo video del capo)
Scarico il tuo gmk così ti rubo lo sprite :sisisi:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Pasquiindustry
Membro super
Messaggi: 918
Iscritto il: 30/06/2011, 23:23
Specialità: ModernUI + Tweaks
Uso: GameMaker 8.1
Località: Conversano (bari)
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Pasquiindustry »

Sto cercando di capire qualcosa, ma per me è quasi tutto arabo. Non sono ancora pronto per questo genere di cose (lo sarò mai?)
Vi ringrazio per gli esempi ed il supporto, vedrò in futuro di capirci qualcosa (sempre che non cambi ancora una volta progetto su cui lavorare...).
Vorrei solo capire una cosa: come funziona esattamente la funzione d3d_set_projection(...), su cosa mi devo basare per inserire correttamente i parametri che richiede (ad esempio per avere la camera puntata verso un oggetto a una certa altezza)?
Immagine
Immagine Immagine Immagine
I tacchini sanno volare!
Visite nel mondo:
Spoiler
Immagine

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Aggiungere una "terza dimensione" a una forma

Messaggio da Jak »

Ecco la nuova versione provvista di heightmap. Uso gm8.1 per andare a 400 fps(rispetto ai 35 di gm8.0) probabilmente per via dell'uso della geometria statica nonchè per via del depth buffer più preciso che da una qualità decisamente migliore.
Come lo scorso esempio ci sono le istruzioni quindi cè poco da dire tranne che ho aggiunto vari controlli per la visualizzazione come lo zoom e la direzione(cioè se lo vedete di profilo come prima o verso l'alto per guardare meglio le heightmap)
Il modello è ottimizzato al massimo per non disegnare nemmeno un pixel extra(anche se magari il codice potrebbe essere riorganizzato leggermente meglio ma vabbè, dubito cambi moltissimo e non è comunque utilizzabile in real time quindi..., e nell'esempio ho usato sprite ed heightmap(opportunamente modificata da nocode) fatte da tizzio.
Se zoomate abbastanza entrerete nel modello e potrete vedere che il tutto è ottimizzato al meglio oppure nello script togliete le righe di codice riguardanti le facce per toglierle separatamente e guardare dentro il modello.
Le zone trasparenti ovviamente non disegneranno alcun triangolo mentre quelle di altezza 0 non disegnano i lati quindi è tutto al top level.
Per evitare che chi lo utilizza faccia casini ho fatto due script, uno che usa la heightmap ed uno che non lo usa così potete scegliere quello che più vi aggrada.

Link: http://njgames.altervista.org/files_mis ... te_3d.gm81

Son proprio soddisfatto di quel che è venuto fuori :sisisi:
Spoiler
Pasquiindustry ha scritto:Sto cercando di capire qualcosa, ma per me è quasi tutto arabo.
Tanto ne ero sicuro, lo faccio solo perchè magari a qualcun'altro serve e per mostrare a tizzio che ce l'ho grosso :lol:
(come se per una stupidaggine del genere dimostrassi qualcosa)
Pasquiindustry ha scritto:Vorrei solo capire una cosa: come funziona esattamente la funzione d3d_set_projection(...), su cosa mi devo basare per inserire correttamente i parametri che richiede (ad esempio per avere la camera puntata verso un oggetto a una certa altezza)?
Leggi il manuale e fai tante prove. ;)
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 30 ospiti