UIAccelerometer Sample Code

Vamos a ver en este ejemplo como utilizar los acelerometros que trae el iPhone para detectar la inclinación del mismo.

Crear un Proyecto OpenGL

Como siempre vamos a empezar desde 0 y es creando un proyecto en OpenGL Es, abrimos el XCode vamos a File > New Proyect y seleccionamos un proyecto “OpenGL ES Application“, pulsamos el botón choose y le damos el nombre que nos interese:

Nuestra Clase GL

Por ahora no vamos a aportar nada nuevo a nuestra clase GL para dibujar sprites, así que os toca copiar los pasos que ya hicimos en nuestro capitulo Sprites en OpenGL os recuerdo que ahi solamente vamos a definir la clase GL.m vamos a agregar el Framework CoreGraphics.Framework, y vamos a añadir un nuevo archivo gráfico a los resources del proyecto.

También deberemos copiar todas las modificaciones que hicimos a la clase EAGLView.m, los metodos inicializar, setupView, clearBuffer y swapBuffer que agregamos.

Implementando UIAcclerometer

Ahora viene la finalidad del proyecto … y realmente lo fácil, enseguida veréis que no tiene ninguna dificultad:

Vamos a EAGLView.h

y dentro de la interfaz, añadimos estas variables:

Por un lado vemos que tenemos la textura que vamos a usar, un par de variables para guardar un angulo … y vemos 3 labels. Estas labels serán para poner texto en pantalla, algo que se sale un poco de la finalidad del ejemplo pero que es muy fácil de implementar y nos ayudará a ver que está pasando realmente.

Ademas, que vamos a añadir estas Labels al proyecto sin pasar por el InterfaceBuilder, las ponemos a pelo, como los hombres de verdad

Seguimos en EAGLView.h y añadimos (ya fuera de la interfaz) estos métodos:

Y ya está, por aquí todo está listo.

Abrimos el archivo EAGLView.m

En primer lugar vamos a ver como se implementan las labels, para ello tenemos el método newLabelWithOffset que crea una label en la posición indicada:

y dentro de nuestro método ‘initWithCoder‘ crearemos las 3 labels así:

UIAccelerometer

Aquí tenéis todo el código necesario, en nuestro método inicializar inicializamos el acelerometro diciéndole que delegue sus eventos sobre esta clase, y debajo tenemos el método accelerometer implementado que es quien recibe los eventos.

En este método acceleratometer podéis ver como sacamos los valores X e Y de aceleración.. que realmente nos indican el coseno y el seno de la inclinación del dispositivo, y mediante un atan sabemos el angulo de inclinación … sólo son matemáticas.

Podéis ver como se meten estos valores en las 3 labels para poder verlos en pantalla, veréis como tanto x como y representan valores comprendidos entre 1 y -1 (propios del seno y coseno unitario de toda la vida).

Bueno a lo que vamos si os fijáis bien tengo una segunda variable llamada angle2 que no es mas que una interpolacion del angulo actual con el angulo anterior (queeee???) … si eso, los acerelometros tienen bastante variación, aunque dejemos el dispositivo quiero están fluctuando a lo loco .. y esto hace que el angulo no quede estable, mediante esta segunda variable solo intentamos suavizar esos cambios bruscos. El efecto es visible así que esperar a ejecutar y lo comprenderéis mejor.
Porque solo nos queda nuestro método draw!!!!

Aquí podemos ver como dibujamos 2 sprites en pantalla, uno usando el angle que va un poco a lo loco, y otro mediante angle2, podéis girar el dispositivo y veréis como los 2 van juntitos … pero que nuestro sprite de la derecha parece mas cuerdo que el otro.
🙂

Actualización para el SDK 3.2 … Este sample data de principio del 2009 así que no se con que SDK lo hice, pero veo que mucha gente está teniendo problemas con el actual SDK, y mas teniendo en cuenta los cambios que tiene el template base del OpenGL, así que os dejo la actualización del proyecto completo para que os función en el SDK 3.2

 RotateSample.zip (179.1 Kb)

You may also like...

3 Responses

  1. frocco dice:

    Buenas!
    No tenes el .zip del proyecto????
    Estoy aprendiendo OpenGL para Iphone y todavia me hace falta seguimiento 😛

    Abrazo grande y muy bueno el blog!!!

  2. Kekoh dice:

    Hola, todo perfecto excepto por un par de warnings que no he podido eliminar y que no permiten ejecutar el accelerometer en el móvil:

    _________________________ #1______________________________

    “Passin argument 1 of ‘ImageNamed:’ from imcompatible pointer type” en

    // Creates a Core Graphics image from an image file
    spriteImage = [UIImage imageNamed:cadena].CGImage;

    ___________________________________________________________

    Y:
    ___________________________#2______________________________

    “Passin argument 1 of ‘loadTexture:’ from imcompatible pointer type” en:

    // Cargamos la unica textura que vamos a usar
    texture = [GL loadTexture:@”4Sprites.png”];

    ___________________________________________________________

    Gracias y saludos.

  3. neofar dice:

    Siempre tuve desde el principio un poco de caos con los parámetros char * y NsString, y ese warning siempre ha estado ahí, pero siempre me había permitido ejecutar la aplicación, tanto en el simulador con en el teléfono.

    De todos modos esto se hizo con las primeras versiones del SDK, así que intentaré portar el sample a la ultima versión y cuelgo el proyecto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *