Logo Poly
FAQ
-----

FAQ

Table des matières

Voici une liste de réponses à certains problèmes, certes classiques, mais qui peuvent faire perdre un temps précieux. J'ai également inséré des conseils pour améliorer vos projets en ajoutant du contenu comme du son ou du texte. Cette page s'étoffera avec vos propres questions, si vous en avez.

Ajout de contenu dans votre projet


Comment charger des objets 3d dans mon application ?

Les gestionnaires de graphes de scène OpenSceneGraph ou OpenSG, qui sont supportés par VRJuggler, permettent de charger plusieurs types de modèles 3d. Ils permettent entre autre de charger des .wrl (VRML 97 seulement), des .obj, des .off, des .raw et des .osg.

Il est possible d'utiliser d'autres gestionnaires de graphes de scène, qui ne sont pas directement supportés par VRJuggler, mais cette option est déconseillée puisque vous risquez d'éprouver certaines difficultés lors de leur intégration.

Si vous êtes un expert en infographie ou que vous êtes ambitieux, vous pouvez utiliser ou créer votre propre engin 3d et l'adapter pour qu'il puisse fonctionner avec VRJuggler. Afin de charger des formats de modèles 3d spécifiques, vous devrez implanter par vous même vos algorithmes d'importation. Il est relativement facile de trouver ce type d'algorithmes (souvent en C/C++) sur le web.

Faites toujours attentions à la complexité des modèles que vous importez, il peuvent sérieusement nuire à la performance de l'affichage! Un objet qui fait 40000 polygones ou plus est trop complexe par exemple (en plus d'être long à charger)! Il existe des sites avec des modèles gratuits, dans divers formats, vous pouvez utilisez Google :), pour ma part je conseille celui-ci. L'engin de recherche de modèles 3d de l'Université de Princeton peut être aussi fort utile, mais il nécessite que vous ayez installé le plugin de Java pour votre fureteur. Ce site vous donne une liste de nombreux autres sites distribuant des modèles gratuits.

Si vous êtes mêlés avec tous les formats différents qui existent, vous pouvez utiliser MilkShape3D, qui est très pratique pour convertir un format dans un autre, avec une période d'évaluation de 30 jours je crois :)

Où trouver des textures pour mon application ?

Je conseille ce site et celui là

Tentez toujours d'utiliser une texture dont la taille est une puissance de 2 afin d'optimiser l'affichage et éviter certains problèmes.

Comment ajouter du son à mon projet ?

  • Une librairie très facile à incorporer dans le projet s'appelle FMOD. Cette librairie est capable de jouer des mp3, des wav, du midi et fait au besoin du mixage. La documentation fournie est très claire et c'est très peu gourmand en ressources. Il suffit d'inclure la librairie au link ainsi que les fichiers d'en-tête. Pour jouer un son, une ligne suffit. Le son 3D est supporté (atténuation, doppler, position de la source de son).
  • Vous pouvez utiliser OpenAL qui est spécialisée elle aussi dans le son. La logique de fonctionnement ressemble pas mal à celle d'OpenGL sur le principe (transformations, flags, etc). Il suffit de la linker avec -lopenal. Le son 3D est également supporté.
  • Enfin, il existe aussi la bibliothèque osgAL qui offre un intégration facile avec OpenSceneGraph.

Comment ajouter du texte 3D à mon projet ?

Dans la CAVE, vous ne pouvez pas utiliser la méthode "classique" pour afficher du texte à l'écran. Si vous utilisez du texte 2D, il va s'afficher sur les 4 écrans à la fois. Pour résoudre ce problème, il faut utiliser du texte 3D positionnable dans l'espace et non en coordonnées fenêtre. Je conseille d'utiliser une librairie qui s'appelle FTGL.

Compilation et exécution dans la CAVE

Où est il préférable de travailler ?

Pour des raisons purement logistiques, il ne sera pas possible de faire tout le développement de votre projet à la CAVE. Idéalement, allez à la CAVE uniquement pour tester et débugger, mais pas pour coder.

Comment préparer mon environnement de travail ?

Avant de pouvoir exécuter votre application dans la CAVE, vous devez configurer votre environnement de travail afin de pouvoir utiliser efficacement le script startCAVE. Pour cela vous devez configurer ssh de façon à ne pas avoir à entrer votre mot de passe à chaque fois que vous vous connectez sur une des machines du cluster:

  • ssh-keygen -t dsa --> Vous devrez alors entrer un mot de passe: n'entrez rien (appuyer seulement sur Enter). Ceci crée 2 fichiers dans votre répertoire $HOME/.ssh: id_dsa (la clé privée) et id_dsa.pub (la clé publique).
  • cp ~/.ssh/id_dsa.pub ~/.ssh/authorized_keys --> Ceci dit au serveur ssh qui tourne sur la machine qu'un utilisateur qui signe correctement la clé id_dsa.pub a le droit de se loguer sur cette machine.

Où se trouvent les librairies et autres fichiers importants ?

Tous les logiciels, librairies et fichiers importants sont maintenant dans les sous-répertoires du répertoire /net/bonne/exports/stk_bonne_fedora.

Problèmes divers

VRJuggler démarre mon projet, mais rien ne s'affiche

Si vous avez compilé votre projet ailleurs, c'est normal. Recompilez sur cvmaitre, tout devrait mieux fonctionner.

Mon animation se désynchronise progressivement sur les différents murs

Si vous effectuez des animations basées sur le temps d'affichage d'une frame, il faut prendre conscience d'un problème: ce temps varie suivant la machine qui exécute votre programme, il est donc normal qu'il ne soit pas le même. Pour ce faire, il faut ajouter l'include suivant :

#include <gadget/Type/AnalogInterface.h>

L'accès à un temps global pour le cluster peut se faire par n'importe quel device partage par les éléments du cluster, par exemple le device VJHead qui représente la tète de l'utilisateur. Il suffit donc de déclarer la variable (si ce n'est pas déjà fait):

gadget::PositionInterface mHead;
Dans le init(), il faut attribuer le device à cette variable en plaçant la ligne :
mHead.init("VJHead");
Enfin, pour accéder à la valeur désirée, il suffit de coller ces lignes, préférablement dans PreFrame() :
static vpr::Interval last_frame;
vpr::Interval current_frame = mHead->getTimeStamp();
vpr::Interval diff(current_frame-last_frame);
last_frame = current_frame;
// pour accéder au delta_t en microsecondes :
vpr::Uint64 delta = diff.usec();

Mes appels OpenGL dans PreFrame() ne sont pas effectifs

C'est normal car cette fonction exécute tout sauf des commandes OpenGL, elle est justement prévue pour ne contenir que des fonctions non-graphiques (voir la documentation VRJuggler pour pour plus d'explications).

J'utilise la méthode 'frame' de la classe osgViewer et rien ne s'affiche

On doit utiliser:

viewer.run();
ou encore
viewer.realize();
while(!viewer.done())
{
   viewer.frame();
   viewer.update();
}

Comment modifier la perspective ?

C'est impossible avec VRJuggler, car c'est cette librairie qui s'occupe du calcul des différentes projections sur les éléments du cluster. Si vous appelez un gluPerspective, il sera tout simplement ignoré.

Je manque de boutons pour faire tout ce que je veux !

Oui on arrive vite à utiliser les 3 boutons de la wand (pour la navigation par exemple) et à se trouver à cours pour autoriser une action supplémentaire.Dans ce cas, je dirai qu'il faut faire preuve de pragmatisme et de bons sens. Quelques conseils :

  • Évitez le plus possible les combinaisons de boutons : bouton gauche + bouton droit, ce n'est pas intuitif et l'utilisateur aura du mal à l'assimiler !
  • Préférez les actions du type "bouton + mouvement" : par exemple le zoom peut se faire en pressant la gachette puis en "tirant" ou "poussant" la wand vers soi pour zoomer ou dézoomer sur la scène que l'on visualise. Pensez aussi qu'un mouvement peut être simplement une inclinaison de la wand.
  • Pensez à activer/désactiver un ensemble d'actions selon les situations (proximité à un objet par ex, saisie d'un objet), cela permet de libérer des boutons, et de focaliser l'utilisateur dans son comportement.
  • Je déconseille l'utilisation de "fenêtres de menu", sauf si le besoin est vraiment réel (ne faites pas ca juste parce que c'est BEAU :p ). C'est trop de travail à mon goût, et les problèmes d'ergonomie s'accumulent vite (je vois plus rien derrière, je veux la déplacer, je voudrais qu'elle m'accompagne dans mon déplacement, etc ...). Si vous voulez absolument informer l'utilisateur de quelque chose, utilisez du texte 3D.

Quel est le meilleur moyen pour la navigation ?

Il n'y en a pas ! Tout dépend de votre projet, à savoir quelle liberté de mouvement vous voulez offrir à l'utilisateur. Quelques techniques en vrac, à savoir que les combinaisons sont conseillées, la limite est votre imagination ! :

  • Mouvement 2D :
    • J'oriente la wand à gauche/droite pour tourner et avant/arrière pour freiner/accélérer. Avantage : laisse les 3 boutons libres Inconvénients : dès que je bouge le wand je me déplace (imaginez une alternative).
    • Bouton droit/gauche pour tourner, gachette pour avancer. Simple à implémenter, mais occupe tous les boutons, pas pratique pour reculer, etc ...
    • Je vise ma direction (valable aussi en 3D) avec le wand, et j'avance avec un bouton. La direction est déterminée par le vecteur tête/wand. Très intuitif, mais l'utilisateur est obligé de gesticuler sans cesse ...
  • Mouvement 3D :
    • Si vous avez une caméra en orbite autour d'un point d'intérêt, utilisez les rotations de la wand pour "orbiter" autour de ce point, qui peut éventuellement bouger (animation, simulation physique).
    • S'il s'agit d'un mode "vol libre", vous pouvez contrôler le déplacement avec la méthode de visée (cf mouvement2D), et l'orientation de la caméra avec la technique de l'orbite (ci dessus)...

Voilà pleins d'idées à creuser, faites juste preuve d'imagination et de bon sens, chaque situation à une solution particulière.

Lors du lancement de mon application, tout semble bien se dérouler, mais elle ne réussit pas à démarrer

Il peut parfois arriver (souvent lors du premier essai) que votre application ne réussit pas à démarrer malgré le fait qu'aucun problème apparent n'est signaler via les divers sessions des machines du cluster. Il s'agit d'un problème lié à la synchronisation des machines du cluster qui provient de l'installation particulière que nous utilisons pour la CAVE: certaines machines attendent indéfiniment l'obtention d'information de la part d'autres machines. Quoi faire? Peu élégant, mais fonctionnel: simplement relancer l'application. Ce problème devrait normalement être réglé d'ici peu...

L'effet stéréoscopique est partiellement/totalement non-fonctionnel sur certains écrans

Ce problème provient encore une fois de l'installation particulière que nous utilisons pour la CAVE. Normalement, afin d'obtenir un effet stéréoscopique fonctionnel, il faut que cvfond soit lancée et prête à afficher avant les autres machines des écrans. Pourquoi? C'est elle qui s'occupe de la synchronisation de l'affichage entre les machines des écrans. Le script startCAVE est d'ailleurs conçu de façon à nous assurer que cela se produise. Mais quel est le problème alors? Notre installation actuelle, en rapport avec VRPN, fait que cvfond n'est pas nécessairement toujours la première machine à être prête à afficher. Une race se produit malgré nous entre les machines concernées. Nous somme donc malheureusement contraints aux lois du hasard :(. Quoi faire alors? Croiser les doigts et espérer que cvfond gagne la course afin que l'effet stéréoscopique soit pleinement fonctionnel: relancer votre application jusqu'à temps que l'effet soit acceptable. Normalement, il n'est pas nécessaire de relancer une application plusieurs fois avant que cela se produise. De plus, pour plusieurs situations, le fait que l'effet ne soit pas pleinement fonctionnel n'est pas si dramatique. Ce problème devrait normalement être réglé d'ici peu...

-----
© 2000-2025, Polytechnique Montréal - LIRV - Tous droits réservés
http://cours.polymtl.ca/inf6802/wwwrv/voute/faq.php
Benoît Ozell