OmkExamplesConfigFiles

Un article de OpenMASKWiki.

Jump to: navigation, search

Sommaire

Exemples de base

Cette partie regroupe les exemples illustrant l'usage basique (voir du style test unitaire) de différents composants réutilisables d'OpenMASK.
Pour tirer profit de ces exemples, il est important de bien examiner les fichiers de configuration associés.

Test d'une nouvelle installation d'OpenMASK

Le répertoire "Sample/1Basic-tests/Tests-Install-Package" vous donne différents fichiers de configuration simples pour vérifier qu'une nouvelle installation d'OpenMASK est prête à être utilisée.
Ces fichiers ont été initialement associés au package window 7. Le fichier x_envapp-exemple vous liste les différentes variables d'environnement utiles à l'exécution d'OpenMASK.
Vous commencez par vérifier sans MPI puis avec MPI.
Vous devez voir un scooter s'afficher dans une fenêtre. Il est à l'arrêt.

  • Les touches P et O contrôlent sa vitesse.
  • ESC arrête l'application.

Un fichier trace.txt peut également vous donner des messages sur le déroulement de l'application.
Cet ensemble de fichiers est tiré de l'exemple historique dont vous trouverez une description détaillée dans le chapitre des tutoriels.

Hello world

"Hello world" est en général l'exemple minimaliste de présentation et d'utilisation d'un logiciel. Pour OpenMASK, nous en proposons deux versions. L'une visualisable dès l'installation d'OpenMASK car elle réutilise des classes fournies dans le package OpenMASK. L'exemple Hello3D instancie de trois objets différents. L'autre est encore plus sipmle car composé de plusieurs instances d'une seule et unique classe. Mais il nécessite la programmation et la compilation de cette nouvelle classe.

Version ré-utilisation : graphique 3D

Cet exemple va instancier trois objets, chacun d'une des classes SimplePoint, Trajectory et OgreVis.
L'objet de type SimplePoint représente l'origine de l'univers. Il sera visualisé par un repère à trois branches.
L'objet de type Trajectory fournit une position courante sur une trajectoire définie par des points de passage et un degré de spline. Il sera visualisé par un cube.
Le dernier objet est le service de visualisation. On lui a mis deux extensions pour avoir une camera contrôlable au clavier-souris, et une réaction à la touche U qui affiche la position de la camera. La position initiale de la camera est définie dans le fichier decor.scene.
Il a deux objets visualisables représentant l'origine de l'univers et la position courante sur la trajectoire.

Version création : texte console

Pour une introduction minimaliste à la programmation OpenMASK, nous programmons une nouvelle classe d'objet de simulation extensible qui écrit dans la console utilisateur et éventuellement dans un fichier de trace : ExampleOSO.
Cet exemple fait partie du package OMKPluginSquelette qui fournit un modèle pour la construction d'un nouveau plugin OpenMASK.

  • Le fichier de configuration se trouve dans le répertoire config-tests et les sources de la classe dans le répertoire Source/ModuleExample/Source. Il y a une version monoprocessus et une autre multi processus via MPI.

La classe ExampleOSO a un paramètre de configuration "Sentence" de type chaîne de caractères. A chaque fois que l'objet sera actif il enregistrera dans le fichier de trace cette phrase. En même temps il demande au contrôleur de donner l'heure et le numéro du pas de simulation. Vous remarquerez que cela n'est affiché qu'une fois par pas de simulation du contrôleur.
Cet exemple illustre aussi l'usage des fréquences de fonctionnement pour les différentes instances des objets. Vous pourrez tester qu'on ne peut pas utiliser des fréquences inférieurs à 1.

La classe ExampleOSO hérite de la classe ExensibleSimulatedObject et redéfinit uniquement les deux classes assurant le chargement des paramètres propres à la classe (loadParameters), et le traitement d'un pas de simulation (computeParameters). LoadParameters n'est exécuté qu'un fois au début de la session et computeParameters est appelé à chaque pas de simulation de l'instance. La classe ExampleOSO déclare un seul attribut (_parameterSentence) et une variable (suite) .

Version temps interactif : clock

