TP Capteurs

Première partie : création d'un "niveau à bulle"

  1. Récupérer le projet HelloOpenGLES20 provenant de http://developer.android.com/shareables/training/OpenGLES.zip

  2. Tester ce projet en interagissant avec le triangle affiché

  3. Modifier ce projet pour y intégrer la capture des événements provenant de l'accéléromètre du périphérique Android

    • cf exemple de code du support de cours sur les capteurs et l'accéléromètre

    • dans la suite on supposera que l'AccelerometerListener est une classe interne de MainActivity

  4. Ajouter à la vue de l'activité un affichage de ces données d'accélération

  5. Modifier la classe Square (fichier Square.java) pour réduire la taille du carré affiché

    • il suffit de modifier les valeurs du tableau de coordonnées squareCoords

  6. Dans la classe MyGLRenderer (fichier MyGLRenderer.java) :

    • supprimer l'affichage du triangle en commentant cette instruction :

      • // mTriangle.draw(scratchT);

    • ajouter une méthode permettant d'indiquer de nouvelles coordonnées pour afficher le carré

      • public void setPosition (float x, float y) {

      • mX = x ;

      • mY = y ;

      • }

    • ajouter des attributs permettant de calculer la nouvelle position 3D de ce carré :

      • private final float[] mTranslationMatrix = new float[16];

      • private final float[] mInitialTranslationMatrix = new float[16];

      • private float mX;

      • private float mY;

    • dans la méthode public void onSurfaceCreated, initialiser la matrice de position initiale du carré :

      • Matrix.setIdentityM (mInitialTranslationMatrix, 0) ;

    • dans la méthode public void onDrawFrame, calculer la position du carré en fonction de mX et mY :

      • float[] scratchS = new float[16];

      • Matrix.translateM (mTranslationMatrix, 0, mInitialTranslationMatrix, 0, mX, mY, 0.0f);

      • Matrix.multiplyMM (scratchS, 0, mMVPMatrix, 0, mTranslationMatrix, 0);

      • mSquare.draw (scratchS)

    • penser à commenter l'ancien dessin du carré :

      • //mSquare.draw (mMVPMatrix);

  7. Dans la classe MyGLSurfaceView (fichier MyGLSurfaceView.java) :

    • commenter l'instruction :

      • //setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

    • et la remplacer la une instruction qui assurera un affichage du carré en continu ;

      • setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

    • ajouter une méthode permettant de transmettre les nouvelles coordonnées du carré à l'instance de la classe MyGLRenderer

      • public void setPosition (float x, float y) {

      • mRenderer.setPosition (x, y) ;

      • }

  8. Dans la classe MainActivity (fichier MainActivity.java) :

    • dans la méthode public void onSensorChanged de la classe interne AccelerometerListener, ajouter une instruction permettant de transmettre une position au carré en fonction des accélérations captées :

      • mGLView.setPosition (- accelerometerValues [0], accelerometerValues [1]) ;

    • il faudra avoir modifié la déclaration de l'attribut mGLView :

      • private MyGLSurfaceView mGLView ;

Seconde partie : création d'une "boussole"

  1. Récupérer encore une fois le projet HelloOpenGLES20 provenant de http://developer.android.com/shareables/training/OpenGLES.zip

  2. Modifier ce projet pour y intégrer la capture des événements de rotation du périphérique Android

    • par soucis de simplicité, on se contentera de ce type bien qu'il soit "deprecated"

      • Sensor sensor ;

      • ...

      • sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

  3. Ajouter à la vue de l'activité un affichage de ces données d'orientation

  4. Modifier la classe Triangle (fichier Triangle.java) pour affiner la taille du triangle affiché (pour qu'il ressemble à une aiguille de boussole)

    • il suffit de modifier les valeurs du tableau de coordonnées triangleCoords

  5. Dans la classe MyGLRenderer (fichier MyGLRenderer.java) :

    • supprimer l'affichage du carré en commentant cette instruction :

      • //mSquare.draw (mMVPMatrix);

  6. Dans la classe MyGLSurfaceView (fichier MyGLSurfaceView.java) :

    • commenter l'instruction :

      • //setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

    • et la remplacer la une instruction qui assurera un affichage du triangle en continu ;

      • setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

    • ajouter une méthode permettant de transmettre l'orientation du triangle à l'instance de la classe MyGLRenderer

      • public void setAngle (float a) {

      • mRenderer.setAngle (a) ;

      • }

  7. Dans la classe MainActivity (fichier MainActivity.java) :

    • dans la méthode public void onSensorChanged du listener interne qui aura été créé, ajouter une instruction permettant de transmettre une orientation au triangle en fonction des orientations captées :

      • mGLView.mGLView.setAngle (- orientationValues [0]) ;