Italian OpenGL - Aiuto!

Orazio8909

Member
Licensed User
Longtime User
Salve ragazzi, premesso che ho cercato nel forum seguito qualche guida e stampate le 71 pagine della libreria OpenGL per poterla imparare.. Ho già realizzato un giochino (passa-tempo presente sul market, si chiama Fast Click ) solo che è stato realizzato con delle semplici immagini, io vorrei imparare a gestire le texture e magari far muovere qualche personaggio. Non riesco a capire come caricare una texture di un personaggio ecco il codice:

Sub Process_Globals

End Sub

Sub Globals

Dim surface1 As GLSurfaceView
Dim sfondo As Bitmap

End Sub

Sub Activity_Create(FirstTime As Boolean)

sfondo.Initialize(File.DirAssets,"sfondo.gif")
surface1.Initialize2(surface1.RENDERMODE_CONTINUOUSLY,"surface1",20,0)
'surface1.Color = Colors.ARGB(Rnd(100,255),Rnd(0,255),Rnd(0,255),Rnd(0,255))
surface1.SetBackgroundImage(sfondo)

Activity.AddView(surface1, 0,0, Activity.Width, Activity.Height)

End Sub

Sub Activity_Resume

surface1.Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

surface1.Pause

End Sub

Sub surface1_SurfaceCreated(gl As GL1) 'Called when the surface is created or recreated.

#### QUI DOVREI CARICARE LA MIA TEXTURE MA COME?? ####

ho provato ad utilizzare ( seguendo una guida ) questi codici:

dim textures() as int

gl.glGenTextures(1,textures,0)

gl.glBindTexture(gl.GL_TEXTURE_2D,textures(0))

## dopo non so cosa mettere ##


End Sub

Qualcuno mi può aiutare? Grazie in anticipo per le risposte.
 

ivanomonti

Expert
Licensed User
Longtime User
mi piacerebbe anche me capire come fare, quando hai qualcosa di visibile avresti voglia di farmi vedere :)
 

Orazio8909

Member
Licensed User
Longtime User
mi piacerebbe anche me capire come fare, quando hai qualcosa di visibile avresti voglia di farmi vedere :)

Giuro che se riesco ad imparare condivido tutto, visto che in ITA non si trova niente e quello che ce in inglese a volte è spiegato male o comunque danno tutto per scontato, come se dovessimo sapere già come funziona XD. cmq sto facendo un confrontro tra OpenGL e RSAndEngine, la seconda sembra più facile rispetto alle opengl anche perche l'app o gioco funzionano sotto dei servizi. Cmq vedo quello che riesco a fare in questi giorni dopo di che cercherò di postare una guida in ITA.
 

ivanomonti

Expert
Licensed User
Longtime User
grazie ci tengo ... io ho messo a disposizione una libreria IMLibrary goditela
 

Orazio8909

Member
Licensed User
Longtime User
io ho fatto tanto tempo fa delle provee con Wings free e modelutil!
http://www.wings3d.com/?page_id=84
Ciao Spinter, sei riuscito a creare un modello ed inserirlo sul programma per farlo girare? io sono alla ricerca di un programma per creare animazioni (personaggi, mappe, armi ecc..) o quanto meno un programma che mi permette l'esportazione del file ( magari se genera delle texture ) in modo tale da poterle utilizzare o con le OpenGL o con RsAndEngine. Io sono bloccato con le opengl perche non riesco a caricare le texture e con andengine che riesco a caricare le texture ma non riesco a visualizzarle, vedo tutto nero XD, ci lavoro quando ho un po di tempo.
 

fiaful

