Ombre sovrapposte

In un gioco fatto con ultimate3D ,quando creo un ombra per un oggetto statico ( in questo esempio un albero ) , il quale è formato da molti poligoni, ho un grande calo degli fps.
Quando poi nella room vi sono 10- 12 alberi , gli fps si mettono a piangere :)
La prima idea che mi venne in mente era quella di sostituire l'ombra dell' albero con un' ombra di un oggetto 3d simile all' albero però con moltissimi meno poligoni (tipo un cartellone) , posizionato nelle assi xy dell' albero.

Per aumentare il n° degli fps ho poi aggiunto uno script affinchè l' ombra fosse attivata solo nel caso ci si trovasse vicino .

Il risultato era discreto seppur l' ombra era decisamente squadrata e visibile all' improvviso.

Ma un altro problema mi si porse davanti . Come potete vedere anche dall' immagine qui sotto l' ombra dell' albero e quella del personaggio, una volta sovrapposte , apportavano questo diffetto : l'ombra dell uomo veniva resa trasparente nel punto dove coincideva con quella dell' albero.



Fortunatamente dopo aver studiato un pò le caratteristiche del terreno , sono venuto a conoscenza delle Decalcomanie per il terreno.
Con esse è possibile posizionare un' immagine in un determinato punto del terreno la quale sarà adattata alla sua superficie.

Ho creato quindi un' immagine per l' albero e l'ho posizionata ai suoi piedi con questo risultato :



Grazie al fatto che si possono modificarne il materiale della decalcomanie, ho potuto settare la sua alpha.

Il risultato finale è secondo me è nettamente migliore sia dal punto di vista grafico sia da quello delle prestazione ( più FPS ).
Certamente non è adattabile agli object in movimento e non si potrà avere un ombra che varia di posizione in base al cambiamento della luce;

Per realizzare una Decalcomania del Terreno , bisogna prima creare il terreno ( con il nome terrain ) e poi un object ( con il nome obj_Decalcomania ) nel quale si aggiungerà questo codice nel create :

terrain_object=terrain;
center_x=x-30;
center_y=y+250;
size=500;
x=0;
y=0;
z=1;
rotx=0;
roty=0;
rotz=0;
scalx=1;
scaly=1;
scalz=1;
CreateTerrainDecal();
SetMaterialStageTexture(0,0,22);
SetModelMaterial(0,0,0,0,100);


A questo object si dovrà aggiungere anche la funzione Destroy( ); nel suo evento di distruzione.

Poi nel evento create degli objects alberi , aggiungete
instance_create(x,y,obj_Decalcomania);
in questo modo si posizionerà lì.

Terrain_object corrisponde all'object del terreno in questo caso si chiama terrain.
Potete regolare center_x e center_y in base alle vostre esigenze.
Mentre x , y ,z deve rimanere a 0 ( z potrai leggermente aumetarlo ... ma di poco);
Scalx , scaly , scalz invece dovranno avere il valore 1.

Per regolare la grandezza della decalcomania , utilizzate size.

Poi dovrete aggiungere CreateTerrainDecal();.

Tramite SetMaterialStageTexture(0,0,22); cambierete la textura della decalcomania , in questo caso la textura del materiale 0 cambierà nella textura numero 22 ( Le texture dovrete averle caricate prima ).

Per esempio : LoadTexture('gfx/ombraAlbero.png',22);.

Infine per rendere più trasparente la decalcomania ho modificato il materiale così : SetModelMaterial(0,0,0,0,100); ;






Consiglio sulle cartelle in Ultimate 3D

Inserito da civic71 il Ven, 05/27/2011 - 18:43.

Vi vorrei dare questo consiglio per coloro che utilizzano Ultimate 3D e programmi di grafica 3d quali anim8or.

Quando inseriamo in un gioco creato con Ultimate3D , un oggetto 3d realizzato con anim8or avente delle texture, quest' ultime le dovremo mettere nella cartella gfx.
Ma se si dovesse riavviare il file.an8 ( con anim8or ) , per apportargli delle modifiche, le texture non verrebbero caricate, non essendo presenti nella stessa cartella.
Questo disturba non poco il "lavoro" per la creazione del gioco.
In più , inserire troppe texture nella cartella gfx , renderebbe quest' utlima un pò incasinata.
Per questo grazie alla funzione SetTexturePath("gfx/.../"); , ( per quegli oggetti 3D che non condividono le texture con altri file 3d ), posso lasciare le texture nella stessa sua cartella , per esempio : "models/CartellaNomeFile3D".
Per far ciò è indispensabile inserire nel create del vostro file 3d :
SetTexturePath("models/CartellaNomeFile3D/"); prima della chiamata del file ( file="models/CartellaNomeFile3D/file.an8").

Subito dopo file="..." e LoadMesh(); rimetteremo la SetTexturePath("gfx/"); , in modo tale che i files 3d successivamente caricati prelevino le loro texture nella solita cartella "gfx".


Consiglio poi di creare ( nella cartella gfx ) delle sottocartelle di texture utilizzate per esempio nei terreni , cielo - sfondo background ed altre che saranno richiamate tramite LoadTexture(); e LoadBackground();



PAGES and MANUALS
PAGINE e MANUALI




AFFILIATI :