Cette version reprend l'exemple du "Hello Texte" avec l'ajout d'une horloge pour contrôler l'écoulement du temps.
OpenMASK n'est pas un système "temps réel". Sans contrôle, une application se déroule à la vitesse d'exécution permise par la machine hôte. Si il y a plusieurs machines, la synchronisation est ralentie par la plus lente. Si l'application est "inerte" et réagit simplement aux interactions de l'utilisateur alors celui ci est satisfait si les temps de réactions sont suffisamment rapides. Mais si l'application est "motorisée", les animations associées vont dépendre des temps d'exécution des machines. Si les machines ne sont pas assez puissantes pour donner l'illusion d'un déroulement au temps réel, on ne peut rien y faire. Mais si les machines sont trop puissantes, l'utilisateurs aura le sentiment de ne pas suivre comme il le voudrait. De plus, les vitesses de déroulement peuvent varier au cours de la session. Pour pallier ces inconvénients OpenMASK propose une horloge qui essaie de caler les fréquences d'exécutions avec les fréquences réelles. On dit que l'application se déroule en temps interactif.
L'horloge est un objet de simulation de la classe Clock.
Dans notre exemple, on a ajouté une instance de "Clock" et maintenant vous avez le temps d'apercevoir les messages qui s'affiche dans la console.

ESO SupportedObject

Le répertoire SupportedObject propose des exemples d'utilisation d'une classe d'objet extensible de type SupportedObject. Cette classe est définie dans le plugin CVII.
Un objet supporté a vocation a être attaché à un autre objet (son support) dont il suit la position via un éventuel décalage. A certains moments il peut être détaché de tout support.
Un objet supporté définit deux attributs :

  • offset qui enregistre sa position par rapport à son support. Offset peut être initialisé par son paramètre de configuration du même nom.
  • transform qui donne sa position dans le repère de l'univers. Ne JAMAIS mettre à jour cet attribut car il est constamment recalculé à partir de la position du support, de l'offset et des événements de type "Move" reçus depuis le dernier calcul.

Le supportedObject dispose aussi de deux attributs pour désigner le support :

  • supportName
  • supportTransformInput

Les valeurs de ces deux attributs sont en général fournies via le paramètre de configuration supportedBy

Chaque exemple est composé au minimum d'un visualiseur et d'un objet définissant l'origine du repère de l'univers.

A1-mouvements.bat

L'exemple A1 traite des mouvements de l'objet supporté (object2) par rapport à son support (object1)
A1 manipule object2 via des événements déclanchés par des touches clavier :

  • soit dans le repère propre de l'objet supporté (événement "LocalMove") : touches E, D et C
  • soit dans le repère du support (object1) (événement "RelativeMove") : touches R, F et V

Toutes ces modifications par évènements modifient l'attribut offset. Les deux groupes de touches proposent les mêmes valeurs de mouvement mais les effets sont différents. On peut mieux l'observer en commençant la manipulation par des rotations locales.

A1 peut aussi manipuler directement la valeur de l'offset dans l'extension toggleOffset : touche G
Cette forme d'utilisation de l'extension KeyTransformEmitterExtension appliqué à l'objet propriétaire avec le paramètre AttributeId envoie donc directetement à cet objet l'évenement "current_value_of_attribute_offset"

Vous verrez que cette même opération (touche B) appliquée à l'attribut transform n'a pas d'effet visible car l'attachement au support est immédiatement rétabli. Donc lorsque l'objet est effectivement attaché à un support on ne peut pas modifier son attribut transform. Sauf à le manipuler via un interacteur.

A2-changement-support.bat

A2 traite du changement de support.
A2 reprend les manipulations de A1 et ajoute la possibilité de migrer d'un support (object1) à un autre (object3) : touche G.

A2 manipule les objets supports (object1 et object3) via un toggle de l'attribut Position (respectivement touche Y et touche U).

A2 manipule le changement de support via l'événement "ChangeSupport" dans l'extension toogleSupport de type KeyConnectEmitterExtension Cette extension envoie un événement avec une paire de noms. Ici le premier nom est celui de l'objet support et le deuxième celui de son attribut de contrôle.

Dans le toggle de l'offset de l'objet supporté vous remarquerez que des rotations sont définies pour que l'axe Z négatif pointe toujours vers le centre du repère du support.

Lorsque l'on change de support, vous remarquerez que l'objet supporté ne change pas de place. Les valeurs de l'offset sont recalculées au moment du changement. Lorsqu'un objet change de support il envoie un événement youAreMySupportEventId (voir libellé) à son support.

Key...EmitterExtension

Ces deux exemples montrent aussi un usage des classes d'extensions KeyEmitterExtension.

  • KeyTransformEmitterExtension envoie une valeur de type Transform
  • KeyConnectEmitterExtension envoie une paire de deux noms OpenMASK.

Ce type de classe définit le nom de l'OSO qui va capter l'événement Key. En général c'est un OSO visualiseur qui est capable de capter tous les évènements clavier-souris dans une de ses fenêtres de visualisation.
Elle définit également le nom de l'évènement à envoyer et le nom de la touche qui sert d'activation. Attention, OpenMASK décode les caractères selon le clavier qwerty.
On a également ici deux usages de ce type de classe : soit l'évènement est envoyé à un objet tiers dont on donne le nom, soit il est envoyé à soit même lorsqu'on utilise le paramètre AttributeId.

VRPN

Plusieurs de ces cas d'usage de VRPN sont dans le répertoire config-tests du plugin.

Un usage d'une souris 2D

Dans cet exemple, vous utiliserez votre souris 2D classique. Il présente un usage du client générique et des deux utilitaires analogue-transform et bouton-clé.
Un cube est attaché aux mouvements de votre souris. Le bouton droit de la souris (ou la touche g du clavier) le fait sauter là différents emplacements.
N'oubliez pas de lancer le serveur vrpn.

Exemple PAC

C'est une variante de l'exemple Souris 2D, avec deux cubes, qui met également en évidence l'architecture PAC (Présentation-Abstraction-Contrôle) d'une application OpenMASK.
L'un des cubes est attaché aux mouvements de votre souris. L'autre a une animation automatisée liée à la position du premier cube.
Le bouton droit de la souris (ou la touche g du clavier) fait sauter le deuxième cube à différents emplacements.
N'oubliez pas de lancer le serveur vrpn.

Exemples élaborés et tutoriels

Cette partie présente des exemples plus complets ou plus pédagogiques que ceux de la partie basique.

Tutoriel de découverte

Ce tutoriel, se voulant pédagogique, présente de manière incrémentale, la constitution d'une application OpenMASK et sa construction à partir d'un fichier de configuration.
Il introduit les notions d'application de référence, de plugin, d'objet de simulation, de service de visualisation, de fréquence, de déploiement via MPI, d'extensions d'ESO.
Le répertoire Decouverte fournit les fichiers de configuration et les ressources du tutoriel, présenté et commenté dans la partie 4 de la page suivante (DecouverteRapideOMK).

"Historical Tutorial"

Ce tutoriel a droit à un traitement spécifique du fait qu'il ait été le premier exemple illustrant l'usage et la programmation de la version 4 d'OpenMASK. Une version anglaise des commentaires sur ce tutoriel est disponible dans cette page : Tutorial .
Les codes sources présentant la programmation d'un nouvel OSO sont dans le sous-projet "Tutorial/trunk/Source" de la forge.
Les exemples d'usage sont dans "Tutorial/trunk/config-tests".

  • startExample (cfg_start.omk) ré-utilise des OSO définis dans le noyau d'OpenMASK.
  • OSOBisExample (cfg_OSObis.omk) définit un nouvel objet extensible qui gère directement les bornes max et min de son déplacement sur l'axe X, ainsi que le pas du déplacement et le pas de rotation d'une roue. Les animateurs du visualiseur sont connectés aux attributs de l'ESO.
  • OSOExample (cfg_OSO.omk) présente en plus une utilisation de "AttributAnimator" : un attribut qui permet de construire dynamiquement l'animateur voulu dans un objet visuel de chacun des services de visualisation de l'application. Il n'y a plus d'animateurs définis dans le visualiseur. Maintenant il sont décris dans l'ESO lui même. Attention, le nom de ces descripteurs d'animateurs doit respecter une règle de nommage : identifiantattributanimatorAnimator

Tutoriel CVII

La Cabine Virtuelle d'Immersion et d'Interaction (CVII) est un paradigme central pour organiser, avec OpenMASK, l'immersion et l'interaction d'un utilisateur dans un monde virtuel.
Un ensemble de fichiers de configuration permettent de découvrir et de tester le paradigme de CVII dans le répertoire OMK_IIVC/config-tests. Voici la page wiki d'introduction à la CVII : OMKCviiPlugin.

Système solaire

Cet exemple exploite des ESO du plugin AddOns : Orbit, FixedPoint, ainsi que des extensions : PostOffset.
Il se trouve dans le répertoire Samples/2Tutoriels/SystemeSolaire

Navigation