Member
Licensed User
Longtime User
Ciao Orazio, il mondo 3D è un mondo completamente diverso da quello dell'informatica convenzionale e della grafica in generale. Ha dei punti di contatto con elementi della grafica 2D solo in quanto la utilizza per le texture (ma anche lì non credere che ti basti vare una sola texture per un poligono e sei a posto... devi prevedere diversi lod - level of detail - altrimenti rischi di appesantire troppo la scena).
Detto questo ti consiglio di abbandonare immediatamente OpenGL che rappresentano lo strato software più basso per pilotare il dispositivo e di dedicarti alla ricerca ed allo studio di un game engine che possa entusiasmarti. Ti dico questo perchè partendo dalle OpenGL passerai anni a scrivere funzioni di ogni tipo prima di vedere qualcosa di minimamente impiegabile. Non ti voglio smontare ma è la realtà dei fatti... per non perdere l'interesse devi trovare qualcosa che ti consenta di essere produttivo in breve tempo (come ad esempio può essere AndEngine per i giochi in 2d).
Non so quale motore consigliarti su dispositivi mobili. Per PC ti avrei consigliato OGRE e JME in quanto, a mio avviso, i migliori... ma poi ci sono IrrLicht, Panda, (anche questi piuttosto validi, in particolare l'ultimo utilizzabile da python, usato dalla disney per alcuni dei suoi giochini)... e quanti altri ne vuoi... fino a LWJGL che è quello di livello più basso... ma per Android non saprei cosa consigliarti... devi guardarti un po' in giro.

Per quanto riguarda i programmi, anche lì, devi prendere parecchio dimestichezza col mondo 3D che, ripeto, è totalmente diverso da quello 2D... devi iniziare ad utilizzare un modellatore (evita maya o 3dstudio per ovvi motivi di costi di licenza), ma puoi partire da soluzioni altrettanto valide come Wings e Blender.

Discorsi a parte valgono per i formati dei file, per i quali potremmo aprire una parentesi grande quanto quella dei formati video... il formato più basilare da gestire (e quello più standard) è il wavefront (.obj), che salva anche le coordinate uv e i riferimenti ai file delle texture in un file parallelo (.mat), ma se vuoi modelli che siano animati allora non puoi utilizzare l'obj... ti serve un formato che supporti le animazioni (come MD2, MD3 o MD5)... ma ovviamente non tutti i programmi sono in grado di lavorare con tali formati... se vuoi fare modelli animati ti consiglio l'ottimo MilkShape3D (della chumbalum se non ricordo male), che è vero che è shareware, ma è anche vero che costa un'inezia ed è un programmone! oltretutto ti da anche la possibilità di applicare gli scheletri ai joint (cosa che però fa anche blender, ma poi lì ti serve qualche esportatore che funzioni).

Oltretutto se vuoi realizzare un videogioco in 3d ci sono altri fattori che devi tenere in considerazione: texture in formati diversi, lod anche per le mesh 3d, riduttori di poligoni, e tante, ma tante altre cose...

Non ti sto dicendo che devi abbandonare, anzi... ti sto dicendo che se vuoi fare qualcosa del genere devi studiare tante cose e dedicarti solo a questo (perchè assorbe completamente)... e soprattutto di NON partire da OpenGL perchè rischi di perdere una infinità di tempo e scoraggiarti.

Detto questo, faccio il tifo per te!
 

Orazio8909

Member
Licensed User
Longtime User
Ciao Orazio, il mondo 3D è un mondo completamente diverso da quello dell'informatica convenzionale e della grafica in generale. Ha dei punti di contatto con elementi della grafica 2D solo in quanto la utilizza per le texture (ma anche lì non credere che ti basti vare una sola texture per un poligono e sei a posto... devi prevedere diversi lod - level of detail - altrimenti rischi di appesantire troppo la scena).
Detto questo ti consiglio di abbandonare immediatamente OpenGL che rappresentano lo strato software più basso per pilotare il dispositivo e di dedicarti alla ricerca ed allo studio di un game engine che possa entusiasmarti. Ti dico questo perchè partendo dalle OpenGL passerai anni a scrivere funzioni di ogni tipo prima di vedere qualcosa di minimamente impiegabile. Non ti voglio smontare ma è la realtà dei fatti... per non perdere l'interesse devi trovare qualcosa che ti consenta di essere produttivo in breve tempo (come ad esempio può essere AndEngine per i giochi in 2d).
Non so quale motore consigliarti su dispositivi mobili. Per PC ti avrei consigliato OGRE e JME in quanto, a mio avviso, i migliori... ma poi ci sono IrrLicht, Panda, (anche questi piuttosto validi, in particolare l'ultimo utilizzabile da python, usato dalla disney per alcuni dei suoi giochini)... e quanti altri ne vuoi... fino a LWJGL che è quello di livello più basso... ma per Android non saprei cosa consigliarti... devi guardarti un po' in giro.

Per quanto riguarda i programmi, anche lì, devi prendere parecchio dimestichezza col mondo 3D che, ripeto, è totalmente diverso da quello 2D... devi iniziare ad utilizzare un modellatore (evita maya o 3dstudio per ovvi motivi di costi di licenza), ma puoi partire da soluzioni altrettanto valide come Wings e Blender.

Discorsi a parte valgono per i formati dei file, per i quali potremmo aprire una parentesi grande quanto quella dei formati video... il formato più basilare da gestire (e quello più standard) è il wavefront (.obj), che salva anche le coordinate uv e i riferimenti ai file delle texture in un file parallelo (.mat), ma se vuoi modelli che siano animati allora non puoi utilizzare l'obj... ti serve un formato che supporti le animazioni (come MD2, MD3 o MD5)... ma ovviamente non tutti i programmi sono in grado di lavorare con tali formati... se vuoi fare modelli animati ti consiglio l'ottimo MilkShape3D (della chumbalum se non ricordo male), che è vero che è shareware, ma è anche vero che costa un'inezia ed è un programmone! oltretutto ti da anche la possibilità di applicare gli scheletri ai joint (cosa che però fa anche blender, ma poi lì ti serve qualche esportatore che funzioni).

Oltretutto se vuoi realizzare un videogioco in 3d ci sono altri fattori che devi tenere in considerazione: texture in formati diversi, lod anche per le mesh 3d, riduttori di poligoni, e tante, ma tante altre cose...

Non ti sto dicendo che devi abbandonare, anzi... ti sto dicendo che se vuoi fare qualcosa del genere devi studiare tante cose e dedicarti solo a questo (perchè assorbe completamente)... e soprattutto di NON partire da OpenGL perchè rischi di perdere una infinità di tempo e scoraggiarti.

Detto questo, faccio il tifo per te!

Ciao fiaful,

prima di tutto ti ringrazio per la tua risposta e non solo, anche per tutto quello che mi hai detto visto che la maggior parte delle cose non le sapevo, essendo un autodidatta ( purtroppo ) ho una miriade di blocco note scritti da me riguardanti i vari linguaggi di programmazione. Hai ragione riguardo le openGL, in realtà ci provo da qualche mese senza avere grossi risultati, vorrei partire da una grafica 2D ed utilizzare AndEngine come libreria solo che non sò che programmi utilizzare per quanto riguarda la creazione di personaggi ecc.. posso utilizzare Wings per modelli 2D? e per l'esportazione lo faccio sempre dallo stesso programma? queste sono le cose principali per cui io abbandono e dico ( poi lo rivedo ). Io cmq un giochino l'ho realizzato ( molto semplice, si trova su google play ) che si chiama Fast Click, soddisfatto per la realizzazione ma non troppo per la grafica visto che sono delle semplici immagini. Spero almeno con AndEngine di poterci riuscire :)
 

fiaful

Member
Licensed User
Longtime User
Ciao Orazio... mi fa piacere vederti così motivato... spero che col tempo manterrai la stessa motivazione! ho spiegato tanto a tanta gente e poi questi hanno mollato... mi raccomando: non farmi perdere tempo anche tu! :) scherzo ovviamente... indipendentemente da tutto, se ti posso dire qualcosa di utile lo faccio più che volentieri...

