IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Description of Objects in VPython

Intéractions Souris

Introduction

Les objets souris sont obtenus par l'attribut mouse d'un objet d'affichage tel que scene. Par exemple, pour obtenir l'entrée souris de la fenêtre par défaut créée par Visual, utilisez scene.mouse. Pour des exemples simples de manipulation de la souris, voir Exemple de clic de souris et Exemple de dragage de souris.

Un objet souris possède un groupe d'attributs correspondant à l'état courant de la souris. Il a aussi les fonctions getevent() et getclick(), qui retournent un objet avec des attributs semblables correspondant à l'état de la souris lors du dernier appui de l'utilisateur sur les boutons de la souris. Si l'utilisateur n'a encore rien fait avec les boutons de la souris, getevent() et getclick() arrêteront l'exécution du programme jusqu'à ce que cela arrive.

Différentes sortes de souris

Les routines de l'objet souris peuvent manipuler des souris à 3 boutons, avec les boutons "gauche", "droit", et "du milieu". Pour les systèmes avec une souris à 2 boutons, le bouton "du milieu" est constitué des boutons gauche et droit pressés en même temps. Pour les systèmes avec une souris à un bouton, le bouton droit est invoqué en maintenant appuyée la touche SHIFT et le bouton du milieu est invoqué en maintenant appuyée la touche CTRL.

Etat courant de la souris

pos La position courante en 3D du curseur de la souris; scene.mouse.pos. Visual choisit toujours un point dans le plan parallèle à l'écran et passant à travers display.center. (Voir Projection des informations de la souris sur un plan donné pour d'autres options.)

button = None (pas de bouton pressé), 'left', 'right', 'middle', ou 'wheel' (molette appuyée sur certaines souris Windows). Exemple: scene.mouse.button == 'left' est vrai si le bouton gauche de la souris est actuellement appuyé.

pick Le plus proche objet de la scène qui tombe sous le curseur ou None. Actuellement seuls les sphères, boîtes, cylindres et objets convexes peuvent être sélectionnés. L'objet sélectionné est scene.mouse.pick.

pickpos Le point 3D sur la surface de l'objet sélectionné qui tombe sous le curseur, ou None; scene.mouse.pickpos.

camera La position actuelle en lecture seule de la caméra ainsi positionnée par l'utilisateur, scene.mouse.camera. Par exemple, mag(scene.mouse.camera-scene.center) est la distance du centre de la scène à la position courante de la caméra. Si vous voulez définir la position et la direction de la caméra en le programmant, utilisez scene.forward et scene.center, décrit dans Contrôler la fenêtre.

ray Un vecteur unitaire pointant depuis la caméra dans la direction du curseur de la souris. Les points sous lesquels le curseur sont exactement { camera + t*ray pour t>0}.

   Les attributs camera et ray définissent ensemble tous les points 3D sous le curseur de la souris.

project() Projette la position sur un plan. Voir Projeter la position de la souris sur un plan donné.

alt = 1 si la touche ALT est pressée, sinon 0

ctrl = 1 si la touche CTRL est pressée, sinon 0 (pour une souris à un bouton, a un sens uniquement si les boutons de la souris sont non appuyés)

shift = 1 si la touche SHIFT est pressée, sinon 0 (pour une souris à un bouton, a un sens uniquement si les boutons de la souris sont non appuyés)

Notez que les programmes qui dépendent des modifications des évènements souris avec les touches CTRL ou SHIFT ne fonctionneront pas correctement avec une souris à un bouton (ainsi pour la plupart des systèmes Macintosh), car la touche CTRL invoque le bouton "du milieu", et la touche SHIFT invoque le bouton "droit".

Obtention des évènements

Il y a quatre sortes d'évènements souris: press (pression), click (clic), drag (dragage) et drop (relachement):

   Un évènement press intervient lorsqu'un bouton de la souris est pressé.

   Un évènement click intervient lorsque tous les boutons de la souris sont relâchés avec aucun ou un très léger mouvement de celle-ci.
   Notez qu'un évènement click arrive quand le bouton de la souris est relâché. Voir Exemple de clic de souris.

   Un évènement drag intervient lorsque la souris est déplacée légèrement après un évènement press avec les boutons de la souris encore appuyés.
   Ceci peut être utilisé pour signaler le début d'un dragage d'un objet. Voir Exemple de dragage.

   Un évènement drop intervient lorsque les boutons de la souris sont relachés après un évènement drag.

Entre un évènement drag (début d'un dragage) et un évènement drop (fin du dragage), il n'y a aucun évènement souris mais vous pouvez examiner continuellement la position mise à jour de la souris indiquée par scene.mouse.pos. Voici comment appeler un évènement qui arrive et obtenir les informations à propos de cet évènement:

events Le nombre d'évènements (press, click, drag, ou drop) qui sont dans la file d'attente; c'est-à-dire scene.mouse.events.
scene.mouse.events = 0 peut être utilisé pour abandonner toutes les entrées. Aucune valeur autre que 0 ne peut être assignée.

getevent() Obtient l'évènement souris le plus vieux et le supprime de la file d'attente d'entrées. Si aucun évènement n'attend dans la file d'attente (c'est-à-dire si scene.mouse.events vaut zéro), getevent() attend jusqu'à ce que l'utilisateur entre un évènement souris (press, click, drag, ou drop). getevent() retourne un objet avec des attributs semblables à un objet souris: pos, button, pick, pickpos, camera, ray, project(), alt, ctrl, et shift. Ces attributs correspondent à l'état de la souris quand l'évènement arrive. Par exemple, après avoir exécuté mm = scene.mouse.getevent() vous pouvez visualiser les propriétés changeantes de cet évènement telles que mm.pos, mm.pick, mm.drag (voir ci-dessous), etc.

Si vous êtes intéressé par chaque type d'évènement (press, click, drag, et drop), vous devez utiliser events et getevent(). Si vous n'êtes intéressé que par les évènements de clic gauche (bouton gauche appuyé et relâché sans mouvements significatifs de la souris), vous pouvez utiliser clicked et getclick():

clicked Le nombre de clics gauche qui sont dans la file d'attente; c'est-à-dire scene.mouse.clicked.
Ceci n'inclut pas le nombre d'évènements autres (press, drag, ou drop).

getclick() Obtient l'évènement clic gauche de la souris le plus vieux (pression du bouton gauche et relâchement de celui-ci dans presque la même position) et le supprime de la file d'attente d'entrées, se débarassant de tous les évènements press, drag ou drop. Si aucun clic n'est en attente dans la queue (c'est à dire, si scene.mouse.clicked vaut zéro), getclick() attend jusqu'à ce que l'utilisateur clique. Autrement, getclick() est la même chose que getevent().

C'est une technique utile de déboggage que d'insérer scene.mouse.getclick() dans votre programme à un endroit où vous souhaitez vous arrêter temporairement pour examiner la scène. Puis cliquez simplement pour continuer.

Informations supplémentaires obtenues avec getevent() ou getclick()

En plus des informations disponibles avec scene.mouse, getevent() et getclick() fournissent ces informations supplémentaires:

press = 'left' ou 'right' ou 'middle' pour un évènement press, ou None

click = 'left' ou 'right' ou 'middle' pour un évènement click, ou None; dans ce cas, pos et d'autres attributs correspondent à l'état de la souris au moment du déclenchement de l'évènement press, ainsi impossible de perdre l'information de la position initiale. Voir Exemple de clic.

drag = 'left' ou 'right' ou 'middle' pour un évènement drag, ou None; dans ce cas, pos et d'autres attributs correspondent à l'état de la souris au moment du déclenchement de l'évènement press, ainsi impossible de perdre l'information de la position intiale. Voir Exemple de dragage.

drop = 'left' ou 'right' ou 'middle' pour un évènement drop, ou None

release = 'left' ou 'right' ou 'middle' suivant les évènements click et drop, indiquant quel bouton a été relâché, ou None

Normalement, draguer avec le bouton droit ou du milieu représente une rotation ou un zoom et est traité automatiquement par Visual, si bien que vous pouvez vérifier les évènements drag du bouton gauche ou drop simplement en vérifiant si drag ou drop sont vrais (en Python, une chaîne de caractères non vide telle que 'left' est vraie, None est faux). A moins que vous ne mettiez hors service le zoom par l'utilisateur (scene.userzoom = 0), click, drag, et drop avec le bouton du milieu sont invisibles à votre programme. A moins que vous mettez hors service la rotation par l'utilisateur (scene.userspin = 0), click, drag, et drop avec le bouton droit de la souris sont invisibles à votre programme.

Projection de la position de la souris sur un plan donné

Voici comment obtenir la position de la souris relativement à un plan particulier de l'espace:

temp = scene.mouse.project(normal=(0,1,0), point=(0,3,0))

if temp: # temp vaut None si aucun intersection avec le plan

    ball.pos = temp

Ceci projette le curseur de la souris sur un plan qui est perpendiculaire à la normale spécifiée. Si point n'est pas spécifié, le plan passe à travers l'origine. Cela retourne une position 3D, ou None si la projection de la souris manque le plan.

Dans l'exemple montré ci-dessus, l'utilisateur de votre programme sera capable d'utiliser la souris pour placer la balle dans un plan parallèle au plan xy, à une hauteur de 3 au-dessus du plan xy, peu importe que l'utilisateur ait ou non modifé le point de vue.

Vous pouvez spécifier à la place une distance perpendiculaire d de l'origine au plan qui est perpendiculaire à la normale spécifiée. L'exemple au-dessus est équivalent à

temp = scene.mouse.project(normal=(0,1,0), d=3)

 

Copyright © 2006 Guillaume et Yoann Duriaud. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.