Si alguna vez has intentado hacer alguna aplicación donde haya objetos 3d interactivos, te habrás dado cuenta de que no es cosa de niños. Debías tener un gran conocimiento de programación,geometría, matematicas, etc.. Desarrollar la experiencia de usuario era muy complicado porque no podías diseñar nada de una manera visual. De hecho si te fijas, a pesar de que hay videojuegos impresionantes y la potencia de la máquina lo puede con creces, el mundo del diseño de interacción no ha sacado demasiado provecho de las 3D. Hasta ahora...
WPF 3.5 Nos facilita esta tarea hasta el punto del insulto intelectual :)
Gracias a la clase Viewport2DVisual3D que nos permite meter cualquier Visual (Un botón, un video, un circulo, un textbox..) a modo de "textura" de un modelo 3D. La gracia está en que el botón (por ejemplo) funciona como si fuera 2D transparentemente. Simplemente nos olvidamos de que esta en 3D. Si nos tenemos que suscribir al evento clic pues lo hacemos como toda la vida (button.clic += en C# o Click="" en XAML). Todos los controles y Visuals que metamos dentro del objeto 3D siguen funcionando igual que antes! lanzan sus eventos y todo de la misma forma que en 2D, como he dicho antes, simplemente de olvidas de que esta en 3d y punto.
Vamos a ver como se hace esto:
En el ejemplo de hoy voy a meter un botón en un modelo 3D y veremos que pasa. Primero debemos conseguir un modelo bien mapeado para saber con seguridad donde estamos colocando el botón en el modelo.
Pues bien una vez tenemos todo, abrimos Blend e importamos el modelo y la textura. Metemos en la escena el objeto 3D (Arrastrando el fichero .obj de la pestaña "Project" al grid principal de nuestra aplicacion) y metemos la textura como una Image. Una vez tenemos todo esto en pantalla, metemos la Image en un nuevo Grid y nos quedará algo parecido a esto.
Ese Grid que hemos creado lo vamos a usar como Visual principal que meteremos en el Viewport2DVisual3D. Así que dentro de él podemos poner lo que nos de la gana, yo voy a meter unos cuantos controles.
Seleccionamos el modelo (GeometryModel3D) y en la propiedad Geometry creamos un New Resource de esta manera:
Ahora debemos modificar el Xaml e insertar el codigo de la clase Viewport3DVisual2D.
<Viewport2DVisual3D Geometry="{StaticResource mesh}">
<Viewport2DVisual3D.Material>
<DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" Brush="White"/>
</Viewport2DVisual3D.Material>
<Button />
</Viewport2DVisual3D>
Como veis la propiedad Geometry hace referencia a un StaticResource llamado "mesh". Debe hacer referencia al que hallamos creado nosotros.
Una vez hecho esto podemos borrar el modelo que nos puso blend en un principio (ModelVisual3D) ya que no lo vamos a usar. Ahora si todo a ido bien, veréis vuestro modelo con un botón como textura tal q así.
Vais cogiendo la idea? Ahora no tenemos mas que cambiar ese botón, por el grid que creamos al principio y...
Compilamos y vemos como los controles funcionan perfectamente! ahora venga, probad mas controles! haced vuestros propios controles y meterlos dentro! fácil eh?