http://gamequiz.altervista.org/portale/themes/marinelli/img/banners/gamequizBIG2.png


Terrain rederer
 

 
Data : 2011-05-19
 
Il renderer del terreno
Il renderer del terreno può essere utilizzato per creare terreni giganti dalle HeightMap ( mappe di altezza : è un immagine in bianco e nero) . Esso utilizza le tecniche più efficienti per il rendering di grandi dettagli dei terreni disponibili. Questi sono chiamati geo-mip-mapping e Splatting texture.
Dal momento che è difficile capire correttamente come usare il renderer del terreno ,( senza sapere come funzionano tali tecniche ), vi verrà spiegato qui :
Geo-mip-mapping e texture Splatting
Allora, cose è geo-mip-mapping? è una tecnica utilizzata per creare diversi livelli di dettaglio per i terreni in modo efficiente. Il terreno viene diviso in un paio di piastrelle quadrate ( Tiles ).
 
Ognuna di queste mattonelle ( Tiles ) ha cinque diverse LoDs con un numero di triangoli nella gamma 512-2.
A causa della struttura efficiente del LoDs tutti possono utilizzare lo stesso vertice buffer .
Il seguente grafico mostra differenti viste dei LoDs :
 

 
A seconda della differenza di altezza della piastrella ( Tile ) e la distanza dalla fotocamera, Ultimate3D deciderà quale livello di dettaglio deve essere utilizzato per il rendering della piastrella( Tile ). Questa estrema varietà del LoDs rende il renderer del terreno incredibilmente efficiente. Un problema che spesso ci si trova ad affrontare durante il rendering del terreno, è come ottenere una buona texture per esso. Ogni parte del terreno deve avere un colore diverso, ma una textura ( immagine ) che copre l'intero terreno sarebbe o estremamente grande o estremamente undetailed. Ciò non è auspicabile. Una tecnica sarebbe quello di utilizzare una mappa dettagliata , ma nemmeno questo metodo è buono.
 
Per questo motivo vi è una tecnica chiamata Splatting texture. Quando si utilizza Splatting texture, è possibile utilizzare molte più diverse texture del terreno , esse verranno wrapped sul terreno ( wrapped è la stesso dei Tiles ma in questo caso relativo alla textura e non alla mesh del terreno ). Quindi è possibile utilizzare le mappe alfa per definire le trasparenze delle texture in punti diversi. Il seguente grafico illustra come funziona:
 

 
Splatting Texture ti dà la possibilità di rendere il vostro terreno con un look davvero dettagliato e vivace.
è possibile utilizzare una texture stone ( immagine di pietra ) per le colline del terreno , ed delle texture d' erba per le superfici piane.
Inoltre, è possibile utilizzare una texture di neve sulle cime del monti e ultimo ma non meno importante è possibile utilizzare una textura separata per i percorsi ( strade) dove il personaggio ci camminerà sopra. Si noti che Splatting texture richiede il supporto per multi texturing con almeno due texture. Ciò significa che il valore di ritorno di GetSimultaneousTextureCount () deve essere > = 2 ( maggiore o pari a 2 ) .
 
Using the terrain renderer ( Utilizzare il renderer del terreno )
 
Utilizzare il renderer del terreno è veramente facile. La cosa difficile è rendere le mappe diffuse, altezza e alpha (ci sono programmi per fare questo). Ma non è questo l'argomento al momento. Qui si impara come creare il terreno, e come impostare le texture differenti per esso. Come con qualsiasi altro oggetto in Ultimate 3D, un terreno necessita di una propria Game Maker object . E di nuovo si deve creare un paio di variabili prima di creare il terreno.
 
Ecco un elenco:
 
x, y, z
L'origine del terreno. Ogni punto sul terreno avrà una x, y, z coordinate che è superiore al valore della variabile corrispondente.
 
height_map
Il file che contiene la mappa dell' altezza che si desidera utilizzare per la creazione del terreno.
 
Questo potrebbe essere, ad esempio, "gfx /TerrainHeightMap.png". La mappa di altezza può essere in scala di grigio, ma se hai bisogno di più precisione si può anche usare tutti i canali per specificare l' altezza. La formula, che viene utilizzata per ottenere l' altezza del vertice dai colori R, G, B, A con valori nella gamma da 0 a 255 , è :
 
tile_count_x, tile_count_y
Il numero di piastrelle (tile) lungo l'asse x e l'asse y. Queste sono due delle tre dimensioni importanti che danno la dimensione del terreno. Esse definiscono anche il livello di dettaglio del terreno e quanto tempo di calcolo e di memoria sarà necessario per il rendering e la sua creazione . Dal momento che un terreno è costituito da geometria molto complessa e dettagliata non si devono usare valori troppo alti :
100 * 100 sarebbero già molto grandi, tale geometria richiederebbe circa 57 MB di RAM.
 
