Ruotare la camera di una scena 3D di WPF con il mouse

di Cristian Civera, in Windows Presentation Foundation,

Windows Presentation Foundation tra le sue tante potenzialità ha una serie di buoni strumenti per visualizzare scene tridimensionali con i tipici e minimi elementi: mesh, geometrie, luci e camera. Una funzionalità spesso richiesta, dato l'impiego di una scena 3D, è quella di poter gestire la camera in modo da muovere le mesh sulle quali essa è focalizzata in modo da ruotare o zoomare su di esse.

La PerspectiveCamera dispone per questo scopo delle proprietà Position e LookDirection rispettivamente per indicare la posizione e il vettore di direzione dello "sguardo" della camera. Grazie al team di WPF, su CodePlex.com è disponibile un componente di nome 3DTools che include alcune classi per aggiungere funzionalità al reparto 3D. Tra queste si trova l'elemento TrackballDecorator il quale permette di decorare una scena 3D e di gestire la camera attraverso l'uso del mouse.

Premendo con il pulsante sinistro e muovendo il mouse si ottiene la rotazione, in base alla zona di pressione, della camera, mentre con il pulsante destro si lavora sullo zoom della stessa.
Il codice seguente è un esempio completo di scena 3D con manipolazione di una mesh piana.

<Window x:Class="Camera.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:t="clr-namespace:_3DTools;assembly=3DTools"
    Height="800"
    Width="700">

  <t:TrackballDecorator>
    <Viewport3D>
      <Viewport3D.Camera>
    <!-- camera -->
        <PerspectiveCamera x:Name="camera"
                           NearPlaneDistance="0"
                           FieldOfView="45"
                           Position="0,0,4"
                           LookDirection="0,0,-1" />
      </Viewport3D.Camera>

      <ModelVisual3D>
        <ModelVisual3D.Content>
          <Model3DGroup>
            <!-- luce bianca -->
            <AmbientLight Color="#FFFFFFFF" />

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

              <GeometryModel3D.Material>
                <!-- foto usata come material -->
                <DiffuseMaterial>
                  <DiffuseMaterial.Brush>
                    <ImageBrush ImageSource="foto.jpg" />
                  </DiffuseMaterial.Brush>
                </DiffuseMaterial>
              </GeometryModel3D.Material>
            </GeometryModel3D>

          </Model3DGroup>
        </ModelVisual3D.Content>

      </ModelVisual3D>
    </Viewport3D>
  </t:TrackballDecorator>
</Window>

Il codice produce il seguente risultato:

Progetto CodePlex:
http://3dtools.codeplex.com/

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi