Nella sede inglese di Microsoft esiste una stanza piccola piccola, ma dalle spettacolari risorse. Al suo interno è possibile ricreare centinaia di paesaggi / scenari / ambienti, al fine di rendere le demo con i grandi clienti il più realistiche possibili.
La stanza è divisa in più sezioni, ognuno delle quali è completamente personalizzabile. Le pareti, le finestre, le porte, gli specchi...sono tutti schermi piatti ad altissima risoluzione, in cui è possibile proiettare contenuti multimediali a piacere.
Ora, dovendo testarne al massimo le sue funzionalità, abbiamo deciso di sfruttarla per...

Le Spline sono curve controllate dai punti di controllo: usando WPF è immediato disegnare una spline definendone i punti di controllo associati.
E' leggermente più complicato invece disegnare una Spline partendo dai punti per cui la curva deve passare. In questo caso è sufficiente utilizzare l'algoritmo di interpolazione Catmull-Rom, così definito:
Let c(i) be the points you wish to interpolate through. Let b(i) be the Bezier control points. Then:
B(0) = c(i)
B(1) = (c(i+1)-c(i-1))/6 + c(i)
B(2) = (c(i)-c(i+2))/6 + c(i+1)
B(3) = c(i+1)
Note that the very first or very last interpolation point won’t actually be interpolated. You can work around this by creating a dummy interpolation point at the beginning.
Nel caso in cui siate interessati una implementazione pratica del codice non esitate a contattarmi (eventualmente scriverò un articoletto per UGI).
WPF mette a disposizione un framework potentissimo per lavorare con oggetti e animazioni 3D. Noterete tuttavia che man mano che le interfacce si fanno più complesse, le performance dell'applicazione tendono a decadere velocemente.
Ecco quindi solo uno dei tip per accellerare l'esecuzione di oggetti tridimensionali. Supponiamo che abbiate una superficie (piano, sfera, quello che volete :)) tridimensionale e che vogliate applicare su di essa un VisualBrush.
La strada più semplice e veloce è quella di decorare il materiale della superficie con un VisualBrush, la cui Visual può puntare a un oggetto 2D o un oggetto creato a runtime: questo approccio tuttavia occupa molte risorse per il binding del Visual3D al brush originale.
Una soluzione che accellera parecchio le prestazioni grafiche può essere quella di convertire manualmente il VisualBrush in una immagine (ImageBrush), applicando poi all'oggetto 3D solo l'immagine. Il contro di questa soluzione è che si perde il binding tra la superficie e il brush: dovrete qiundi riapplicare l'immagine alla superficie ogni volta che il brush iniziale viene modificato. Vi assicuro però che il miglioramento prestazionale è elevatissimo: nella maggior parte delle applicazioni conviene quindi complicare un po' di più il codice, risparmiando in prestazioni.
Ecco la funzione che vi permette di fare la magica trasformazione di un VisualBrush in ImageSource:
public ImageSource RasterizeVisual(VisualBrush visualBrush)
{
Rect bounds = VisualTreeHelper.GetDescendantBounds(visualBrush.Visual);
RenderTargetBitmap rtb = new RenderTargetBitmap((int)(bounds.Width),
(int)(bounds.Height),
96,
96,
PixelFormats.Pbgra32);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext ctx = dv.RenderOpen())
{
ctx.DrawRectangle(visualBrush, null, new Rect(new Point(), bounds.Size));
}
rtb.Render(dv);
return rtb;
}