Utilizzare scene 3D in Windows Presentation Foundation

5 pagine in totale: <<Indietro 1 2 [3] 4 5 Avanti >>

Model e mesh

Posizionare una telecamera in uno spazio vuoto senza niente da riprendere, benché possibile, sarebbe sicuramente poco divertente ed è quindi "consigliabile" inserire in questo spazio degli oggetti.
In WPF gli oggetti che compongono la scena ereditano tutti direttamente o indirettamente da Model3D. In particolare è tramite la proprietà Geometry della classe GeometryModel3D che è possibile modellare una primitiva o più propriamente una mesh, questo per evitare equivoci in quanto WPF non mette a disposizione primitive, come cubi, cilindri o altro. Il sistema 3D di WPF non si discosta da altri già esistenti e descrive la mesh come un insieme di punti organizzati in modo da formare dei semplici triangoli. Sfruttando la complanarità dei tre vertici è possibile continuare ad aggiungere triangoli alla mesh, fino ad ottenere la complessità necessaria.
La geometria viene modellata per mezzo della classe MeshGeometry3D, specificando la posizione dei vertici dei triangoli che formano la mesh, come mostrato nel seguente codice dichiarativo:

<GeometryModel3D.Geometry>
    <MeshGeometry3D
        TriangleIndices="0,1,2 2,3,0"
        Normals="0,0,1 0,0,1 0,0,1 0,0,1"
        TextureCoordinates="0,1 1,1 1,0 0,0"
        Positions="-1,-1,0 1,-1,0 1,1,0 -1,1,0"/>
</GeometryModel3D.Geometry>

E il rispettivo procedurale:

MeshGeometry3D mesh = new MeshGeometry3D();

mesh.Positions.Add(new Point3D(-1, -1, 0));
mesh.Positions.Add(new Point3D(1, -1, 0));
mesh.Positions.Add(new Point3D(1, 1, 0));
mesh.Positions.Add(new Point3D(-1, 1, 0));

mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);
mesh.TriangleIndices.Add(2);
mesh.TriangleIndices.Add(3);
mesh.TriangleIndices.Add(0);

mesh.Normals.Add(new Vector3D(0, 0, 1));
mesh.Normals.Add(new Vector3D(0, 0, 1));
mesh.Normals.Add(new Vector3D(0, 0, 1));
mesh.Normals.Add(new Vector3D(0, 0, 1));

mesh.TextureCoordinates.Add(new Point(0, 1));
mesh.TextureCoordinates.Add(new Point(1, 1));
mesh.TextureCoordinates.Add(new Point(1, 0));
mesh.TextureCoordinates.Add(new Point(0, 0));

GeometryModel3D geometry = new GeometryModel3D();
geometry.Geometry = mesh;

Nel precedente esempio impostando la proprietà Positions, creiamo una semplice superficie formata da quattro vertici specificando in XAML una lista di numeri che a gruppi di tre rappresentano la posizione (X, Y, Z) di ogni vertice dei triangoli.

Visto che i vertici possono essere condivisi tra più triangoli, ne consegue che queste informazioni da sole non sono sufficienti a WPF per creare correttamente la mesh ed è quindi necessario informare il sistema 3D su come questi vertici sono condivisi.
Bisogna quindi informare WPF in che ordine i vertici formano il nostro triangolo e ciò può essere eseguito impostando la proprietà TringleIndicies.

Indici dei vertici

Ogni numero nella lista TriangleIndicies fa riferimento ad un specifico offset nella lista Positions, così da determinare l'ordine in cui i vertici sono "uniti" per formare i triangoli. Nel nostro esempio i numeri 0, 1, 2 fanno riferimento rispettivamente al primo elemento della collezione Positions (-1,-1,0), al secondo (1,-1,0) e al terzo (1,1,0) e determinano così una delle facce che compongono la mesh.

Proseguiamo impostando la proprietà Normals, così da poter determinare come le superfici vengono ombreggiate. In pratica si specifica un vettore diretto verso la fonte luminosa in modo da rendere la faccia che descrive più luminosa e benché WPF sia capace di generare automaticamente normali per ogni vertice in base alla loro posizione, è possibile specificarne di proprie.

5 pagine in totale: <<Indietro 1 2 [3] 4 5 Avanti >>

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



TUTORIALS


IN EVIDENZA
MISC