Development

Operation Flashpoint: Dragon Rising

Preparazione dei dati (parte 2)

[del 11/01/2010] [di Alessandro Monopoli]
In questo articolo parleremo della gestione dei danni sul personaggio. In un gioco delle dimensioni di OF:DR è necessario valutare attentamente il numero di draw call.
Sin dall’inizio si è scelto di avere la possibilità di danneggiare gravemente ogni personaggio in gioco, causandogli la perdita di un arto (un braccio, una gamba, ecc.).

Capiamo facilmente che questo aumenterebbe vertiginosamente il numero di draw call, poiché dovremmo spezzettare il personaggio in tante parti, in modo da poterle poi nascondere o rimuovere, sostituendole con una mesh che mostri il danno (muscoli, ossa e tutto quanto di bello si cela all’interno di noi).
Questa soluzione non è percorribile, quindi si e’ scelto di accettare un compromesso: la parte tagliata/rimossa non sarà più visibile, il che significa che se un personaggio perderà un braccio, tale braccio scomparirà.

È una scelta che, con un modesto impatto visivo, ricompensa con la possibilità di poter avere una grossa quantità di personaggi a schermo, anche tutti danneggiati, senza avere un significativo aumento delle draw call.

Per poter ottenere questo risultato, si è scelto di dividere il personaggio in tante parti, una per ogni pezzo di corpo che desideriamo poter togliere. Queste parti di corpo saranno in realtà dei frammenti di index buffer, funzionanti in questo modo:

Frammento 0 : da indice 0 a indice 50
Frammento 1 : da indice 51 a indice 200

…e così via. Per ottenere tali frammenti, si è scelto di avvalersi di una soluzione ibrida che utilizzi 3dsmax con un tool interno.

Con 3dsmax, tramite un multimaterial, si identificano tutte le parti interessate:

La medesima cosa verrà fatta con la mesh dei danni, che andrà a sostituire il pezzo che viene tolto. Sarà premura del grafico fare in modo che i bordi siano perfettamente coincidenti.


Il file esportato da Max avrà quindi effettivamente un nodo per ogni segmento, che è proprio quello che non vogliamo. Quindi,  e’ necessario sviluppare un tool che sia capace di fare questo:

caricare la mesh.
prendere tutti i nodi e costruire una unica mesh con tutti i suoi vertici. generando un corretto vertex ed index buffer.
salvare su un file in numero degli indici che identificano l’inizio e la fine di ogni segmento all’interno della mesh finale composta da un solo nodo.


Ora abbiamo quello che vogliamo: una mesh composta da un solo nodo, di cui abbiamo tutti i riferimenti all’index buffer.
In pratica, se saltiamo un segmento di index buffer, avremo un pezzo mancante dal corpo. Se al suo posto ci mettiamo il pezzo corrispondente di danno, ecco che abbiamo un corpo danneggiabile:

La sequenza per il rendering sarebbe quindi:

• disegnare il personaggio dal primo indice dell’index buffer fino a quello che inizia la parte che si vuole danneggiare.
• disegnare il personaggio dall’indice successivo alla parte che si vuole danneggiare fino alla fine.
• disegnare solamente il pezzetto interessato della mesh del danno.

Ovviamente se volessimo avere più di una parte danneggiata, dovremmo aumentare il numero di draw call, riducendo l’efficacia del sistema.

Con questo articolo termino la parte riguardante la preparazione dei dati: se doveste avere delle domande, fatelemele pure nei commenti e risponderò nel prossimo articolo, che  tratterà delle scelte in fase di caricamento dei dati.

Nel frattempo Operation Flashpoint: Dragon Rising è uscito nei negozi: spero che vi stia piacendo e di incontrarvi online per fare un po’ di guerra (ma sempre nel nome dell’amore).

« torna all'elenco sviluppo  •  tutti gli articoli correlati »

 
 

[lefantome[lev:1; v. p.:1; cash:57] postato il 12/01/2010 alle 14:03 [offline]

Non ho capito bene perchè potete disegnare solo una parte danneggiata per uomo.

Avete diviso la mesh dei danni a seconda del tipo di danno.
Ora mi pare di aver capito che la mesh dei danni coincide perfettamente con un modello molto usato o con diversi modelli.

Ora non potete evitare di disegnare due segmenti della mesh originaria e disegnare più di un segmento della mesh dei danni? Basta che le coordinate degli elementi della mesh dei danni rispecchino quelle del modello.

Se ho sparato una stronzata spero di essere corretto.

[AlexMonopoli[lev:1; v. p.:1; cash:350] postato il 12/01/2010 alle 17:52 [offline]

lefantome ha scritto:
Non ho capito bene perchè potete disegnare solo una parte danneggiata per uomo.

Avete diviso la mesh dei danni a seconda del tipo di danno.
Ora mi pare di aver capito che la mesh dei danni coincide perfettamente con un modello molto usato o con diversi modelli.

Ora non potete evitare di disegnare due segmenti della mesh originaria e disegnare più di un segmento della mesh dei danni? Basta che le coordinate degli elementi della mesh dei danni rispecchino quelle del modello.

Se ho sparato una stronzata spero di essere corretto.


Certo che si poteva, ma già così invece che una draw call ce ne sono tre. Se voglio due parti danneggiabili, il numero sarebbe salito di uno o di due. Per questo motivo si è scelto di avere solo una parte danneggiabile

Per il futuro abbiamo tanto novità da questo punto di vista

[lefantome[lev:1; v. p.:1; cash:57] postato il 12/01/2010 alle 18:58 [offline]

Allora non conosco bene come funziona una draw a livello base (devo studiarmi sempre queste cose)

Da quello che avevo inteso all'interno della draw andava a ricercarsi dall'esterno(o gli vengono passati) gli indici dei della vertex list da non utilizzare. Quindi per me la mesh dei danni era solo una mesh normale con una lista di vertici.

Non ho capito poi cosa intendi per i nodi della mesh.

Comunque al di là di tutto. Sono articoli molto interessanti, utili e molto comprensibili per entry level. Sopratutto perchè trattano di problematiche che un n00b come me ignora o non tiene di conto nei suoi piccoli progetti.

Spero che il lavoro ti permetta di scriverne più frequentemente asd

[AlexMonopoli[lev:1; v. p.:1; cash:350] postato il 12/01/2010 alle 20:26 [offline]

Per i seguiti, ci saranno altri articoli, questo è certo
Dopo di questo, si passa al rendering.

Per nodo di una mesh intendo un "pezzo" di mesh con un nome.

Cioè, immagina che invece che essere un personaggio sia una macchina. Rompo la macchina in tanti pezzi: le ruote, lo chassis, il motore e così via.

Teoricamente dovrei fare una draw call per ogunno di quei pezzi, mentre qui spiego come fare ad evitarlo per questo caso particolare
Li ho chiamati "nodi" perchè in 3dsmax sono rappresentati da dei nodi in un grafo

[lefantome[lev:1; v. p.:1; cash:57] postato il 12/01/2010 alle 20:47 [offline]

ah ho capito che sodo non avevo pensato a questo perchè mi pare che la gerarchia di xna sia model->meshes(un model contiene da 1 a tante meshes)

Ora se quando si esporta dal programma di modellazione 3d ogni insieme di poligoni che non ha un punto che combacia con un'altro viene considerato per forza una mesh differente. quello di cui parlavo non è possibile.

Altrimenti si tratta quindi di salvare quali intervalli di indici saltare e poi usarli per evitare di disegnare i triangoli che non ci interessano. In questo caso il modello conterrebbe solo una mesh e quindi un'unica lista di triangoli.

Non so se mi sono spiegato bene, è che mi mancano un pò le basi

 prosegui la discussione sul forum »

Operation Flashpoint: Dragon Rising gioco: Operation Flashpoint: Dragon Rising data di uscita:09/10/2009produzione:Codemasterssviluppo:Codemasters

galleria fotografica
Danno
Danni
multimaterial
OF:DR5
OF:DR1

vai alla gallery »

Alessandro Monopoli persona: Alessandro Monopoli ruolo:Experienced Programmer

sito web

articoli correlati  

Problematiche di rendering e trattamento dati in un gioco open world

Preparazione dei dati (parte 1)

Strategie per il tuning degli asset (parte 1)

GS programming

GS programmingLe categorie di suoni in un videogioco[di Davide Pensato] [01/10/2010]

Come abbiamo visto in precedenza, nel processo di produzione audio sono coinvolte molte figure professionali e i contenuti creati hanno caratteristiche diverse a seconda della loro funzione nel contesto del gioco. Possiamo individuare quattro categor...

[0]
 
Epic Games

Epic GamesProject Sword su dispositivi iOS[di Nicola Congia] [02/09/2010]

Project Sword di Epic, la vera star della conferenza di Apple la scorsa notte, è il primo gioco basato sull'Unreal Engine 3 per la piattaforma iOS, e molti pensano che questo sia un salto qualitativo importante in termini di grafica 3D per i disposi...

[0]
 
GS programming

GS programmingDiventare Audio Programmer[di Davide Pensato] [28/05/2010]

L'Audio Programmer è una figura professionale molto importante ma altrettanto difficile da trovare. È infatti un programmatore con competenze nel campo dell'audio. Come descritto in un precedente articolo, fino a qualche anno fa un programmator...

[0]
 
Operation Flashpoint: Dragon Rising

Operation Flashpoint: Dragon RisingStrategie per il tuning degli asset (parte 1)[di Alessandro Monopoli] [10/03/2010]

Per questo articolo usciamo un pochino dal seminato e non parleremo di cose direttamente legate con OF:DR. Vorrei discutere con voi di alcune strategie per il tuning degli asset, in particolare le texture, per poter avere la massima qualità in og...

[0]
 

tutti gli articoli di sviluppo »

  
  |  REGISTRATI »