Hace ya un tiempo hice un post acerca de la realidad aumentada en donde mostré las bases para crear una aplicación pero utilizando el Windows Phone.
En esta ocasión voy a extender un poco mas el tema para mostrar como ver el Azimut de la tierra, pero creo que con un hypelink basta. Así que chequen de lo que hablo.
En pocas palabras, estoy hablando del plano horizontal de la tierra, para ponerle un nombre mucho mas sencillo estaremos hablando del horizonte que ves a lo lejos.
Bien, después de la clase de geografía básica, ahora vamos a como hacerlo desde el teléfono.
Para iniciar toma la estructura básica de la entrada anterior para poder acceder a la cámara.
Te recuerdo que no puedes comenzar así nada mas, checa el post anterior para ver como poder hacerlo.
Ahora que ya tienes tu proyecto base vamos a seguirle.
En el XAML del MainPage, crea un StackPanel y a partir de ahí crea unos rectángulos, para hacerlo mas rápido solo incorpora el siguiente fragmento en el mismo orden.
El resultado debe ser algo parecido a esto
Ahora que tienes esa parte en el lado visual lo único que hace falta es mencionar lo importante de una propiedad en el StackPanel que nosotros acabamos de colocar, la propiedad de RenderTransform, esta propiedad nos permite acceder a todas las transformaciones que podemos colocar dentro de nuestro elemento.
Listo, ahora vamos al code behind, lo primero que necesitas es acceder al acelerómetro. Ya que lo declaraste, en el constructor después del método InitializeComponent crea una instancia del objeto recién creado y depsués un Event Handler para que lo dejes de la siguiente manera.
Accelerometer acelerometro; private VideoCamera camara; public MainPage() { InitializeComponent(); acelerometro = new Accelerometer(); acelerometro.ReadingChanged += acelerometro_ReadingChanged; } |
Ahora por último el eventHandler.
private void acelerometro_ReadingChanged(object sender, Microsoft.Devices.Sensors.AccelerometerReadingEventArgs e) { Dispatcher.BeginInvoke(() => { double z = e.Z; eje.TranslateY = (z * 400); }); } |
Aquí podrás ver que utilizamos un hilo diferente, así que para pasar valores al UI Thread utilizamos la función BeginInvoke y así solo pasas los valores necesarios.
Ahora por último iniciamos el acelerómetro, y dejamos el code behind completo de la siguiente manera.
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; using Microsoft.Phone.Controls; using Microsoft.Devices.Sensors; using Microsoft.Phone; using System.Windows.Media.Imaging; namespace Realidad_Aumentada { public partial class MainPage : PhoneApplicationPage { Accelerometer acelerometro; private VideoCamera camara; public MainPage() { InitializeComponent(); acelerometro = new Accelerometer(); acelerometro.ReadingChanged += acelerometro_ReadingChanged; } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); IniciarCamara(); acelerometro.Start(); } protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e) { base.OnNavigatingFrom(e); camara.Dispose(); camara = null; acelerometro.Stop(); } private void IniciarCamara() { camara = new VideoCamera(); camara.Initialized += OnCameraInitialized; cameraVisualizer.SetSource(camara); } void OnCameraInitialized(object sender, EventArgs e) { Dispatcher.BeginInvoke(() => { GrabFrame(); }); camara.Initialized -= OnCameraInitialized; } private void GrabFrame() { if (camara != null) { WriteableBitmap wb = new WriteableBitmap(640, 480); camara.GetCurrentFrame(wb); wb.Invalidate(); } Dispatcher.BeginInvoke(() => { GrabFrame(); }); } private void acelerometro_ReadingChanged(object sender, Microsoft.Devices.Sensors.AccelerometerReadingEventArgs e) { Dispatcher.BeginInvoke(() => { double z = e.Z; eje.TranslateY = (z * 400); }); } } } |
Listo ahora si, podrás disfrutar de otro uso en la realidad aumentada (para mi gusto mas divertido que el anterior).
que onda, oye tengo una entrega final en 1 semana y necesito hacer justamente esto… pero no entiendo nada, no me lo quieres hacer y te pago!? osea que me mandes una foto q es la q ve la camara, la animacion y la aplicacion ya jalando… me avisas porfa? muchas gracias
Hola, yo tengo un LG con Windows Phone 7, desarrollo aplicaciones en visual studio 2010… me gusto mucho la primera parte de tu proyecto… pero la imagen que muestras no es 3D…
No lo has hecho para imagenes en 3D como 3D Studio Max o Blender???
Saludos
Hola, muy interesante tu proyecto, yo tengo un windows phone 7 y desarrollo aplicaciones en Visual Studio 2010… mi pregunta sería como lo aplicarias para imagenes 3D. Actualmente diseño en Blender
Saludos
Hola, muy bueno tu proyecto… pero para imagenes en 3D como blender, 3D stuido Max como se podrian cargar???
Saludos
Hola Omar:
Efectivamente no manejo ningún modelo en 3D sencillamente porque la idea es solo hacer la prueba de concepto, si quieres meter un modelo, debes comenzar por echarle un ojo a las librerías de Balder ( http://balder.codeplex.com/ ) pues son las que te permitirán integrar los elementos en 3D que buscas. Un punto importante a mencionar es que tus modelos deben tener la extensión .ASE y llevar la texturas por separado, ya lo verás con Balder. Otra sugerencia es que comiences primero por estudiarlo de manera paralela y después los unifiques pues Balder es un poco raro de entender al principio y ya que le tomas el hilo tiene mucha funcionalidad