Série 19 : Programmation par évènements Buts



Documents pareils
Les algorithmes de base du graphisme

GESTION DU LOGO. 1. Comment gérer votre logo? Format de l image Dimensions de l image Taille de l image 9

C.F.A.O. : Conception et Fabrication Assistées par Ordinateur.

Bien travailler sur plusieurs écrans

Java 7 Les fondamentaux du langage Java

Utilisation du logiciel GALAAD

Automatisation d'une Facture 4. Liste Déroulante Remises Case à cocher Calculs

Traitement par lot redimensionner des images

NOTICE D' UTILISATION CAMWORKS FRAISAGE. Luc Vallée Lycée Blaise Pascal Segré

Documentation Administrateur

I. Introduction aux fonctions : les fonctions standards

La C.A.O (Conception Assistée par Ordinateur). Le logiciel de C.A.O.

79140 CERIZAY. Collège G. CLEMENCEAU. Page 1 sur 18

TRUCS & ASTUCES SYSTEME. 1-Raccourcis Programme sur le Bureau (7)

Chapitre 2. Classes et objets

VOS PREMIERS PAS AVEC TRACENPOCHE

Programmation par les Objets en Java

Guide d'utilisation de WebEx Meeting Center avec les Salles de réunion de collaboration (Collaboration Meeting Rooms / Nuage CMR)

Le langage C. Séance n 4

Création d'une interface graphique

Compte-rendu de projet de Système de gestion de base de données

HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control

Réaliser un PUBLIPOSTAGE

Dans l idéal, ceci devrait être fait en amont pour chaque image envoyée sur l espace de stockage de votre site internet.

Interface PC Vivago Ultra. Pro. Guide d'utilisation

Cahier Technique. «Développer une application intranet pour la gestion des stages des étudiants» Antonin AILLET. Remi DEVES

Guide d utilisation. Table des matières. Mutualisé : guide utilisation FileZilla

Créer des étiquettes avec les adresses d'un tableau Calc

Chapitre 4 Pierre, papier, ciseaux

Ateliers Python+Qt : Premiers pas : Comment développez ses propres interfaces graphiques sur le RaspberryPi?

Transférer et enregistrer les photos sur l'ordinateur

Créer une base de données

Introduction : Cadkey

Algorithmique avec Algobox

TD séance n 2c Mise à jour des Systèmes

My Custom Design ver.1.0

Formation > Développement > Internet > Réseaux > Matériel > Maintenance

Nuxeo 5.4 : les nouveautés

Utilisation de l'outil «Open Office TEXTE»

Publication Assistée par Ordinateur

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Vous devez tout d abord réaliser l esquisse (le dessin de la pièce en 2 dimensions) avant de mettre cette pièce en volume.

Les chaînes de caractères

Guide Draw. Chapitre 5 Combiner plusieurs objets

COPIER, COUPER, COLLER, SELECTIONNER, ENREGISTRER.

Fête de la science Initiation au traitement des images

Un exemple avec WORKSPACE d'interwrite

OneDrive, le cloud de Microsoft

Sage CRM. 7.2 Guide de Portail Client

2013 Pearson France Adobe Illustrator CC Adobe Press

Français. Le produit vous offre un outil pratique de qualité supérieure pour. Introduction. Information de sécurité

Adobe Illustrator Logiciel de dessin vectoriel et de Cartographie Assistée par Ordinateur

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

Publipostage avec Open Office Writer et Open Office Calc

TABLEAU CROISE DYNAMIQUE

LibreOffice Calc : introduction aux tableaux croisés dynamiques


Réalisation de cartes vectorielles avec Word

Tutorial et Guide TeamViewer

Leçon N 5 PICASA Généralités

Gérer ses fichiers et ses dossiers avec l'explorateur Windows. Février 2013

Gestion de projet. GanttProject Didacticiel V novembre Gérard Gervois Frédéric Giamarchi

Importation des données dans Open Office Base

TD de supervision. J.P. Chemla. Polytech Tours Département productique 2ème année

Tablet. E-manual V1.0

Rapidolect Les Productions de la Columelle ( ) Page 1

Présentation des PowerToy pour Windows XP

Utilisation de l éditeur.

Organiser ses photos sur l ordinateur

Mes premiers diaporamas avec Open Office Impress?

SOMMAIRE. Travailler avec les requêtes... 3

Ceci est un Chromebook, ton ordinateur!

Formation VBA 3 Interagir

MERLIN. Guide de démarrage rapide Gestion de projet professionnelle ProjectWizards GmbH, Melle, Allemagne. Tous droits réservés.

Télécom Nancy Année

1 Création d une pièce. 2 Travail complémentaire. 1-1 Réglage des barres d outils. 1-2 Exemples de réalisation de pièces à l aide d un modeleur 3D

Généralités sur le Langage Java et éléments syntaxiques.

TP2 : Client d une BDD SqlServer

Cours de D.A.O. Mécanique

Groupe Eyrolles, 2003, ISBN : X

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

Parcours FOAD Formation EXCEL 2010

Guide de démarrage rapide Centre de copies et d'impression Bureau en Gros en ligne

Date de diffusion : Rédigé par : Version : Mars 2008 APEM 1.4. Sig-Artisanat : Guide de l'utilisateur 2 / 24

Dessiner dans Galaad FRANÇOIS PALLUT

Exemple d application en CFD : Coefficient de traînée d un cylindre

LES TOUT PREMIERS PAS

Alfresco Guide Utilisateur

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Guide pour la réalisation d'un document avec Open Office Writer 2.2

Premiers pas avec NetSupport SCHOOL

Le Sphinx Millenium Modes opératoires Préparer, administrer, Dépouiller les enquêtes

MDI Chèque de Allégroupe Réclamation

pcon.planner 6 Préparer et présenter une implantation en toute simplicité

1. Cliquez sur dans le coin supérieur gauche de l'écran 2. Sélectionnez la Langue de l'interface désirée 3. Cliquez sur

Utilisation de XnView

Cours Excel : les bases (bases, texte)

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Transcription:

Série 19 : Programmation par évènements Buts Dans cette série vous allez voir comment gérer les événements provenant de la souris, lorsque vous interagissez avec l'interface GLUT/GLUI. Cela vous permettra de terminer l'application de cinématique inverse. Conseils pour bien passer des séries 17 (OPENGL) et 18 (GLUI) à la série 19: aujourdhui nous travaillons avec 2 fenètres, l'une dédiée au dessin avec OPENGL (série17) et l'autre à la gestion d'une interface GLUI (série 18). Nous allons en plus gérer les évènements du clavier et de la souris. Pour comprendre le code C++: voir cours "introduction à C++", et "Contrôle de l interaction avec l utilisateur avec GLUT/GLUI". La série 16 indique également comment inclure les fichiers en-tête écrits en C et comment déclarer des variables globales à un fichier écrit en C++. Complément sur l'architecture du programme: Nous travaillons dans le cas plus général traité dans le "Contrôle de l interaction avec l utilisateur avec GLUT/GLUI". C'est la bibliothêque GLUI qui pilote GLUT pour gérer l'interaction avec l'utilisateur. La plupart des initialisations doivent être faites en utilisant des fonctions de cette bibliothêque de manière à garantir la cohérence de l'affichage de l'interface graphique utilisateur. Voici en particulier quelques éléments importants à retenir: Concept de fenêtre courante associée aux fonctions callback et conséquences d'un glutpostredisplay Dans le contexte qui nous intéresse aujourdhui il existe plusieurs fenêtres. Pour GLUT il existe toujours une fenètre qui est la "fenètre courante", cela peut être une des fenètres GLUT ou GLUI qui ont été créées dans la phase d'initialisation (car une fenètre GLUI est simplement un type spécialisé de fenètre GLUT). Il faut soit-même gérer la cohérence de l'affichage dans la ou les fenètre GLUT. A chaque fois qu'un évènement change l'état du modèle il faut mettre à jour l'affichage de son dessin. Cela est fait par un appel de la fonction glutpostredisplay() qui demande un nouvel affichage de la fenètre courante au moment de l'appel. Il faut savoir que la fenètre courante est automatiquement mise à jour par l'évènement qui est traité ; en effet tout évènement est associé à une fenètre GLUT (ou un widget GLUI) à sa création. Par exemple: après avoir créé une fenètre GLUT de dessin, appelons-la main_window, toutes les déclarations de callback display, reshape, keyboard, mouse, special, (sauf idle qui est différente)... sont associées à cette fenètre GLUT. Lorsque les évènements correspondants sont traités la fenètre main_window

devient la fenètre courante. Si on fait un appel glutpostredisplay() alors c'est la fenètre main_window qui sera redessinée. En cas de doute on peut forcer la fenètre courante avec glutsetwindow(main_window) avant de demander le redisplay. Redisplay automatique de la "main_gfx_window" par un widget GLUI Lorsque l'évènement d'un widget GLUI est traité cela produit automatiquement un évènement de Redisplay pour la fenètre GLUT main_window qui a été déclarée à l'initialisation avec l'appel : glui->set_main_gfx_window( main_window ); Exercice 1 (niveau 1): utilisation des widgets GLUI pour changer les longueurs des segments Commencez par copier toutes les fichiers de boulic/serie19 en utilisant la commande cp -r source destination. Pour compiler le code, il faut utiliser make. Un programme demo_cine.x est fourni. Bien que la série 19 traite le même problème que la série 17, remarquez dans le code mis à disposition que tous les paramètres de la chaîne articulée sont maintenant rassemblés dans un nouveau type de donnée CHAINE mis en oeuvre avec une structure. Plus de fonctions sont offertes dans le module chaine pour alléger l'écriture de cine.cpp. Complétez la fonction set_length_cb (dans cine.cpp) pour qu'elle mette à jour les deux champs length_segment1 et length_segment2. Pour cette série nous recommandons de mettre à jour les autres informations caractérisant la chaîne articulée au même moment, c'est à dire dans la callback qui reçoit la nouvelle valeur d'un paramètre. Cela concerne les angles et l'atteignabilité du but pour la chaîne ainsi modifiée. Il suffit d'appeler la fonction chaine_update() pour cela. L'idée est qu'il ne faut pas retarder la mise à jour de l'état de la chaîne articulée. C'est une mauvaise approche d'attendre l'appel de la callback de display pour faire cette mise à jour. La callback de display doit être réservée seulement au dessin de l'état courant de la chaîne et non pas à la mise à jour de la chaîne. Cela respecte le principe de décomposition fonctionnelle présenté en cours et à mettre en oeuvre pour le projet. Ensuite recompilez et testez le résultat: vous devriez alors être en mesure d'utiliser les deux widgets pour modifier les longueurs des segments.

Exercice 2 (niveau 1): Evénements provenant de la souris Voyons maintenant comment gérer l'interaction avec la souris dans la fenètre GLUT. Il faut initialiser la fonction callback avec : GLUI_Master.set_glutMouseFunc( mouse_cb ) Voici la fonction gérant les événements provenant de la souris: void mouse_cb(int button, int state, int x, int y); Le paramètre button peut prendre la valeur: GLUT_LEFT_BUTTON (1) GLUT_MIDDLE_BUTTON (2) GLUT_RIGHT_BUTTON (3) Le deuxième state peut prendre la valeur: GLUT_DOWN (bouton appuyé) GLUT_UP Les deux paramètres (int x, int y) définissent la position de la souris en unités "pixel" dans le système de coordonnées GLUT. Une autre fonction permet d'enregistrer une fonction callback qui est appelée si la souris est bougée avec au minimum un bouton de la souris appuyé. Elle est illustrée dans le document complémentaire de niveau 0. void glutmotionfunc(void (*func)(int x, int y)); La fonction set_point_cb est definie comme fonction callback dans le code mis à disposition. Les arguments de cette fonction sont les coordonnées x et y de la souris. Attention! le système de coordonnées n'est pas celui utilisé par Open GL (voir série 17). L'origine (0, 0) du widget se situe en haut, à gauche du rectangle. L'axe x va vers la droite positivement. L'axe y va vers le bas positivement. Par conséquent, lorsque la fonction set_point_cb est appelée, les cordonnées x et y doivent être converties dans le système coordonnées Open GL avant de pouvoir être utilisées comme but à atteindre (exercice suivant). Pour cet exercice faites seulement un printf des coordonnées x et y reçues par la fonction callback.

