Billard 2.0 (Post-WIMP 20/21)

De Ensiwiki
Aller à : navigation, rechercher

Expert.png  Troisième Année 

Notre équipe

  • BROISSART Wilfried
  • FACHE Émilien
  • PALISSE Léandre
  • RECKING Théo
  • SCHNEIDER Martin

Contexte et objectifs

Aujourd’hui, pour jouer au billard, seules deux possibilités s’offrent à nous: jouer sur une vraie table, ou alors passer par un jeu vidéo. Pour le billard traditionnel, le principal inconvénient est l’impossibilité de pouvoir jouer avec un adversaire à distance, problème d’autant plus crucial dans le contexte pandémique actuel. Les jeux de billard virtuels ne sont pas affectés par cette problématique; ils peuvent en outre apporter certaines fonctionnalités intéressantes que n’offre pas un jeu purement physique, comme la possibilité de rejouer un coup par exemple. Cependant, ces jeux vidéos peuvent se montrer frustrants pour un joueur souhaitant retrouver la sensation de tirer dans une bille avec une vraie queue, ce geste faisant appel à un véritable savoir-faire. Ce projet est donc motivé par l’envie de concilier le meilleur des deux approches, en permettant de jouer à un billard virtuel, mais via une interaction issue du billard traditionnel.

Solution proposée

Présentation

Notre solution se présente sous la forme d’un jeu vidéo de billard qui sera projeté sur une surface plane, et auquel il sera possible de jouer en réalité augmentée à l’aide d’une queue de billard et d’une unique bille. L’idée est de pouvoir jouer sur n’importe quelle surface plane. On laisse à l’utilisateur la possibilité de déterminer les dimensions de la table de billard virtuelle qui sera projetée, via une phase de calibration qui sera détaillée plus tard. Une partie peut alors commencer: à chaque tour, le joueur doit poser sa bille physique sur la bille blanche virtuelle projetée sur la table. Il peut ensuite effectuer un tir comme sur un billard réel, si ce n’est que les trajectoires et impacts seront calculés numériquement à partir du mouvement initial de la bille physique, et affichés en temps réel. Il appartiendra à l’utilisateur de recouvrir sa surface de feutrine pour pouvoir réaliser des tirs suffisamment précis, et de disposer des rebords autour de la table afin de ne pas faire tomber la bille à chaque tir.

Lancement

Cette application nécessite un PC connecté à un Optitrack et un autre PC relié par câble ethernet au premier. Un exécutable lancé sur ce second PC affiche un menu proposant deux modes de jeu. Après la phase de calibrage, l’utilisateur peut jouer de la manière décrite précédemment.

Matériel utilisé

Bille blanche physique avec marqueurs pour l'Optitrack
Vidéoprojecteur et caméras Optitrack
  • Vidéoprojecteur

La table de billard virtuelle est projetée sur la table physique à l'aide d'un vidéoprojecteur placé au-dessus de celle-ci à la verticale.

  • Optitrack

Optitrack est un système de tracking d’objet composé de différentes caméras traquant des marqueurs placés sur l’objet. Nous y avons eu recours afin de suivre le mouvement initial de la bille blanche à chaque tir. Il nous avait également été proposé d’utiliser une caméra Kinect pour ensuite connaître la position de la bille par segmentation, mais nous n’avons pas retenu cette idée, qui nous semblait plus dure à mettre en place.

  • Unity

Unity est un moteur de jeu gérant le rendu. Il est l'un des plus répandus dans l'industrie du jeu vidéo du fait de sa rapidité aux prototypages. Les scripts Unity sont codés en C#. Nous l’avons choisi pour sa simplicité de prise en main. En effet, il est facile de créer et modifier des objets dans la scène rapidement, et la gestion des scripts est simple: un glisser-déposer suffit à ajouter un script à un objet. La présence d’un rigidbody sur chaque objet nous à permis de traiter les interactions entre les billes en quelques clics.

Travail réalisé

Table de jeu

Table de billard sur Unity