tile_size
Questo è il terzo valore che è importante per le dimensioni del terreno. Dà la dimensione lungo la x e y asse di ogni piastrella (tile) nello spazio globale. Dal momento che le piastrelle sono sempre quadrate questo è solo un valore.
 
height (altezza del terreno)
Un pixel nero nella height map (mappa di altezza) si tradurrebbe in un terreno z-posizione che è pari al valore della variabile z, mentre un pixel bianco nella height map (mappa di altezza) porterebbe ad un z-posizione che è pari a z + height .
 
base_texture
Una stringa che fornisce il file che contiene la prima textura che deve essere applicata al terreno. Questa textura non ha bisogno di una mappa alpha, in quanto non coprirà eventuali altre texture.
 
wrap_count_x, wrap_count_y
Il wrap (avvolgere) conteggio lungo la assi x e y per la prima texture. Il conteggio wrap (avvolgere) è un valore che definisce quanto spesso la trama è da ripetere. Di solito i valori di queste variabili sono molto simili a quelli che hai impostato per la tile_count_x variabili e tile_count_y.
 
terrain_lod (opzionale)
Il livello di fattore di dettaglio per il terreno che influenza il modo in cui Ultimate 3D sceglierà gli LoDs per il rendering delle piastrelle (tile). Questo valore è facoltativo per cui non c'è bisogno di configurarlo. In questo caso Ultimate 3D userà 1 come fattore di LoD. Se si imposta un valore inferiore a 1, maggiore LoDs saranno utilizzati, se si immette un valore più alto, meno LoDs saranno utilizzati.
 
light_map_resolution (opzionale)
La risoluzione che deve essere usata per light map la ( mappatura della luce , vedi sotto per ulteriori informazioni ). Per default è 256. Una mappa luce è utilizzata per l' intero terreno . Il valore di questa variabile deve essere una potenza di due.
 
alpha_map_resolution (opzionale)
La risoluzione che deve essere usata per la alpha map (mappatura della trasparenza ) di ogni piastrella. Per default è 32. Ogni piastrella del terreno ha il suo set di alpha map , i valori grandi per questa variabile comporta l'utilizzo di molta memoria. Un buon valore per questo si trova di solito in qualche luogo intorno al . Il valore di questa variabile deve essere una potenza di due.
 
Dopo aver impostato su queste variabili è possibile chiamare CreateTerrain() una volta, per creare il terreno e associarlo all' object che ha richiamato tale funzione. Poi si devono aggiungere le altre texture al terreno. Se non ci sono altre texture che devono essere applicate, basta chiamare ApplyTerrainTextures (). Poichè i terreni sono oggetti molto statici non devi mettere Step () nell' evento step dell' object .
 
Tuttavia, devi mettere Destroy () nell' evento di distruzione.
 
Se si desidera utilizzare più di una texture utilizzando Splatting texture, devi aggiungere altre chiamate della funzione dopo CreateTerrain () e prima di ApplyTerrainTextures (). Poichè ogni texturacopre le texture che sono state applicate in base all' ordine di chiamata della funzione . Ecco la funzione:
 
Questa funzione aggiunge una texture per il terreno è chiamato con, utilizzando texture Splatting:
 
AddTerrainTexture ( DiffuseMap, Mappatura alpha, WrapCountX, WrapCountY, AlphaMapChannel )
 
DiffuseMap
Una stringa che fornisce il file che contiene la mappa diffusa che si desidera aggiungere al terreno.
 
Mappatura alpha
Una stringa che fornisce il file che contiene la mappa alfa che si desidera utilizzare.
 
WrapCountX, WrapCountY
Il conteggio avvolgente lungo l asse x e y per questa diffuse map (mappa diffusa). Il conteggio wrap ( avvolge) è un valore che definisce quanto spesso la textura è ripetuta. Per rendere un po' meno ovvio che la texture si ripete, si dovrebbe utilizzare differenti wrap count per differenti texture .
 
AlphaMapChannel
Il canale del file di mappatura dell' alfa, da cui l'informazione è da prendere. Questo può essere 0 per usare la luminosità (per le mappe alfa in scala di grigi), 1 per utilizzare il canale rosso, 2 per usare il canale verde, 3 per utilizzare il canale blu o 4 per usare il canale alfa.
 
