Questa è una tecnica implementata in U3D per fare delle ottime riflessioni del mondo esterno.
Questa tecnica non fa altro che, a partire da un punto nel mondo, fare 6 fotografie del mondo esterno, due per ogni asse cartesiano. Questa texture viene applicata ad un cubo immaginario, praticamente è come se ogni lato del cubo fosse una macchina fotografica a se stante e si desse una texture in base al mondo esterno. A quel punto noi possiamo applicare questa mappa(chiamata appunto mappa cubo) ad un qualsiasi modello. A quel punto U3D farà dei particolari calcoli in base all'inclinazione del triangolo e la posizione della telecamera per dare l'effetto riflessione. Prima di vedere il procedimento di applicazione vediamo alcuni importanti concetti. Per avere una buona mappatura è essenziale mettere la fotocamera della mappa in una buona posizione, è quindi preferibile che usiate il centro del modello.
Altra cosa molto importante è da evitare di usare un'eccessivo smooth delle normali poichè questa tecnica si basa su di esse. Se smoothate triangoli troppo inclinati tra loro potreste ottenere brutti risultati.
Ecco degli screen di esempio:
Chiaramente anche non usare affatto lo smooth può essere un problema poiché per triangoli che praticamente sono paralleli tra loro è necessario che ci sia continuazione nella texture. Ciò potrebbe dare un'eccessivo senso di distaccamento tra i vari triangoli dando un bruttissimo effetto. Un buon smooth angle può essere un valore tra i 30° ed i 45°.
In questo screen potete vedere il cubo con le normali sistemate:
Vediamo ora come si utilizza questa tecnica.
Prima di tutto create una primitiva o un modello e poi usate queste funzioni:
Codice: Seleziona tutto
CreateCubeTextureRenderTarget(id,definizione)
SetMaterialEnvironmentMap(materiale,texture)
Questa funzione serve a far si che u3d utilizzi una data texture come una mappa cubo.
L'id è l'indice texture che verrà usato per la mappa cubo, definizione è il valore che indica la qualità in pixel della vostra texture, questa deve essere un multiplo di 2.
SetMaterialEnvironmentMap(materiale,texture)
materiale è il materiale in cui verrà usata la mappatura, texture indica l'indice texture della mappa, per questa usate il valore che avete immesso nella funzione precedente.
A questo punto il modello avrà un materiale ove sarà usata la mappatura, questa però è statica. Vi è un'altra funzione che consente di aggiornare la mappa dell'ambiente.
RenderToCubeTexture(texture,x,y,z,r,g,b,a,room1,room2...);
texture è la texture che deve venire usata per la mappatura, usate i valori delle funzioni precedenti. x,y,z questi tre argomenti indicano la posizione dove verrà collocata la fotocamera. Cercate di metterla il più possibile centrale al modello per avere un'effetto migliore.
r,g,b,a questi indicano il colore che deve essere sommato alla texture. Il valore di alfa non indica che valore di alfa avrà la texture bensì indica un valore di trasparenza con cui verranno miscelati i colori. per farvi un'esempio sul funzionamento immaginatevi un'immagine sull'editor di sprite, sopra di essa disegnate quindi un rettangolo con dei valori di r,g,b,a. Questi valori r,g,b,a fanno la stessa cosa con u3d. Se volete lasciare la texure così com'è usate quindi dei valori di 0 per tutti e quattro gli argomenti. se usate un'alfa di 255 l'immagine verrà completamente coperta dal colore e quindi non sarà visibile.
room1,room2...
indicano le room che verranno renderizzate nella mappatura. QUESTE NON SONO LE ROOM DI GM, sono delle room particolari di ultimate 3d. Se non le conoscete basta non usare questi argomenti per far si che tutto funzioni alla perfezione. Se invece sapete cosa sono potrebbe essere utile usare una room per l'oggetto che riflette il mondo e non renderizzatelo. In questo modo si possono evitare brutte riflessioni del modello stesso nel caso fosse completo. Le room danno anche la possibilità di aumentare le prestazioni.
RenderToCubeTexture(...) è molto lenta perchè renderizza 6 telecamere diverse. Usatela con cautela magari non in tutti gli step!