Une table de billard avec l’ensemble des interactions entre les objets a été implémentée. Un important ajustement à été effectué sur les forces qui s'exercent sur les différents objets afin d’avoir les mêmes comportements qu’un billard traditionnel. Des sons lors de l’interaction entre 2 billes et lorsque que l’on empoche une bille ont aussi été ajoutés afin d’essayer de minimiser les différences de ressenti de jeu avec un billard traditionnel.

Gameplay

Afin de permettre à l’utilisateur de jouer dans de vraies conditions au billard, nous avons implémenté de manière simplifiée de nombreuses règles du billard américain (jeu de la 8):

  • Le joueur doit toujours toucher en premier une bille de son groupe, soit les pleines, soit les rayées (si le joueur «cassant » le triangle empoche une bille, il conserve le groupe auquel appartient cette bille).
  • Si le joueur « cassant » le triangle n'empoche pas de bille, le joueur adverse doit empocher une bille pour confirmer son groupe.
  • Si le joueur empoche correctement une bille, il continue de jouer jusqu'à ce qu'il manque, commette une faute ou qu'il gagne en empochant la bille noire numéro 8 après avoir empoché l’ensemble des billes de son groupe.
  • Après une faute, l'adversaire reprend la main et il peut placer la blanche n'importe où sur la surface de jeu. Ce dernier a aussi la possibilité de jouer 2 coups.
  • Le vainqueur de la partie est celui qui empoche la bille 8 après avoir empoché l’ensemble des billes de son groupe.

Nous avons implémenté les fautes les plus courantes: le joueur touche en premier une bille du groupe adverse, ou la bille blanche sort de la table. Les règles et fautes traitant le saut d’une bille n'ont pas été traitées ici.

Différents modes de jeu

Dans l’optique de faire bénéficier à l'utilisateur des avantages des jeux vidéos de billard, nous avons mis en place plusieurs modes de jeu : le mode 2 joueurs et le mode entraînement.

Le mode 2 joueurs permet à 2 utilisateurs de réaliser une partie tel qu’ils le feraient en vrai, avec les vraies règles de jeu et la règle “bille touchée bille jouée”.

Le mode entraînement permet aux joueurs de pouvoir rejouer des coups. Ce mode permet de parcourir les coups joués et de les rejouer si on veut explorer de nouvelles possibilités.

Chacun de ces modes est disponible en mode interaction à la souris ou en Réalité Augmentée à l’aide d’une case à cocher sur le menu.

Menu du jeu

Optitrack

Interface de Motive

Pour récupérer la position de la bille à une frame donnée, nous avons utilisé le système OptiTrack qui permet, à partir de marqueurs réfléchissants, de traquer la position d'un objet grâce à des caméras infrarouges. Pour tracker la bille, nous allons donc devoir placer des marqueurs tout autour de la bille

  • Une fois les caméras installées, il faut d'abord, sur le logiciel Motive calibrer le système et modifier les différents paramètres pour optimiser la détection des marqueurs (seuil, durée d'exposition, etc..). Ensuite, il faut définir un repère (un objet permettant de définir ce repère est mis à notre disposition)
  • Maintenant que les marqueurs sont bien détectés par les caméras, nous allons pouvoir récupérer les données qui sont envoyées via un cable ethernet contenant les différentes positions des marqueurs détectées. A l'aide d'un script écrit en C et de la librairie socket, il nous est possible de récupérer ces données
  • A l'aide de ces marqueurs, il nous est alors possible d'évaluer la position du centre de la bille à chaque frame et ainsi de calculer sa trajectoire pendant le tir, nous avons donc amelioré le script pour que celui-ci parvienne à renvoyer le centre de la sphere à l'aide des données obtenues

Une fois toutes ces informations obtenues, nous avons compilé ce script sous la forme d'une librairie dynamique (dll) pour pouvoir l'intégrer à Unity et ainsi l'utiliser avec le reste du projet

P.S. : Quand la table de billard est projetée sur un surface, il faut prendre en compte que le repère associé à l'optitrack et celui associé à unity sont équivalents à une rotation près, attention donc lorsque vous travaillez sur ces coordonnées

Calibration

Étapes de calibration

Nous avons mis en place une procédure de calibration qui permet en plus de réaliser la correspondance entre monde physique et virtuel afin de rendre notre billard adaptable à tout type de table. Cette procédure se déroule en 6 étapes:

  • La première étape n’est pas essentielle pour notre calibration mais elle facilite les étapes 2 et 3. En effet, cette étape consiste à régler le vidéoprojecteur pour que la barre blanche sur fond noir présente sur l’écran fasse 1 mètre sur la table.
  • Les deuxième et troisième étapes sont similaires. Elles consistent respectivement à placer la bille sur les deux extrémités de la barre. Ces étapes permettent de réaliser la correspondance entre monde physique et monde virtuel. L’étape 1 facilite la chose car l’utilisateur n'a pas besoin de faire de repères et de vérifier l’horizontalité de la barre sur sa table pour réussir.
  • Les 2 étapes suivantes permettent de régler la taille de la table disponible pour y projeter le billard en sélectionnant 2 coins opposés de la table. Grâce à ces deux étapes, les proportions de la table vont être modifiées tout en gardant la même taille de bille. Ainsi l’utilisateur peut, s’il le souhaite, jouer sur des tables non standard avec par exemple une table immense ou bien carrée. En plus de règler la taille de la table, elle déplace la caméra unity afin d’observer la table en entier de la façon la plus optimale possible
  • La dernière étape consiste à régler le vidéoprojecteur. Pour cela une barre blanche sur fond noir apparaît, cette dernière doit faire 1m réel sur la table. Cette étape permet d’avoir une taille de bille projetée égale à la taille de la vraie bille.

Notre choix de laisser l’étape 1 repose sur une réflexion sur la simplicité de calibration pour l’utilisateur. En effet, sans cette étape il ferait les étapes 2 et 3 à l’aveugle. De plus, en enlevant cette étape, il serait plus compliqué d’expliquer à l’utilisateur en quelques mots ce qu’il doit faire. Ce premier calibrage peut ne pas être réalisé par l'utilisateur si ce dernier arrive à réaliser les étapes 2 et 3 sans aides visuelles.

Les première et dernière étapes sont très similaires et reposent uniquement sur un ajustement du vidéoprojecteur. Le réglage lors de la dernière étape est nécessaire à cause du déplacement de la caméra Unity après les étapes 4 et 5, qui annule le premier ajustement (si celui-ci a été fait).


Mode RA

Utilisation du mode RA

Le cœur de ce projet réside dans le mode RA. Ce mode s’active comme indiqué précédemment via le menu avec une case à cocher. Pour être utilisé, l’adresse IP du port Ethernet de l’Optitrack devra être aussi indiquée dans la case prévue à cet effet dans le menu. Le code est fait de telle façon que les interactions avec l’Optitrack ne se fassent que dans le script optitrack.cs. En effet, les autres scripts ne contiennent que des appels à ce script, ce qui permet de modifier et d’ajuster rapidement le système de récupération de données.

À l’heure actuelle, ce système n'a pas pu être testé en raison de nombreux problèmes techniques dans l’intégration de l’Optitrack, avec notamment des problèmes matériels dus à un câble ethernet défectueux.

Problèmes rencontrés et solutions mises en place

  • Intégration des données Optitrack

Une fois le programme d’exploitation des données Optitrack créé et opérationnel, il nous a fallu l’intégrer à Unity. Le programme renvoyant la position du centre de la bille blanche étant en C, nous n’avons pas pu utiliser le plugin Optitrack proposé par Unity.

Solution: nous avons créé notre propre plugin dll en utilisant gcc sous Windows. Nous avons cependant eu du mal à le créer car il nécessite des library et include bien spécifiques pour que gcc accepte de le compiler.

  • Calibration