Grazie a questo parametro un file della mappatura della trasparenza ( alfa ) può contenere mappe alpha per le mappe più diffuse.
 
Questo è tutto quello che c'è da sapere sulla creazione di terreni. Con queste poche funzioni è possibile creare paesaggi giganti che sembrano abbastanza dettagliati. Questo non sarebbe possibile con i normali modelli di terreno. Così il renderer terreno è una benedizione per le persone che vogliono fare giochi con molti grandi livelli da giocare nel mondo esterno.
 
Ci sono anche due utili funzioni per recuperare informazioni su un oggetto del terreno in una determinata posizione. Uno può essere utilizzata per ottenere l' altezza del terreno a una particolare posizione, l' altro può essere usato per scoprire quale textura è fortemente utilizzata in una particolare posizione . Ecco la loro descrizione:
 
Questa funzione restituisce l'altezza di un dato object terreno in una determinata posizione. Ci vuole molto poco tempo per il suo calcolo.
 
GetTerrainHeightAtPos ( TerrainID, X, Y ) ;
 
TerrainID
L'ID dell'object del terreno da cui si desidera recuperare un valore di altezza.
 
X, Y
La posizione in cui si desidera determinarne l' altezza.
 
Questa funzione restituisce l'intensità di una texture pronunciata in una data posizione sul terreno . Il valore restituito è un valore reale compreso tra 0 a 1, dove 0 significa che la texture non può essere vista in questa posizione e 1 significa che la texture è l' unica che può essere vista in quella posizione.
 
GetTextureStrengthAtPosition ( TerrainID, TextureIndex, X, Y );
 
TerrainID
L'ID dell'oggetto del terreno da cui si desidera recuperare un punto di forza texture.
 
TextureIndex
L' indice della texturadi cui si desidera ricevere informazioni. 0 si riferisce alla map diffuse di base, 1 si riferisce alla prima texture aggiunta e così via.
 
X, Y
La posizione in cui si desidera determinare la forza della texture.
 
Queste due funzioni sono molto utili. Il primo può essere utilizzato per il rilevamento delle collisioni semplice e molto efficace su terreni, la seconda può essere utilizzata per determinare il materiale, che è presente in una posizione particolare. Se si vuole diffondere la vegetazione in un terreno è possibile utilizzare GetTextureStrengthAtPosition (...) per raggiungere che la vegetazione non viene creata sulla roccia massiccia.
 
Calculating the light map (Calcolo della mappa di luce )
Se hai già creato dei terreni , avrai notato che le sorgenti luminose non lo illuminano. Si dovrebbe essere felice di questo, infatti si avrebbe un aspetto orribile, se l' illuminazione dei vertici vengono utilizzati , perchè il conteggio dei vertici delle piastrelle (tile) modifica ogni volta che cambia il LoD. E dal momento che l'occhio umano è molto sensibile ai cambiamenti improvvisi , ciò non starebbe bene . Per questo motivo i terreni utilizzano una mappatura della luce. Una mappatura della luce è una texture che viene mappata sul terreno , tutto con un'operazione di moltiplicazione della textura . Si noti che questo richiede il supporto per multi texturing con tre textures , in modo che il valore di ritorno di GetSimultaneousTextureCount () deve essere > = 3.
 
Ultimate 3D calcola automaticamente la mappa della luce , devi solo dirgli che fonti di luce devono essere utilizzate per crearla .
Spesso non è bene usare fonti luminose che si muovono molto, perchè ricalcolare la mappa della luce in ogni singolo fotogramma prende un bel po' di tempo di calcolo. Invece si dovrebbe utilizzare solo le fonti di luce che non cambiano rapidamente. Vi consiglio di utilizzare un pezzo di codice che renda ad Ultimate 3D il ricalcolo della light map ( mappa di luce) ad una determinata frequenza ( ad esempio una volta al secondo). Ecco la funzione necessaria per questo :effettuare 3D Ultimate calcolare la mappa della luce.
 
Questa funzione permette ad Ultimate 3D di ricalcolare la mappa di luce per l' object terreni che richiama tale funzione .
 
CalculateTerrainLightMap (LightSourceID1, LightSourceID2, ..., LightSourceID10 ) ;
 
LightSourceID1, LightSourceID2, ..., LightSourceID10
The Game Maker ID degli light source objects ( fonte di luce ) che si desidera utilizzare per calcolare la mappa della luce.
Se si mettono 0 per tutti loro, Ultimate 3D userà tutte le fonti di luce che fanno parte della scena.
 
