Usando 3D Tools for the WPF

Quienes hayan intentado trabajar con controles 2D en un ambiente 3D en WPF de seguro se han topado con más de un problema ya que no es una tarea nada fácil, yo estuve probando varios métodos de hacer esto, por ejemplo algo que probé fue crear un UserControl y utilizarlo junto con una Brush para “pintar” un Mesh lo cual hace que el contenido del UserControl sea visible en el Mesh pero no utilizable, también probé otros métodos pero sin que me terminaran de convencer o porque eran demasiado difíciles de implementar y mantener o porque directamente no hacían lo que yo esperaba que hicieran, bien la gente que compone el equipo del nuevo WPF 3D Blog ha liberado un proyecto llamado 3D Tool for the Windows Presentation Foundation que hace del uso de controles 2D en un mundo 3D cosa de niños.

Cree este pequeño ejemplo para que vean lo fácil que se puede implementar esta herramienta.
Lo primero que hay que hacer es crear una referencia en nuestro proyecto hacia 3DTools.dll, también debemos declarar el namespace de la DLL en el archivo XAML que usemos.
 

Código XAML 

<Window x:Class="_3DTooslDemo.Window"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:local="clr-namespace:_3DTools;assembly=3DTools"

    Title="WPF 3D Tools Demo" Height="300" Width="600"> 

 <Window.Resources> 

    <MeshGeometry3D x:Key="3dMesh"

        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"/> 

    <RotateTransform3D x:Key="3dTransform">

      <RotateTransform3D.Rotation>

        <AxisAngleRotation3D Angle="45" Axis="0 1 1" />

      </RotateTransform3D.Rotation>

    </RotateTransform3D> 

    <Grid Background="White" x:Key="3dMaterial">

      <Grid.RowDefinitions>

        <RowDefinition Height="*"/>

        <RowDefinition Height="*"/>

        <RowDefinition Height="*"/>

      </Grid.RowDefinitions> 

      <TextBlock Grid.Row="0">Demo WPF 3D Tools</TextBlock>

      <Slider Grid.Row="1" />

      <Button Grid.Row="2" Width="60" Height="25">Aceptar</Button> 

    </Grid> 

  </Window.Resources>

  <Grid> 

    <local:TrackballDecorator>

    <local:Interactive3DDecorator> 

      <Viewport3D Width="450" Height="225"> 

        <Viewport3D.Camera>

          <PerspectiveCamera Position="0, 0, 4"  FieldOfView="75" />

        </Viewport3D.Camera> 

        <ModelVisual3D>

          <ModelVisual3D.Content>

            <DirectionalLight Color="White" Direction="0,0,-1" />

          </ModelVisual3D.Content>

        </ModelVisual3D> 

        <local:InteractiveVisual3D

            Transform="{StaticResource 3dTransform}"

            Geometry="{StaticResource 3dMesh}"

            Visual="{StaticResource 3dMaterial}" />

      </Viewport3D> 

    </local:Interactive3DDecorator>

    </local:TrackballDecorator> 

  </Grid> 

</Window>

Como verán el código es muy simple, lo primero que hice fue crear un Resource y dentro de este cree un Mesh, una transformación y para finalizar dentro de una Grid coloque algunos elementos, vean que tanto el Mesh, la transformación y la Grid están identificados por una x:Key para cada uno de ellos.

El siguiente paso es crear un Viewport3D donde mostrar los elementos que están dentro de la Grid, si pueden apreciar el Viewport3D está decorado por TrackballDecorator e Interactive3DDecorator, el primero nos permite mover por el espacio al Mesh y hacer zoom en el utilizando el mouse, el segundo decorador es el encargado de integrar los elementos 2D en el Viewport3D.

El resto del código es muy intuitivo, vean que lo único novedoso es la instrucción InteractiveVisual3D la cual tiene especificada que transformación, Mesh y  “Material”  se va a utilizar.

El ejemplo terminado se ve de esta manera.

Demo 3D Tools for WPF

Pero también con estas herramientas es muy fácil tomar una aplicación existente y con mínimos cambios actualizarla para que aproveche estas nuevas características, que es lo que hice con el ejemplo del Poor’s Man Media Center.

Demo 3D Tools for WPF

A continuación les dejo algunos links de interés.

Download 3D Tools for the Windows Presentation Foundation

Channel 9 – Daniel Lehenbauer and Kurt Berglund: Interactive 2D controls on WPF 3D Surfaces

WPF 3D Team Blog

5 comments
  1. Jose Luis Latorre said:

    Buenas!!he tratado de seguir tu ejemplo y no me funciona,  en la línea 10 del código, "TriangleIndices="0 1 2 0 2 3" />",  me da el error siguiente:Warning    2    The ‘TriangleIndices’ attribute is invalid – The value ’0 1 2 0 2 3′ is invalid according to its datatype ‘http://schemas.microsoft.com/winfx/2006/xaml/presentation:frlrfSystemWindowsMediaInt32CollectionClassTopic’ – The Pattern constraint failed.Y luego, en la línea 28, en el tag "<Grid><local:TrackballDecorator>", me da que grid tiene un elemento hijo no valido, en este caso TrackBallDecorator..Alguna indicación?grácias!

  2. paulo said:

    Acabo de hacer un copy and paste del codigo en un proyecto nuevo y funciono correctamente, lo que te aconsejaría es que verificaras que este hecha la referencia a 3DTools.dll y el namespace este declarado de la siguiente manera
    xmlns:local="clr-namespace:_3DTools;assembly=3DTools"

  3. Jonathan Kaildth said:

    Hola buen día, tengo una aplicación hecha en Visual Basic
    2005 pero no utilizo Código XAML, existe alguna otra forma de utilizar 3D Tools,
    sin tener que volver a escribir el código en XAML

  4. paulo said:

    Lamentablemente no, ya que estas herramientas están desarrolladas específicamente para ser utilizadas con WPF.

  5. Guy said:

    Hi how is the  israeli  Channel 2 is on your cube ?

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.