premetto che anche io sono autodidatta, quindi so esattamente quello che provi... forse ho solo un po' di esperienza in più dato che sono più di trent'anni che macino codice ed ho vissuto in prima linea la storia di tutta l'informatica... detto questo vediamo di dire qualcosa di utile...

dalle domande che mi fai, prima di tutto devi avere ben chiara una cosa: il mondo 2D e il mondo 3D in comune hanno... niente...
non troverai nessun programma per modellare l'oggetto in 3D e disegnargli la grafica in 2D (in realtà esistono - ZBrush, 3DPaint, etc. - solo che costano un botto e non sono esattamente quello che intendi tu). Quindi per prima cosa ti servono ALMENO due programmi: uno per modellare in 3D, uno per creare le texture.

dico ALMENO 2 perchè generalmente se ne usano molti di più (uno specifico per gli shader, uno specifico per il rigging, uno per le animazioni, uno per le ambientazioni, uno per la riduzione dei poligoni, etc.)... ognuno specializzato nel suo campo... alcuni sono un po' più generici e cercano di coprire più campi (e lo fanno abbastanza bene, come Blender), altri sono meno generici ma più semplici da utilizzare (come Wings3D e Silo, che per me sono i modellatori migliori in assoluto... hanno una curva di apprendimento molto rapida e una volta che ci hai preso mano in poche ore di lavoro riesci a fare cose fantastiche!)

se il tuo scopo è quello di animare semplicemente oggetti 2D, le conoscenze che ti servono sono veramente di base... ogni sprite è semplicemente una texture applicata ad una superficie quadrata (pertanto costituita da 2 soli poligoni o da un quad), con illuminazione massima con sorgente all'infinito e perpendicolare alla scena (per essere visualizzata con i reali colori della texture). In questo caso le animazioni degli sprite sono dati semplicemente dal cambio della texture e l'unico software che ti serve è un buon programma di grafica (come ad esempio può essere The Gimp, senza andare a scomodare Photoshop)

se invece vuoi animare "oggetti" 3d (che in gergo si chiamano mesh), il discorso è mooooolto più vasto. intanto va detto che una qualsiasi mesh è un insieme di due o più poligni, congiunti tra loro, organizzati su piani diversi. ad esempio un cubo è una mesh costituita di 6 facce (12 o poligoni o 6 quad), dislocati su sei piani rispettivamente paralleli e perpendicolari tra di loro nelle 3 dimensioni. Un quad è un insieme di 2 poligoni che si trovano sullo stesso piano (in pratica il risultato è un quadrilatero).

un poligono è una superficie triangolare che ha una o due facce (quella rivolta verso di te che vedi e quella che non vedi alle sue spalle - verrebbe naturale dire che ha sempre due facce ma in realtà dipende da come imposti il motore 3d, nella sua proprietà chiamata Cull-mode... spesso viene rimossa la faccia opposta alla normale per evitare al processore calcoli inutili - se non la vedo perchè dovrei calcolarla? in realtà esistono casi in cui serve eccome), 3 lati (detti edge), 3 vertici (detti vertex), 1 normale (la "normale" è una linea immaginaria che parte dal centro del poligono e viaggia all'infinito verso il punto di osservazione e rappresenta la direzione della luce che colpirà il poligono).

il poligono è l'unità di misura della potenza di una scheda video accelerata 3D (o per meglio dire i milioni di poligoni al secondo). le cifre possono sembrare sbalorditive ma in realtà non lo sono... non lo sono mai... per rendere l'idea... diciamo che un processore video può elaborare 1 milione di poligoni al secondo. Se l'immagine fosse fissa non sarebbe male... ma noi vogliamo animare la scena... quindi siccome per l'occhio umano tutto quello che va al di sotto dei 25 fotogrammi (frame) al secondo "scatta", noi dobbiamo suddividere la nostra potenza per almeno 25... quindi il nostro milione di poligoni al secondo diventano 40000 poligoni per frame (che ti assicuro sono una inezia) da dividere ulteriormene per tutti gli oggetti della scena. se la nostra scena ha 100 oggetti ogni oggetto non potrà essere più grande di 400 poligoni, altrimenti la nostra animazione andrà a scatti. Fortunatamente per noi le schede video gestiscono diversi milioni di poligoni al secondo... sfortunatamente per noi sono sempre troppo pochi. :)

un modellatore (in gergo modeler 3d) è un programma che ti dà la possibilità di lavorare sui poligoni. La maggior parte dei modellatori lavora a partire da oggetti solidi (ad esempio wings3d ti da la possibilità di aggiungere un cubo, una sfera, un cilindro, etc.), consentendoti poi di tirare i vertici o di aggiungerne di nuovi sugli edge, pochi sono quelli che ti danno la possibilità di lavorare direttamente sui vertici e le superfici (come blender e silo) potendoli aggiungere nello spazio vuoto. I modellatori del secondo tipo ti danno una libertà maggiore ma ovviamente sono molto più complessi da utilizzare in quanto demandano a te aspetti come la chiusura del solido o la disposizione delle normali; mentre i modellatori del primo tipo sono un po' più rigidi ma sono più semplici da utilizzare e molti aspetti se li curano loro. Quelli del primo tipo diventano un incubo se gli fai importare una mesh esportata in maniera non corretta da un altro programma, ad esempio se si sono perse le informazioni sulle normali... rischi di dover gettar via tutto il lavoro svolto (ad esempio se esporti un obj da 3dstudio e lo carichi in blender o in wings3d non ti resta che piangere perchè 3dstudio esporta gli obj in un formato non standard al 100%).