Se la funzionebuilt-in light map calculation function ( calcolo della mappa di luce ) non soddisfa le vostre esigenze non ci sono problemi. Ultimate 3D consente di utilizzare una mappa personalizzata di luce.
Si crea in qualsiasi software di elaborazione grafica o programmi come "Earth Sculptor" .
In questo modo è possibile utilizzare le mappe di luce con le ombre precalcolate o un altro metodo di calcolo.
Se c'è una foresta da qualche parte sul tuo terreno si può scurire la mappa di luce là, per ottenere un terreno in ombra. Cose come questa non poteva essere fatto in modo efficiente, senza la possibilità di creare mappe personalizzate di luce. Quindi, come potete facilmente vedere, questa funzione è abbastanza potente.
 
Questa funzione creerà una textura come mappa personalizzata di luce.
 
SetCustomTerrainLightMap (TextureIndex ) ;
 
TextureIndex
L' indice della textura , che deve essere impostata come nuova mappa di luce del terreno.
Se si vuole tornare alla mappa della luce automaticamente calcolata , si può passare un indice utilizzato per questo parametro.
 
Deforming a terrain (deformazione di un terreno )
Nei giochi con armi pesanti , a volte non si desidera una deformazione del terreno casuale .
Per esempio se una bomba esplode, un cratere dovrà essere creato. Questo può effettivamente contribuire al gioco, poichè i giocatori poi potranno nascondersi in questo cratere .
Ultimate 3D offre una funzione molto semplice per la deformazione del terreno, che porta ai risultati desiderati nella maggior parte dei casi.
 
Questa funzione aumenta o diminuisce il terreno nelle vicinanze di una determinata posizione.
 
DeformTerrain ( DeformationCenterX, DeformationCenterY, DeformationRadius, RaiseLevel ) ;
 
DeformationCenterX, DeformationCenterY
Le coordinate di origine della deformazione nello mondo 3D. Questa è la posizione in cui la deformazione sarà massimale.
 
DeformationRadius
Il raggio attorno al centro di deformazione del terreno , in cui sarà deformato.
 
RaiseLevel
L' importo di sollevamento del terreno ( valore positivo ) o abbassamento ( valore negativo ).
 
Al centro la deformazione del terreno alzerà o abbasserà grazie a RaiseLevel.
Ad una distanza maggiore o uguale di DeformationRadius il terreno non cambierà.
Inbetween una curva coseno è utilizzata per ottenere una forma regolare. Il seguente grafico illustra questo.

 
Questo metodo porta a dei crateri sferici molto belli. E' abbastanza efficiente per essere chiamato durante il gioco, ma non dovrebbe essere chiamato ad ogni step o analoghe frequenze. Si noti che non può abbassare il terreno sotto z e non può sollevare terreno sopra z + height. Se lo si utilizza è necessario assicurarsi che vi sia dello spazio, prima che vengano raggiunti questi limiti.
 
Si raccomanda di non utilizzare lo stesso valore per la DeformationRadius parametri e RaiseLevel ogni volta che viene chiamato. Si dovrebbe aggiungere un valore calcolato in modo casuale. Il motivo per cui ciò è necessario è che Ultimate 3D modifica inoltre l' height map ( mappa dell' altezza ) e normal map , che viene utilizzato internamente per calcolare la mappa della luce.
Se si utilizzano gli stessi parametri ogni volta , casulai errori possono verificarsi sempre allo stesso posto. Questo si tradurrebbe in strani effetti nel calcolo della mappa automatica della luce. Sembra come se le scanalature fossero state create nel terreno. Valori casuali per i parametri sono il modo più semplice per evitare questo ( ad esempio, si potrebbe passare 150 + random (30) per DeformationRadius ).
 
Ora cosa succede, se si vuole salvare il gioco dopo aver utilizzato DeformTerrain (...) ? Tutti questi crateri possono essere rilevanti per il gameplay, al punto tale che dovrebbero essere salvati insieme agli altri dati. Il modo più semplice per farlo è salvare l' height map ( mappa dell' altezza del terreno).
Ultimate 3D offre una semplice funzione per questo scopo.
 
Questa funzione consente di salvare l ' height map ( mappatura del altezza del terreno ) dell' object terreno che richiama tale funzione .
Tutte le modifiche che sono state apportate al terreno attraverso DeformTerrain (...) sono inclusi in questa height map.
L' height map ( mappa di altezza ) è sempre un' immagine con colori che rientrano in una scala di grigi :
 
SaveTerrainHeightMap (OutputFile) ;
 
OutputFile
Il file in cui l' height map ( mappa di altezza ) verrà salvata. L'estensione di questo file può essere sia. Bmp o. DDS.
 
Ora sapete come modificare la forma di un terreno e si può anche salvare i dati risultanti.
Se anche voi volete sapere come modificare l'aspetto della superficie di un terreno continua a leggere.
 
Creating terrain decals ( creazione di decalcomanie del terreno )
Spesso è necessario coprire il terreno con altre texture in alcuni luoghi. Ad esempio nei luoghi dove una esplosione è successa una texture con lo sporco bruciato dovrebbe apparire. Il texturing dello stesso terreno non può essere cambiato, ma è possibile creare sovrapposizioni sul terreno, che coprono perfettamente ed utilizzano la consistenza desiderata. Queste sovrapposizioni sono chiamati decalcomanie del terreno. Ultimate 3D ha funzioni per la creazione automatica di decalcomanie del terreno. Decalcomanie del terreno sono gli objects del dato modello e quindi hanno bisogno proprio degli objects di Game Maker. In questo object ( oggetto) è necessario impostare quattro variabili prima della creazione della decalcomania :
 
terrain_object
L'ID dell'object terreno sul quale si desidera creare una decalcomania.
 
center_x, center_y
La posizione centrale della decalcomania nello spazio globale.
 
size( dimensione della decalcomania)
Le decalcomanie del terreno sono sempre quadrate a meno che non bisogna tagliarle, perchè sono al confine del terreno.
 
Dopo aver impostato su queste variabili è possibile chiamare CreateTerrainDecal () una volta per creare la decalcomania.
 
Come al solito è necessario inserire Destroy () nell' evento di distruzione dell' object.
Step () può essere inserito nell' evento step, ma di solito questo non è necessario in quanto le decalcomanie del terreno sono statici ( modificare le variabili di trasformazione di solito non è desiderato ).
Le variabili x, y, z, rotx, roty e rotz deve essere uguale a zero e scalx, scaly e scalz deve essere uguale a uno.
In caso contrario, il terreno sarà nel posto sbagliato.
 
L' object modello , può essere modificato proprio come ogni objects di altri modelli.
è possibile utilizzare SetMaterialStageTexture(...) per fornirle una texture differente , è possibile utilizzare SetModelMaterial (...) per cambiargli colore .
E' possibile anche modificare la sua geometria con le funzioni di manipolazione del modello.
 
L' object ( oggetto) ha più livelli di dettaglio da raggiungere , i quali corrispondono alla propria forma del terreno , indipendentemente da quale LoD utilizza questa parte del terreno .
 
Questo funziona abbastanza bene, ma può accadere che le parti della decalcomania vengono a volte coperti dal terreno. Se questo è il caso, è possibile aumentare di poco il valore della variabile z richiamando poi Step().
Questo risolverà il problema. Spetta a voi trovare il valore ideale per z. Dipende dal terreno e dalle dimensioni della decalcomania.
 
Dopo la sua creazione la decalcomania ( adesivo ) per il terreno è completamente indipendente dal terreno che è stato creato.
Non cambierà, se il terreno si deforma o distrutte. Per questo motivo è necessario ricreare da soli, se deve adattarsi ad un terreno cambiato. Per farlo basta chiamare Destroy () e CreateTerrainDecal (). Se hai cambiato la decal terreno dopo la sua creazione si dovono di nuovo fare queste modifiche .
 
Creating height and alpha maps ( creazione mappe di altezza e alfa )
Per la creazione di height and alpha maps ( mappe di altezza e di trasparenza ) , vi posso consigliare un programma molto comodo e user-friendly chiamato Earth Sculptor . Il suo uso è davvero intuitivo e viene fornito con un manuale dettagliato. Purtroppo la versione non registrata è un po 'limitata. Una volta che avete disegnato alcuni terreni in Earth Sculptor è possibile salvarli.
Il programma salverà poi height map ( mappa di altezza) , una compressa alpha map ( mappa della trasparenza ) ed una light map ( mappa della luce) . La mappa di altezza può essere utilizzata da Ultimate 3D come è ed inoltre è possibile utilizzare la mappa della luce come una mappa di colore personalizzato desiderato. La mappa alfa può essere utilizzata grazie alla AlphaMapChannel , parametro di AddTerrainTexture (...).
 
Altri programmi gratuiti per la creazione di terreni sono Terragen, World Machine, Terranim8or e L3DT. Una spiegazione di come esportare le mappe dell' altezza da Terranim8or è disponibile sul Ultimate3D Comunità e un tutorial sull' uso di L3DT da Ruud v A può essere trovata nel Ultimate3D Wiki.

 

 

 

AFFILIATI :
 

 

 

 

 

 

 

 

 

 

 

UP