Lors de la conception du billard, il nous a fallu réfléchir à la manière la plus intuitive possible de calibrer le billard. Il a été nécessaire de créer une matrice de transformation afin de passer du monde physique au monde virtuel.

Solution: après de nombreux essais de calibration, nous sommes arrivés à une solution acceptable après sondage d’un petit groupe de personnes extérieures au projet, afin de savoir si la méthode envisagée était intuitive pour elles. La solution retenue et présentée précédemment a en effet pour but d’être réalisée avec seulement quelques instructions indiquées sur la table.

  • Vidéoprojecteur
Taille restreinte de la zone de projection
Utilisation maximale de la zone de projection

Lors de la conception, nous sommes partis sur l’idée de projeter un billard sur la table à l’aide du vidéoprojecteur. Néanmoins, au moment de projeter le billard nous nous sommes aperçus que le vidéoprojecteur ne pouvait afficher que sur une tout petite partie de la table, dû au manque de recul de celui-ci.

Solution: notre étape de calibration permet de jouer sur toute taille de table. Ainsi, grâce à notre système, il est possible d’afficher une table correspondant à l’écran projeté, et nous pouvons nous contenter d’utiliser une table de billard de petite taille.



  • Précision

Les données Optitrack ne permettent pas un suivi satisfaisant de la bille en temps réel pour le moment. Nous avons observé cela, en créant un cube sur Unity qui devait suivre les positions de la bille réelle. En pratique, le cube avait la même direction (une fois le sens des axes ajustés) mais présentait de nombreux mouvements parasites.

Solution: après de multiples tentatives de correction de ce problème en réalisant des médianes de plusieurs positions successives pour se débarasser des valeurs aberrantes, ou alors en utilisant une condition permettant de supprimer des valeurs extrêmes, nous ne sommes pas arrivés à un résultat convenable. Une méthode par régression linéaire sur les positions successives calculées par l'Optitrack à chaque tir mériterait d’être explorée.

  • COVID-19

L’un des principaux problèmes que nous avons eu cette année est lié à la crise sanitaire. L’Optitrack nous a été partiellement inaccessible pendant pratiquement l’ensemble du projet. Le cœur de ce projet résidant principalement sur la liaison entre la bille blanche d’Unity et la bille blanche réelle, cela a été certainement notre problème majeur.

Solution: la solution que nous avons trouvée est de laisser le membre du groupe ayant accès à l’Optitrack faire un script renvoyant les positions du centre de la bille à l’appel d’une simple méthode. Le reste du groupe prévoit derrière l’intégration sur Unity de manière intelligente de façon à pouvoir rapidement corriger les erreurs d’implémentation.

Améliorations possibles

Outre l’aboutissement de notre prototype, plusieurs améliorations du projet pourraient être envisagées par la suite. En effet, si l’interaction peut sembler satisfaisante pour des joueurs occasionnels, elle ne conviendra pas aux plus expérimentés, dont le jeu repose beaucoup sur l’utilisation d’effets. La prise en compte de ces effets nécessiterait de s’intéresser à la rotation de la bille blanche et impliquerait donc une étude physique beaucoup plus poussée.

D’autre part, l’aspect jeu vidéo de notre système pourrait être exploité davantage. Cela passe par exemple par l’implémentation d’une aide à la visée pour joueurs débutants: une ligne indiquant la trajectoire de la bille blanche selon la position de la queue de billard (ce qui impliquerait de traquer la queue également). Nous pourrions ensuite imaginer un ensemble de mini-jeux en complément du mode entraînement, ce qui permettrait au joueur de s’exercer de manière ludique à des coups bien particuliers. Pour les plus acharnés enfin, il serait possible de créer un système de statistiques de joueur (coups directs, fautes directes, nombre moyen de billes touchées par coup...) qui s’actualiseraient à chaque partie et permettraient ainsi de cerner ses points faibles.

Évaluation de l'interaction

Nous nous sommes ensuite penchés sur un moyen d’évaluer la pertinence du système implémenté. Cependant, notre prototype n’étant pas encore satisfaisant d’une part, et le contexte pandémique ne nous permettant pas d’accéder à une table de billard physique (dans un bar équipé par exemple) d’autre part, nous n’avons pas pu mettre ces évaluations en œuvre. Nous en donnons ainsi seulement les idées ici.

L’ambition ultime de ce projet est de proposer un système permettant à l’utilisateur de jouer aussi “naturellement” que sur un billard physique: il devrait être capable de jouer aussi bien sur l’un que sur l’autre sans que cela n’influe sur ses performances, et en mettant en jeu les mêmes habiletés. On peut déjà affirmer que cet idéal ne sera pas atteint pour un joueur expérimenté, en raison de l’absence d’effets dont nous avons discuté dans la partie précédente. La question mérite toutefois d’être posée pour des joueurs plus novices: l’interaction proposée est-elle naturelle?

Pour répondre à cette question, on cherche à observer si un transfert d’apprentissage est possible. Pour cela, on forme deux groupes de volontaires non-experts. Les sujets du premier groupe s’entraineront 5 parties sur un billard physique, alors que les sujets du second groupe s’entraineront 5 parties sur notre prototype. Lors d’une partie, pour que les résultats ne dépendent que du sujet concerné, celui-ci joue contre lui-même en incarnant successivement les deux joueurs. On compte alors le nombre de coups du joueur vainqueur ainsi que le nombre total de fautes commises par les deux joueurs. Les sujets des deux groupes effectueront ensuite 5 parties supplémentaires, tous sur le billard physique cette fois-ci. Des performances similaires sur ces dernières parties pour les deux groupes indiqueraient que les compétences développées lors de l'entraînement sur notre prototype se sont transférées au jeu sur billard physique, ce qui indiquerait que notre interaction est “naturelle”.

Au-delà de cette expérience, une place importante serait également accordée aux retours qualitatifs des testeurs. En effet, ce que nous proposons reste avant tout un jeu et doit donc procurer de l’amusement. Les commentaires individuels restent le meilleur moyen d’évaluer cela. Ainsi, les quelques essais du prototype qui ont pu être réalisés par les membres de l’équipe ayant eu accès au matériel révèlent déjà une latence importante entre le départ de la bille physique et celui de la bille virtuelle. Si cette latence n’a pas de réelle conséquence sur les performances du joueur, elle nuit tout de même à l’expérience de jeu. Cela vaudrait donc le coup de se pencher sur ce problème.

La vidéo suivante illustre les problèmes de latence et de mauvaise direction prise par la bille: Fichier:LatenceBillardCut.mp4

Conclusion

Apres plusieurs heures de travail, nous avons réussi à obtenir un aperçu de notre billard en réalité augmentée. Bien que le résultat ne soit pas à la hauteur de nos attentes au vu de la précision du tracking de la bille ou bien encore de la taille de la zone à projeter, nous avons un modèle qui représente parfaitement l'interaction que nous recherchions dans ce projet, à savoir pouvoir reproduire le geste du jeu de billard en réalité augmentée. Toutes les étapes de ce projet ont abouti et nous permettent de pouvoir effectuer cette action.

Avec les améliorations citées dans la partie précédente, nous pourrions être en mesure de proposer au joueur une bonne fiabilité pour réaliser un tir de billard. Et alors, à ce moment là, nous aurons pleinement rempli l'objectif que nous nous sommes fixés au début de ce projet, c'est à dire pouvoir offrir la meilleure immersion aux joueurs de tous niveaux (du joueur casuel au joueur professionnel)

Nous avons réalisé ce travail pour un jeu de billard, mais nous pourrions très bien imaginer le même projet pour un jeu de bowling par exemple (projeter une grande zone au sol avec une balle de bowling trackée). Les possibilités sont nombreuses et il serait possible d'imaginer un panel de jeux en réalité augmentée pour pouvoir jouer à différents jeux avec le minimum de matériel à disposition. Peut-être même que ce travail sera proposé à l'un de nous pour un projet futur de notre vie professionnelle