pronta la mesh, iniziare lo skinning (da skin, pelle) ovvero devi applicargli sopra una (o più) texture. la texture è il "rivestimento" della mesh... immagina di voler rivestire un cuscino di una sedia. la texture è la stoffa con cui rivestirai il cuscino. mettiamo che la tua stoffa sia a quadrettoni ma che tu abbia una predilezione per i rombi... decidi di voler ruotare la stoffa per creare l'effetto rombo o di aggricciarla in alcuni punti per avere un effetto meno omogeneo... è tutto quello che puoi fare con le texture tramite la mappatura uv. l'UV mapping consiste nel comunicare al software che andrà ad applicare la texture come vogliamo applicarla. dato che X, Y, e Z sono già utilizzate per indicare gli assi 3d, le coordinate 2d delle texture utilizzano le lettere U e V per indicare le ascisse e le ordinate (ecco spiegato perchè si chiama UV mapping). la mappatura parte dall'unwrap (sviluppo) della mesh, ovvero si ottiene una versione della mesh aperta ed appiattita in 2d (come quando vuoi costruire un cubo con un unico pezzo di carta). a questo punto i poligoni della mesh vengono sovrapposti all'immagine della texture e si tirano i singoli vertici fino a farli combaciare con le zone della texture di interesse. terminata la mappatura, viene rieseguito il wrap (avvolgimento della mesh con la texture mediante la mappatura), e la mesh appare colorata. se in fase di mappatura un poligono viene rimpicciolito, ristretto o allargato, la porzione di immagine mappata su quel poligono subirà automaticamente la stessa sorte per adattarsi alla nuova dimensione (ed è per questo motivo che quando animi una mesh le immagini non se ne vanno per i fatti propri... perchè ogni poligono viene modificato e l'immagine gli va dietro).

oltre alle texture, lo skinning prevede anche la definizione degli shader. gli shader sono un'insieme di proprietà che influenzano in che modo la luce deve comportarsi con la superficie. ad esempio se un dato poligono è di plastica sarà meno riflettente di un poligono di metallo ma più riflettente di un poligono di stoffa... mentre un poligono di vetro lascerà passare un certo quantitativo di luce ed avrà una certa trasparenza.

l'insieme delle texture e degli shader prende il nome di materiale (material). un materiale possiede tutte le caratteristiche di visualizzazione di uno o più poligoni.

se si vuole animare una mesh, il passo successivo è quello di costruirgli uno scheletro. infatti le animazioni delle mesh vengono dette skeletal animations e seguono le regole della cinematica inversa. vediamo una cosa per volta... uno scheletro è costruito esattamente come il nostro: ci sono punti di giunzione (joint) ed ossa (bones). i joint sono i punti che collegano 2 o più bones e, al tempo stesso, li vincolano tra di loro (nello stesso modo in cui non puoi staccarti un dito dalla mano o ruotarlo all'indietro di 180 gradi). Wings3D si ferma alla modellazione e all'applicazione delle texture, mentre blender (ma anche 3dstudio, XSI, Zbrush, Poser, etc.), ad esempio, consente anche di definire gli shader e di definire, applicare ed animare uno scheletro. Definito lo scheletro, lo si può animare mediante la cinematica inversa (inverse kinematic - è un parolone che sta semplicemente ad indicare che metti le singole ossa nella posizione desiderata a determinati punti nel tempo ed il programma genera in automatico i passi intermedi in cui le ossa dovranno trovarsi istante per istante nell'animazione. es. voglio che in un secondo il mio omino alzi la gamba destra: al secondo 0 imposto la gamba giù, al secondo 1 imposto la gamba su... il programma genera tutti i passi intermedi per cui al secondo 0.5 - frame 12 - la gamba sarà a metà).

definito e animato lo scheletro occorre passare al rigging, operazione che consiste nell'associare i vertici della mesh ai singoli bones, in modo che l'animazione dello scheletro si ripercuota sulla mesh animandola. tutti i programmi che consentolo la definizione dello scheletro consentono anche il rig. nel corso degli anni il rigging si è evoluto mostruosamente arrivando a definire anche i livelli di potenza dei vertici (ovvero la distanza tra vertici appartenenti a bones diversi che incidono sul vertice in esame) riuscendo ad ottenere effetti come il rigonfiamento dei muscoli alla flessione di un arto.

come detto in precedenza, ci sono diverse cose che devi tenere in considerazione, una di queste è senz'altro il numero di poligoni. esistono dei software in giro che si occupano esclusivamente di ridurre il numero dei poligoni delle mesh, tentando quanto più possibile di mantenere inalterata la qualità (questo viene fatto interpolando poligoni contigui ricorsivamente fino ad ottenere il numero di poligoni richiesto). un ruolo fondamentale nella resa di una mesh con poligoni ridotti lo giocano le texture. spesso vengono disegnate texture grossolane, applicate a mesh con numero di poligoni immenso, proiettate luci sulle mesh, catturate le texture con i giochi di luce così creati e risalvate, ridotte le mesh a numero decente di poligoni e riapplicate le texture catturate con i giochi di luce... l'effetto è strabiliante (ma l'unico programma che conosco in grado di fare una cosa del genere è XSI della softimage. Considera che con XSI c'hanno fatto tutti i giochi di Assassin's creed).

altra cosa da tenere in considerazione è il lod (level of detail)... consiste nella possibilità di definire più mesh per lo stesso oggetto, con numero di poligoni sempre inferiore (appunto livello di dettaglio), da utilizzare a distanze diverse dal punto di osservazione... es. se sono vicino ad una mucca, è giusto che la veda ben definita, magari con 10000 poligoni... se mi sto allontanando dalla mucca magari mi bastano 1000 poligoni per vederla comunque bene... se sono lontano dalla mucca tale per cui essa mi appare sullo schermo delle dimensioni di 4 pixel per 3 a che mi servono 10000 poligoni? eppure il processore calcolerebbe (e calcola) 10000 poligoni anche in questo ultimo caso... quando magari di poligoni me ne bastano 2 con su disegnata l'icona di una mucca! è qui che entra in gioco il lod.

un altro ruolo fondamentale nella resa grafica lo gioca proprio il motore grafico. se esso è ingrado di effettuare in automatico lo smoothing della mesh è sicuramente da apprezzare. lo smoothing è un procedimento utilizzato prevalentemente nel rendering (rappresentazioni fotorealistiche statiche utilizzate come foto o frame per animazioni) delle scene e consiste nella possibilità di realizzare mesh non troppo definite (meno poligoni = + memoria, + velocità nel lavoro, - compilazioni), che verranno poi "smussate" dal motore grafico. un game engine con questa caratteristica è stato utilizzato dalla illusion soft (una software house che crea videogiochi a sfondo sessuale... ma non sono mai riuscito a capire molto perchè il sito è tutto in giapponese... però sono riuscito a carpire quale modeler utilizzano... si chiama metasequoia... ho anche provato ad utilizzarlo e non è male)... le loro mesh non sono molto definite ma la resa del motore fa la differenza (basta dare un occhio ad Artificial Girl 3).

tutte queste operazioni ti servono per animare un personaggio... ma per costruire una scena ti servono altri pezzi... ti servono le ambientazioni (i fondali e gli elementi decorativi) e le luci.

la realizzazione dei fondali e degli elementi decorativi segue le stesse indicazioni delle altre mesh se non per il fatto che le ambientazioni vanno create a risoluzione di poligoni veramente basse (per una casa può bastare anche poco più un cubo con le giuste texture). soprattutto per ambientazioni esterne, in cui il campo di vista può andare all'infinito (quindi avresti teoricamente infiniti poligoni da visualizzare), spesso si usa aggiungere l'effetto nebbia (fog) (in questo silent hill docet), previsto da qualsiasi motore 3d, che consente di non far elaborare tutti i poligoni che cadono oltre un certo piano posto perpendicolarmente al punto di vista e posto alla distanza desiderata. poco prima di tale piano la scena viene sfumata (da lì "effetto nebbia")

poi ci sono i trucchetti per simulare le condizioni atmosferiche, il passaggio tra giorno e notte, ... ma mi sa che ho già messo troppa carne al fuoco...

anche le luci meriterebbero un'altra trattazione a sè... io direi di iniziare da qui...

e poi ci sono tanti altri elementi come fisica, collisioni, audio, ... ma di questo già dovresti sapere qualcosa visto che un giochino l'hai già fatto... ed è pure carino...

ora non dirmi che ti è passata la voglia però, eh? :)

resto a disposizione per qualsiasi chiarimento tu voglia.
 

Orazio8909

Member
Licensed User
Longtime User
Ciao Orazio... mi fa piacere vederti così motivato... spero che col tempo manterrai la stessa motivazione! ho spiegato tanto a tanta gente e poi questi hanno mollato... mi raccomando: non farmi perdere tempo anche tu! :) scherzo ovviamente... indipendentemente da tutto, se ti posso dire qualcosa di utile lo faccio più che volentieri...

premetto che anche io sono autodidatta, quindi so esattamente quello che provi... forse ho solo un po' di esperienza in più dato che sono più di trent'anni che macino codice ed ho vissuto in prima linea la storia di tutta l'informatica... detto questo vediamo di dire qualcosa di utile...

dalle domande che mi fai, prima di tutto devi avere ben chiara una cosa: il mondo 2D e il mondo 3D in comune hanno... niente...
non troverai nessun programma per modellare l'oggetto in 3D e disegnargli la grafica in 2D (in realtà esistono - ZBrush, 3DPaint, etc. - solo che costano un botto e non sono esattamente quello che intendi tu). Quindi per prima cosa ti servono ALMENO due programmi: uno per modellare in 3D, uno per creare le texture.

dico ALMENO 2 perchè generalmente se ne usano molti di più (uno specifico per gli shader, uno specifico per il rigging, uno per le animazioni, uno per le ambientazioni, uno per la riduzione dei poligoni, etc.)... ognuno specializzato nel suo campo... alcuni sono un po' più generici e cercano di coprire più campi (e lo fanno abbastanza bene, come Blender), altri sono meno generici ma più semplici da utilizzare (come Wings3D e Silo, che per me sono i modellatori migliori in assoluto... hanno una curva di apprendimento molto rapida e una volta che ci hai preso mano in poche ore di lavoro riesci a fare cose fantastiche!)

se il tuo scopo è quello di animare semplicemente oggetti 2D, le conoscenze che ti servono sono veramente di base... ogni sprite è semplicemente una texture applicata ad una superficie quadrata (pertanto costituita da 2 soli poligoni o da un quad), con illuminazione massima con sorgente all'infinito e perpendicolare alla scena (per essere visualizzata con i reali colori della texture). In questo caso le animazioni degli sprite sono dati semplicemente dal cambio della texture e l'unico software che ti serve è un buon programma di grafica (come ad esempio può essere The Gimp, senza andare a scomodare Photoshop)

se invece vuoi animare "oggetti" 3d (che in gergo si chiamano mesh), il discorso è mooooolto più vasto. intanto va detto che una qualsiasi mesh è un insieme di due o più poligni, congiunti tra loro, organizzati su piani diversi. ad esempio un cubo è una mesh costituita di 6 facce (12 o poligoni o 6 quad), dislocati su sei piani rispettivamente paralleli e perpendicolari tra di loro nelle 3 dimensioni. Un quad è un insieme di 2 poligoni che si trovano sullo stesso piano (in pratica il risultato è un quadrilatero).

un poligono è una superficie triangolare che ha una o due facce (quella rivolta verso di te che vedi e quella che non vedi alle sue spalle - verrebbe naturale dire che ha sempre due facce ma in realtà dipende da come imposti il motore 3d, nella sua proprietà chiamata Cull-mode... spesso viene rimossa la faccia opposta alla normale per evitare al processore calcoli inutili - se non la vedo perchè dovrei calcolarla? in realtà esistono casi in cui serve eccome), 3 lati (detti edge), 3 vertici (detti vertex), 1 normale (la "normale" è una linea immaginaria che parte dal centro del poligono e viaggia all'infinito verso il punto di osservazione e rappresenta la direzione della luce che colpirà il poligono).

il poligono è l'unità di misura della potenza di una scheda video accelerata 3D (o per meglio dire i milioni di poligoni al secondo). le cifre possono sembrare sbalorditive ma in realtà non lo sono... non lo sono mai... per rendere l'idea... diciamo che un processore video può elaborare 1 milione di poligoni al secondo. Se l'immagine fosse fissa non sarebbe male... ma noi vogliamo animare la scena... quindi siccome per l'occhio umano tutto quello che va al di sotto dei 25 fotogrammi (frame) al secondo "scatta", noi dobbiamo suddividere la nostra potenza per almeno 25... quindi il nostro milione di poligoni al secondo diventano 40000 poligoni per frame (che ti assicuro sono una inezia) da dividere ulteriormene per tutti gli oggetti della scena. se la nostra scena ha 100 oggetti ogni oggetto non potrà essere più grande di 400 poligoni, altrimenti la nostra animazione andrà a scatti. Fortunatamente per noi le schede video gestiscono diversi milioni di poligoni al secondo... sfortunatamente per noi sono sempre troppo pochi. :)

un modellatore (in gergo modeler 3d) è un programma che ti dà la possibilità di lavorare sui poligoni. La maggior parte dei modellatori lavora a partire da oggetti solidi (ad esempio wings3d ti da la possibilità di aggiungere un cubo, una sfera, un cilindro, etc.), consentendoti poi di tirare i vertici o di aggiungerne di nuovi sugli edge, pochi sono quelli che ti danno la possibilità di lavorare direttamente sui vertici e le superfici (come blender e silo) potendoli aggiungere nello spazio vuoto. I modellatori del secondo tipo ti danno una libertà maggiore ma ovviamente sono molto più complessi da utilizzare in quanto demandano a te aspetti come la chiusura del solido o la disposizione delle normali; mentre i modellatori del primo tipo sono un po' più rigidi ma sono più semplici da utilizzare e molti aspetti se li curano loro. Quelli del primo tipo diventano un incubo se gli fai importare una mesh esportata in maniera non corretta da un altro programma, ad esempio se si sono perse le informazioni sulle normali... rischi di dover gettar via tutto il lavoro svolto (ad esempio se esporti un obj da 3dstudio e lo carichi in blender o in wings3d non ti resta che piangere perchè 3dstudio esporta gli obj in un formato non standard al 100%).

pronta la mesh, iniziare lo skinning (da skin, pelle) ovvero devi applicargli sopra una (o più) texture. la texture è il "rivestimento" della mesh... immagina di voler rivestire un cuscino di una sedia. la texture è la stoffa con cui rivestirai il cuscino. mettiamo che la tua stoffa sia a quadrettoni ma che tu abbia una predilezione per i rombi... decidi di voler ruotare la stoffa per creare l'effetto rombo o di aggricciarla in alcuni punti per avere un effetto meno omogeneo... è tutto quello che puoi fare con le texture tramite la mappatura uv. l'UV mapping consiste nel comunicare al software che andrà ad applicare la texture come vogliamo applicarla. dato che X, Y, e Z sono già utilizzate per indicare gli assi 3d, le coordinate 2d delle texture utilizzano le lettere U e V per indicare le ascisse e le ordinate (ecco spiegato perchè si chiama UV mapping). la mappatura parte dall'unwrap (sviluppo) della mesh, ovvero si ottiene una versione della mesh aperta ed appiattita in 2d (come quando vuoi costruire un cubo con un unico pezzo di carta). a questo punto i poligoni della mesh vengono sovrapposti all'immagine della texture e si tirano i singoli vertici fino a farli combaciare con le zone della texture di interesse. terminata la mappatura, viene rieseguito il wrap (avvolgimento della mesh con la texture mediante la mappatura), e la mesh appare colorata. se in fase di mappatura un poligono viene rimpicciolito, ristretto o allargato, la porzione di immagine mappata su quel poligono subirà automaticamente la stessa sorte per adattarsi alla nuova dimensione (ed è per questo motivo che quando animi una mesh le immagini non se ne vanno per i fatti propri... perchè ogni poligono viene modificato e l'immagine gli va dietro).

oltre alle texture, lo skinning prevede anche la definizione degli shader. gli shader sono un'insieme di proprietà che influenzano in che modo la luce deve comportarsi con la superficie. ad esempio se un dato poligono è di plastica sarà meno riflettente di un poligono di metallo ma più riflettente di un poligono di stoffa... mentre un poligono di vetro lascerà passare un certo quantitativo di luce ed avrà una certa trasparenza.

l'insieme delle texture e degli shader prende il nome di materiale (material). un materiale possiede tutte le caratteristiche di visualizzazione di uno o più poligoni.

se si vuole animare una mesh, il passo successivo è quello di costruirgli uno scheletro. infatti le animazioni delle mesh vengono dette skeletal animations e seguono le regole della cinematica inversa. vediamo una cosa per volta... uno scheletro è costruito esattamente come il nostro: ci sono punti di giunzione (joint) ed ossa (bones). i joint sono i punti che collegano 2 o più bones e, al tempo stesso, li vincolano tra di loro (nello stesso modo in cui non puoi staccarti un dito dalla mano o ruotarlo all'indietro di 180 gradi). Wings3D si ferma alla modellazione e all'applicazione delle texture, mentre blender (ma anche 3dstudio, XSI, Zbrush, Poser, etc.), ad esempio, consente anche di definire gli shader e di definire, applicare ed animare uno scheletro. Definito lo scheletro, lo si può animare mediante la cinematica inversa (inverse kinematic - è un parolone che sta semplicemente ad indicare che metti le singole ossa nella posizione desiderata a determinati punti nel tempo ed il programma genera in automatico i passi intermedi in cui le ossa dovranno trovarsi istante per istante nell'animazione. es. voglio che in un secondo il mio omino alzi la gamba destra: al secondo 0 imposto la gamba giù, al secondo 1 imposto la gamba su... il programma genera tutti i passi intermedi per cui al secondo 0.5 - frame 12 - la gamba sarà a metà).

definito e animato lo scheletro occorre passare al rigging, operazione che consiste nell'associare i vertici della mesh ai singoli bones, in modo che l'animazione dello scheletro si ripercuota sulla mesh animandola. tutti i programmi che consentolo la definizione dello scheletro consentono anche il rig. nel corso degli anni il rigging si è evoluto mostruosamente arrivando a definire anche i livelli di potenza dei vertici (ovvero la distanza tra vertici appartenenti a bones diversi che incidono sul vertice in esame) riuscendo ad ottenere effetti come il rigonfiamento dei muscoli alla flessione di un arto.

come detto in precedenza, ci sono diverse cose che devi tenere in considerazione, una di queste è senz'altro il numero di poligoni. esistono dei software in giro che si occupano esclusivamente di ridurre il numero dei poligoni delle mesh, tentando quanto più possibile di mantenere inalterata la qualità (questo viene fatto interpolando poligoni contigui ricorsivamente fino ad ottenere il numero di poligoni richiesto). un ruolo fondamentale nella resa di una mesh con poligoni ridotti lo giocano le texture. spesso vengono disegnate texture grossolane, applicate a mesh con numero di poligoni immenso, proiettate luci sulle mesh, catturate le texture con i giochi di luce così creati e risalvate, ridotte le mesh a numero decente di poligoni e riapplicate le texture catturate con i giochi di luce... l'effetto è strabiliante (ma l'unico programma che conosco in grado di fare una cosa del genere è XSI della softimage. Considera che con XSI c'hanno fatto tutti i giochi di Assassin's creed).

altra cosa da tenere in considerazione è il lod (level of detail)... consiste nella possibilità di definire più mesh per lo stesso oggetto, con numero di poligoni sempre inferiore (appunto livello di dettaglio), da utilizzare a distanze diverse dal punto di osservazione... es. se sono vicino ad una mucca, è giusto che la veda ben definita, magari con 10000 poligoni... se mi sto allontanando dalla mucca magari mi bastano 1000 poligoni per vederla comunque bene... se sono lontano dalla mucca tale per cui essa mi appare sullo schermo delle dimensioni di 4 pixel per 3 a che mi servono 10000 poligoni? eppure il processore calcolerebbe (e calcola) 10000 poligoni anche in questo ultimo caso... quando magari di poligoni me ne bastano 2 con su disegnata l'icona di una mucca! è qui che entra in gioco il lod.

un altro ruolo fondamentale nella resa grafica lo gioca proprio il motore grafico. se esso è ingrado di effettuare in automatico lo smoothing della mesh è sicuramente da apprezzare. lo smoothing è un procedimento utilizzato prevalentemente nel rendering (rappresentazioni fotorealistiche statiche utilizzate come foto o frame per animazioni) delle scene e consiste nella possibilità di realizzare mesh non troppo definite (meno poligoni = + memoria, + velocità nel lavoro, - compilazioni), che verranno poi "smussate" dal motore grafico. un game engine con questa caratteristica è stato utilizzato dalla illusion soft (una software house che crea videogiochi a sfondo sessuale... ma non sono mai riuscito a capire molto perchè il sito è tutto in giapponese... però sono riuscito a carpire quale modeler utilizzano... si chiama metasequoia... ho anche provato ad utilizzarlo e non è male)... le loro mesh non sono molto definite ma la resa del motore fa la differenza (basta dare un occhio ad Artificial Girl 3).

tutte queste operazioni ti servono per animare un personaggio... ma per costruire una scena ti servono altri pezzi... ti servono le ambientazioni (i fondali e gli elementi decorativi) e le luci.

la realizzazione dei fondali e degli elementi decorativi segue le stesse indicazioni delle altre mesh se non per il fatto che le ambientazioni vanno create a risoluzione di poligoni veramente basse (per una casa può bastare anche poco più un cubo con le giuste texture). soprattutto per ambientazioni esterne, in cui il campo di vista può andare all'infinito (quindi avresti teoricamente infiniti poligoni da visualizzare), spesso si usa aggiungere l'effetto nebbia (fog) (in questo silent hill docet), previsto da qualsiasi motore 3d, che consente di non far elaborare tutti i poligoni che cadono oltre un certo piano posto perpendicolarmente al punto di vista e posto alla distanza desiderata. poco prima di tale piano la scena viene sfumata (da lì "effetto nebbia")

poi ci sono i trucchetti per simulare le condizioni atmosferiche, il passaggio tra giorno e notte, ... ma mi sa che ho già messo troppa carne al fuoco...

anche le luci meriterebbero un'altra trattazione a sè... io direi di iniziare da qui...

e poi ci sono tanti altri elementi come fisica, collisioni, audio, ... ma di questo già dovresti sapere qualcosa visto che un giochino l'hai già fatto... ed è pure carino...

ora non dirmi che ti è passata la voglia però, eh? :)

resto a disposizione per qualsiasi chiarimento tu voglia.

Ciao fiaful,
prima di tutto voglio ringraziarti per il "tempo" che perdi per me, io sono una persona che non si scoraggia facilmente, anzi il "fuoco" arde sempre più di giorno in giorno, ( io cmq provengo dall'automazione ovvero abbiamo ( io e mio padre, io software e lui hardware ) un laboratorio dove ci occupiamo di progettazione elettronica e applicazioni per l'automazione sia di macchine industriali che di robot ) detto questo, mi sono avvicinato da meno di 6 mesi ad oggi, a basic4android perchè cmq ho provato ad utilizzare java con eclipse però per scrivere "CIAO" ci sono troppe complicazioni non so se mi spiego XD in meno di 2 mesi ho realizzato Fast Click partendo da zero senza saper neanche dichiarare una variabile visto che non conoscevo la piattaforma. Ora il succo di tutto è che io voglio impegnarmi a realizzare un gioco in 2D per 3 motivi:

1. Soddisfazione personale ( come penso sia normale )
2. metterla sul market e guadagnare un pò
3. Cercare in qualche modo di far conoscere il mio nome ( non dico di diventare famoso ma quanto meno da superare i 500mila download in una sola APP)

diciamo che un pò mi hai scioccato perchè non conoscevo nulla di tutto questo fino ad ora, barcollo ma non crollo :) sabato mi metto all'opera e devo quanto meno riuscire a visualizzare lo sfondo della mia app utilizzando andengine.

una domanda. ma tu riesci ad utilizzare la libreria andengine? cmq scarico gimp e vedo se riesco a creare qualche texture senza perdere troppo tempo.
ti do notizie appena riesco nell'impresa :)
 

fiaful

Member
Licensed User
Longtime User
molto lieto di conoscerti! comprendo le tue difficoltà con eclipse... anche se prima o poi vedrai che ci passerai :) b4a è un gran progetto... ma a meno di non avere molte librerie a disposizione rimane poco più che un giocattolo... ma come vedi ci gioco volentieri anche io... :)

se il tuo obiettivo è arrivare fino al 2d, come ti dicevo sei molto avvantaggiato (nel senso che ci sono molte meno cose da studiare come hai visto)

andengine avevo iniziato ad utilizzarlo tempo fa... in un periodo in cui era di transizione tra GLES1 e GLES2... ora non so neanche a che punto sia... però devo dire che da soddisfazioni... su b4a temo sia molto difficile che tu riesca ad utilizzarla (non credo che esista un wrapper per b4a)... a meno di non lavorare pesantemente col Reflector...

mi sembra che qualcuno abbia sviluppato una qualche libreria per facilitare lo sviluppo di giochi... prova a dare un occhio all'elenco delle librerie aggiuntive.

comunque fammi sapere! e in bocca al lupo! :)
 

Orazio8909

Member
Licensed User
Longtime User
Ciao fiaful,
Come promesso mi sono messo all'opera con AndEngine, sono riuscito con soddisfazione a visualizzare lo sfondo, visto che l'ultima volta non partiva neanche il gioco, ora volevo modificare le dimensioni dello sfondo per adattarlo al tel e adesso non funziona più niente, volevo farti vedere il progetto per vedere se tu mi puoi aiutare, ho creato un archivio ZIP solo che qui max posso postare 512kb il file è 2,8Mb. Se puoi e se vuoi darci un'occhiata posso mandarti una mail al tuo indirizzo che non ho! :) fammi sapere.

Grazie.
 

Spinter

Active Member
Licensed User
Longtime User
Ciao fiaful,
Come promesso mi sono messo all'opera con AndEngine, sono riuscito con soddisfazione a visualizzare lo sfondo, visto che l'ultima volta non partiva neanche il gioco, ora volevo modificare le dimensioni dello sfondo per adattarlo al tel e adesso non funziona più niente, volevo farti vedere il progetto per vedere se tu mi puoi aiutare, ho creato un archivio ZIP solo che qui max posso postare 512kb il file è 2,8Mb. Se puoi e se vuoi darci un'occhiata posso mandarti una mail al tuo indirizzo che non ho! :) fammi sapere.

Grazie.
quando crei lo zip metti dwntro solo la cartella FILE con i file che servono,ad esempio il layout ,e il tuoprogetto.b4a vedrai che è tutto più piccolo!
 

fiaful

Member
Licensed User
Longtime User
Ciao fiaful,
Come promesso mi sono messo all'opera con AndEngine, sono riuscito con soddisfazione a visualizzare lo sfondo, visto che l'ultima volta non partiva neanche il gioco, ora volevo modificare le dimensioni dello sfondo per adattarlo al tel e adesso non funziona più niente, volevo farti vedere il progetto per vedere se tu mi puoi aiutare, ho creato un archivio ZIP solo che qui max posso postare 512kb il file è 2,8Mb. Se puoi e se vuoi darci un'occhiata posso mandarti una mail al tuo indirizzo che non ho! :) fammi sapere.

Grazie.

ti ho lasciato un messaggio privato su facebook col mio indirizzo e-mail... manda pure...
 

Orazio8909

Member
Licensed User
Longtime User
ti ho lasciato un messaggio privato su facebook col mio indirizzo e-mail... manda pure...
Ciao fiaful, sono tornato ira da lavoro, ho visto adesso il tuo post, non ho trovato l'email su facebook cmq ti ho postato ( suggerito da Spinter ) la cartella file + progetto + file.bas senza la cartella object vedi se cosi riesci ad aprirlo.. al limite mi rimandi la tua email che ti mando tutto la. Grazie ancora. cmq su facebook cerca Orazio Fasone.
 
Top