Exercice 3 théorique (niveau 1): Trouvez les formules de conversion entre les coordonnées (x,y) d'un point exprimées en pixels (données par GLUT) et ses coordonnées (x',y') pour Open GL. On suppose que le domaine de l'espace 2D défini avec Open GL est [xmin, xmax] et [ymin, ymax], et que la taille en pixels de la fenêtre est width horizontalement et height verticalement. Exercice 4 (niveau 0): utilisation de la souris et du clavier avec GLUT/GLUI. Exercice 5 (niveau 1): Grâce au résultat de l'exercice 3, complétez la fonction set_point_cb (dans cine.cpp) pour que le but à atteindre (coordonnées but_x et but_y, exprimées dans le système Open GL) soit mis à jour. Remarque: les variables globales width et height contiennent la taille (en pixels) de la fenètre GLUT. Exercice 6 (niveau 1): glutmotionfunc On aimerait pouvoir déplacer le but de l'effecteur avec la souris tout en gardant un bouton appuyé. Pour cela, il faut réagir à l'événements de type glutmotionfunc. Il faut enregistrer la fonction set_point_motion_cb comme callback de glutmotionfunc dans le code source cine.cpp. Testez le résultat. Exercice 7 (niveau 1): Mise à jour de l'interface graphique depuis une fonction Un dernier problème important est la mise à jour d'un attribut d'un widget, depuis une fonction C. GLUI ne permet pas de changer la couleur d'un widget. Par contre on peut utiliser un widget de type EditText pour indiquer si le but est atteignable ou pas (voir demo: "Oui" et "Non"). Pour cela, il faut procéder de la façon suivante. Premièrement, il faut initialiser un EditText sur l'interface avec des commandes GLUI (prototype p27 du manuel GLUI). Avec la fonction set_text ( "Text") il est possible de changer le texte affiché par ce widget. Complétez la fonction redraw_all () dans cine.cpp, pour qu'il y ait un texte qui reflète l'atteignabilité du but qui a été spécifié ("Oui" si il est atteignable, et "Non" sinon). Cette information est disponible dans l'état courant de la chaîne. Exercice 8 (niveau 1):

Remarquez que si vous changez la taille de la fenêtre, l'affichage se déforme (les cercles deviennent des ellipses). Cela est dû au fait que le rapport entre les dimensions X/Y du domaine Open GL et de la taille en pixels du widget glut n'est plus le même (voir cours). Intervenez dans la fonction reshape_cb pour modifier les paramètres x_min, x_max, y_min, y_max de la fonction glortho pour que le domaine établi conserve le même rapport largeur/hauteur que celui de la fenètre de dessin. Exercice 9 (niveau 1):utilisation de la callback idle Le programme de chaîne articulée exploré dans les séries 17 à 19 est purement réactif dans le sens où rien ne se passe si l'utilisateur ne produit pas d'évènement. Nous cherchons ici à exploiter le temps libre (idle en anglais) quand il ne reste aucun événement dans la file d attente. Cette possibilité a déjà été abordée dans le dernier exercice de la série 18 (revoir la donnée pour les déclarations dans la phase d initialisation). remarque : la fonction callback idle est unique pour toute l'application même si plusieurs fenètres GLUT ou GLUI ont été créées. C'est logique puisque la fonction idle est appelée lorsque la file d'attente des évènements est vide ; il n'y a pas de moyen particulier pour décider quelle fenêtre lui serait associée. Travail à faire: compléter le programme de la chaîne articulée en ajoutant une checkbox pour activer un mode special du programme: quand la checkbox est cochée le programme modifie, dans la fonction callback idle, le but de la chaine en le rapprochant de l'origine. Par exemple le programme de démo multiplie chaque coordonnée du but par 0.99 puis appelle chaine_update pour mettre à jour les autres paramètres de la chaîne. Si on veut visualiser l'évolution de la simulation il faut aussi produire un évènement de redisplay à la fin de cette fonction avec l'appel glutpostredisplay(); Exercice 10 (niveau 0): synchronisation avec le temps réel (document séparé) Exercice 11 (niveau 0): allocation dynamique d une structure (document séparé)