venerdì 19 febbraio 2010 #

WPF e il 3D (settima parte) – Cubo multi-texture

Indice degli articoli su WPF e il 3D

Nel precedente articolo abbiamo visto come colorare un oggetto 3D ed abbiamo trattato le problematiche di mappatura con oggetti 2D chiamati texture.

In questo articolo prendiamo invece in considerazione l’applicazione di più materiali, uno per faccia, ad un unico modello 3D: in questo caso un cubo che abbiamo già visto come creare.

Multi-textured cube

WPF permette di associare ad ogni GeometryModel3D un solo materiale per la vista frontale ed un solo materiale per la vista di retro, per superare questa limitazione possiamo seguire diverse strade:

- Creare una texture unica formata dall’unione delle varie texture e mappare ogni punto di conseguenza 

Texture
Esempio di texture unica per creare un effetto multi-texture

Questo stratagemma seppur altamente performante comporta difficoltà nel simulare materiali “dinamici” come ad esempio video o materiali con applicati dei VisualBrush

- Suddividere il modello 3D in tante parti

Questa è la soluzione che offre più flessibilità in quanto rende possibile cambiare singolarmente i vari materiali.

Un esempio di cubo 3D suddiviso in più parti (suddiviso nelle 6 facce) è il seguente:

sampleXamlMultiTexturedCube

Come si può notare all’interno di un singolo ModelVisual3D (che dovrà poi essere inserito all’interno di un Viewport3D) è definito un Model3DGroup che contiene i vari pezzi (GeometryModel3D) con applicati diversi materiali. I dati veri e propri sono inseriti all’interno della sezione Resource del ViewPort3D per questioni di compattezza e riutilizzo.

Resource
Una parte dei dati del cubo 3D all’interno della sezione Resource del Viewport3D

Questa soluzione comporta però un codice Xaml molto prolisso e poco riutilizzabile, vedremo nel prossimo articolo come creare un componente altamente riutilizzabile ed estendibile ereditando dalla classe ModelVisual3D.  

Scarica il codice sorgente dell’articolo

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (1)