Windows Presentation Foundation 3.5: 3D interattivo e le altre novità del framework

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

Nel seguente esempio creiamo una semplice scena composta di nove cubi disposti su tre file, cliccando su uno qualsiasi dei cubi questo cambia colore e tutti assieme compiranno un giro di 360 gradi.

Elementi 3D interattivi

<Window x:Class="MyInputFocusEventing3DSupport.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Viewport3D x:Name="MyViewPort">
            <Viewport3D.Resources>
                <MeshGeometry3D x:Key="cube_mesh"
                    Positions=""
                    TriangleIndices="omesse"
                    TextureCoordinates="omesse"
                                />  
                <!--materiali-->
                <DiffuseMaterial x:Key="tomato_material" Brush="Tomato" />
                <DiffuseMaterial x:Key="darkSeaGreen_material" Brush="DarkSeaGreen"/>
            </Viewport3D.Resources>
            <!--camera-->
            <Viewport3D.Camera>
                <PerspectiveCamera Position="-136.0670166,-706.3000488,141.453949"
                    LookDirection="212.421463012695,712.548655033112,1.52587890625E-05"
                    UpDirection="0,0,1"
                    NearPlaneDistance="0.1"
                    FarPlaneDistance="10000"
                    FieldOfView="53.3333320617676" />
            </Viewport3D.Camera>
            <!--contenitore dei 9 cubi-->
            <ContainerUIElement3D MouseDown="ContainerUIElement3D_MouseDown" >
                <ContainerUIElement3D.Transform>
                    <RotateTransform3D>
                        <RotateTransform3D.Rotation>
                            <AxisAngleRotation3D x:Name="myRotation" Axis="0, 0, 1" Angle="0" />
                        </RotateTransform3D.Rotation>
                    </RotateTransform3D>
                </ContainerUIElement3D.Transform>
                <!--Prima fila-->
                <ModelUIElement3D >
                    <GeometryModel3D Geometry="{StaticResource cube_mesh}" Material="{StaticResource tomato_material}">
                    </GeometryModel3D>
                </ModelUIElement3D >
                <ModelUIElement3D >
                    <GeometryModel3D Geometry="{StaticResource cube_mesh}" Material="{StaticResource tomato_material}">
                        <GeometryModel3D.Transform>
                            <TranslateTransform3D OffsetX="100"/>
                        </GeometryModel3D.Transform>
                    </GeometryModel3D>
                </ModelUIElement3D >
                <ModelUIElement3D >
                    <GeometryModel3D Geometry="{StaticResource cube_mesh}" Material="{StaticResource tomato_material}">
                        <GeometryModel3D.Transform>
                            <TranslateTransform3D OffsetX="200"/>
                        </GeometryModel3D.Transform>
                    </GeometryModel3D>
                </ModelUIElement3D >
                <!--fila 2 e terza fila omessa-->
                
            </ContainerUIElement3D>
            <!--luci-->
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <Model3DGroup>
                    <PointLight Color="#FFFFFFFF" Position="-274.548034667969,-223.444854736328,-393.385620117188" Range="Infinity" />
                    <PointLight Color="#FFFFFFFF" Position="71.2213745117188,-498.961975097656,341.957885742188" Range="Infinity" />
                </Model3DGroup>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>
    </Grid>
</Window>

Utilizziamo l'oggetto ContainerUIElement3D per raggruppare i nove ModelUIElement3D e poterli animare in un sol colpo. Tale oggetto non ha nessuna rappresentazione grafica, ma fornisce semplicemente i servizi necessari a catturare l'input dell'utente.

Sfruttando questa caratteristica, comune a ogni oggetto derivato da UIElement3D, impostiamo un handler per l'evento MouseDown:

<ContainerUIElement3D MouseDown="ContainerUIElement3D_MouseDown" >

Per prima cosa avviamo l'esecuzione dell'animazione che ruota contemporaneamente tutti e nove i cubi, infine recuperiamo l'oggetto che ha generato l'evento mediante la proprietà OriginalSource dell'oggetto MouseButtonEventArgs e impostiamo il nuovo materiale.

private void ContainerUIElement3D_MouseDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;

    DoubleAnimation doubleAnimation = new DoubleAnimation(0,360,new Duration(TimeSpan.FromSeconds(0.5)));

    myRotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, doubleAnimation);

    if (((DiffuseMaterial)((GeometryModel3D)((ModelUIElement3D)e.OriginalSource).Model).Material).Brush == Brushes.Tomato)
    {
        ((GeometryModel3D)((ModelUIElement3D)e.OriginalSource).Model).Material = _darkSeaGreenMaterial;
    }
    else
    {
        ((GeometryModel3D)((ModelUIElement3D)e.OriginalSource).Model).Material = _matTomato;
    }        
}

Conclusioni

Con il rilascio del nuovo Framework non sono state apportate modifiche eclatanti a WPF, ma solo piccole aggiunte che ne migliorano le precedenti funzionalità e ne estendono i campi di utilizzo.

Le nuove caratteristiche in ambito 3D rappresentano di fatto le aggiunte sicuramente le più apprezzate e importanti, per la spinta che potrebbero dare nella creazione di interfacce utente realmente tridimensionali.

Lo speciale completo su Visual Studio 2008, Windows Server 2008 e SQL Server 2008

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

Attenzione: Questo articolo contiene un allegato

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