TP Capteurs
Première partie : création d'un "niveau à bulle"
Récupérer le projet HelloOpenGLES20 provenant de http://developer.android.com/shareables/training/OpenGLES.zip
Tester ce projet en interagissant avec le triangle affiché
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
Ajouter à la vue de l'activité un affichage de ces données d'accélération
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
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);
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) ;
}
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"
Récupérer encore une fois le projet HelloOpenGLES20 provenant de http://developer.android.com/shareables/training/OpenGLES.zip
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);
Ajouter à la vue de l'activité un affichage de ces données d'orientation
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
Dans la classe MyGLRenderer (fichier MyGLRenderer.java) :
supprimer l'affichage du carré en commentant cette instruction :
//mSquare.draw (mMVPMatrix);
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) ;
}
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]) ;