Wiimote, replays et écran FTIR multitouch

La fonctionnalité est très demandée des joueurs de ManiaDrive, donc il me semblait nécessaire de l’ajouter pour ManiaDrive 2 : les replays. En clair, la capacité de pouvoir sauvegarder une partie pour la rejouer plus tard.

Deux solutions basiques pour réaliser une telle tâche : jouer sur le déterminisme ou tout enregistrer. La première option part du principe que si on reconstruit la scène exactement comme lors de l’enregistrement et que l’on injecte les entrées (clavier, souris, joy, …) du joueur au même moment, tout va se passer de la même manière que lors de l’enregistrement. Cette méthode à l’avantage d’être très simple à implémenter et de générer des enregistrements de taille très modeste (état initial de la scène + entrées utilisateur).

En revanche, avec cette méthode, il est nécessaire d’être très attentif puisque la moindre erreur, même infime, va complètement décaler la relecture dès les secondes suivantes. Et ces erreurs peuvent êtres engendrées pour des raisons parfois tordues (arrondi d’un nombre flottant, paramétrage différent du FPU de la machine à cause d’une autre application [DirectX est une cause courante de ce problème], léger décalage ponctuel dans la lecture replay, …). Autre problème : les nombres aléatoires. Ils sont très souvent utilisés dans les jeux, et il est nécessaire que la série aléatoire soit la même lors de l’enregistrement que lors de sa relecture. Il faut donc être sur qu’aucune autre partie de l’application ne se serve du même générateur de nombres aléatoires pendant l’enregistrement et la lecture. Autre point noir : les entrées peuvent être complexes. Par exemple, l’enregistrement des entrées clavier ne pose aucun problème en général. Mais la souris et les joysticks/joypads/volants génèrent beaucoup plus d’évènements, ce qui va alourdir beaucoup le fichier final … mais le pire reste le problème du réseau. Lors d’une partie multi, gérer les actions des autres joueurs va demander un travail énorme.

Raydium est multiplateforme (OS et CPU peuvent êtres différents), supporte les parties en réseau, et utilise ODE, un moteur physique connu pour être difficile à rendre déterministe. Inutile de perdre du temps à tenter d’implémenter ce genre de replays.

L’autre solution est toute simple : tout enregistrer. En permanence. Chaque création d’objet, chaque destruction, chaque déplacement. Le résultat est bien sûr un fichier beaucoup plus conséquence en taille, on arrive vite à plusieurs Mo par minute sur des scènes complexes. Les avantages en revanche sont très nombreux :
– La répétabilité est excellente : quelle que soit la plateforme, quel que soit l’OS et la version de l’application et de son moteur physique, peut importe ce que l’application fait d’autre que jouer le replay : le résultat sera le même.
– Possibilité de jouer sur la précision du replay. J’enregistre par défaut à 30 Hz, mais il est possible de générer des replays moins précis mais plus petits (10 Hz par exemple).
– Possibilité de jouer le replay en accéléré, mais surtout en arrière ! (très utile pour retrouver une action particulière dans un replay). Les sauts dans le replays sont aussi très peu couteux, quel que soit la taille du saut et son sens.
– Possibilité de jouer un replay pendant une autre partie … et d’enregistrer en même temps !
– …

Bref, j’ai cherché a implémenter cette méthode, et avec succès. L’écriture a été assez complexe, je dois l’avouer (on tombe par exemple sur quelques paradoxes temporels lors des lectures en sens inverse), et surtout, elle n’est pas encore complète. Par exemple, les vitesses de lecture inférieures à 1.0 sont encore mal supportées (je n’interpole pas encore entre les samples), et seuls les évènements principaux sont enregistrés. Les sons, les particules, explosions et autres ne font pas encore partie du replay.

Petite vidéo très vite faite de l’application de lecture des replays.

J’ai ici enregistré une partie solo, relancé l’application, joué le replay que je venais de créer tout en jouant « par dessus », tout en enregistrant le tout. Le résultat « ressemble » à une partie multi à deux joueurs. Le fichier pèse 900 Ko pour 61 secondes.

Bref, le sujet s’avère assez complexe, et demande encore quelques évolutions dans Raydium. Mais nous disposons maintenant d’une solution très souple et très générique au problème des replays. A suivre.

Autre sujet, sans grand rapport : les wiimotes. A la suite d’une soirée « Les lapins encore plus crétins » chez un ami en manque de wiimotes, j’ai dû me procurer une wiimote au Auchan du coin. Mais je ne possède pas de Wii. Que faire alors de ce machin tout blanc ? Jouer avec bien sûr !
Grâce à la libcwiimote, il est extrêmement simple d’écrire des applications utilisant la wiimote. Une heure après la découverte de la lib, j’avais une démo qui tournait. Alors certes, il ne se passe pas grand chose, mais l’écriture de cette démo était très intéressante :

A coder une telle appli, on découvre plein de choses sur le fonctionnement interne de la wiimote. Je recommande l’exercice à tous les curieux. Je n’ai pas l’intention d’inclure le support de la wiimote directement dans Raydium (en tout cas pour l’instant), en particulier pour des raisons de portabilité. Mais je compte bien continuer mes tests sur ce nouveau jouet.

Et tant qu’a parler de périphériques d’entrée, j’ai découvert récemment l’effet FTIR. Frustrated Total Internal Reflection pour la version longue. L’utilisation de cet effet permet de créer des écrans tactiles de toutes tailles à moindre frais, et supportant plusieurs pressions en simultané. Et j’avoue être très très tenté par la réalisation d’une telle chose. Je n’ai trouvé aucune vraie ressource en français, mais on trouve beaucoup de réalisations « homemade » à droite et à gauche en anglais.

L’idée de base des écran multitouch FTIR consiste a utiliser une plaque en acrylique (transparente donc) assez épaisse (de l’ordre du centimètre), au bord de laquelle on place des « guirlandes » de LED infrarouges. Ces rampes de LED sont souvent orientées à 45° même si ça ne semble pas strictement nécessaire. La lumière émise par ces LED va rebondir sur la surface de la plaque, ce qui fait que si on filme la plaque à l’aide d’une caméra infrarouge, on ne voit presque pas le rayonnement des LED (qui est « enfermé » dans la plaque). En revanche, il suffit de placer un doigt sur la plaque pour complètement modifier le rebond de la lumière … et générer un « point » d’émission IR très distinctif.

A l’aide d’une webcam un poil bricolée (on enlève le filtre IR qu’on y trouve systématiquement), on peut filmer la plaque par l’arrière et détecter la présence et la position des contacts des doigts (à l’aide d’un algo qui est ni plus ni moins que celui que j’utilise pour les impacts laser).

Si l’on projette (à l’aide d’un vidéoproj donc) un image sur un papier fin accolé à la plaque d’acrylique (le « diffuser » du premier schéma), on obtient bien un écran tactile !

Pas si encombrant que ça 🙂

Et avec beaucoup de boulot coté logiciel, on arrive à des trucs du genre de ce que Perceptive Pixel arrive à faire :

Je vais continuer de chercher des infos là dessus, mais j’avoue être très tenté par l’expérience (la partie hard me fait beaucoup plus peur que la partie soft).

PS : Rien à voir, mais je recommande très vivement l’épisode 6 de la saison 10 de Top Gear diffusé dimanche dernier, on y trouve une course de Camping-cars absolument mémorable. Probablement l’un des meilleurs moments de cette saison pourtant déjà bien chargée (cf la traversée de la manche ou la Peel P50 par exemple).


Publié

dans

par

Étiquettes :

Commentaires

8 réponses à “Wiimote, replays et écran FTIR multitouch”

  1. Avatar de CYANure.bis
    CYANure.bis

    Concernant ta première solution, il me semble que Destruction Derby fonctionnait ainsi, et lors des replays, si un choc avait le malheur d’être un poil différent, la bagnole restait tout le reste de la course plantée dans le mur, avec les accélérations, freinages et virages qui devraient se faire normalement.

    C’était frustrant.

  2. Avatar de Crashy
    Crashy

    Aahhh le truc de la wiimote qu’on voit en 3D réagir de la même façon que dans sa main, le truc que tous les développeurs wiimote on du faire(dont moi). Avec les problèmes sympas de rotation quand on a la wiimote inclinée sur les 3axes en même temps !

  3. Avatar de raf
    raf

    A l’aide d’une webcam un poil bricolée (on enlève le filtre IR qu’on y trouve systématiquement)

    Alors là va falloir m’en dire plus parce que çà m’interesse fortement ! (T’il te plaît…)

    EDIT : Heu çà doit être çà.

  4. Avatar de Xfennec
    Xfennec

    raf : Exactement. Même les plus sombres merdes avec des capteurs CMOS possèdent ce genre de truc. Donc une webcam déjà un peu douée dans l’obscurité (comme par exemple la SPC900NC) se trouve être très efficace sans son filtre IR.

  5. Avatar de Anonyme
    Anonyme

    Hello Xfennec ^^ ce qui serait chouette ce serait de pouvoir faire fonctionner le même mur d’images avec ta table, tu peux aller voir un plugin firefox qui s’appelle piclens, un truc de la balle pour afficher des galeries d’image stylish ^^, vas faire un tour sur http://www.cooliris.com, tu peux télécharger et tester le plugin là bas. Et ce truc là sur une table interactive ^ ce serait vraiment sympa.

    Spike

  6. Avatar de MM

    bonjour Xfennec , je cherche à rentrer en contact avec toi je suis dans la ressource événementielle et j’ai des choses à faire un peu fun , nous avons une connaissance en commun qui ma dit de me tourner vers toi , alors je me tourne mais dans quel sens , ton mail sur ton site ne fonctionne pas . tu peux jeter un coup d’oeil sur mon site
    à bientôt j’espère MM

  7. Avatar de Quentin
    Quentin

    Salut Fennec. Je suis en gtrain de faire des recherche sur ce type d’écran tactile et ton blog m’apporte beaucoup de réponses. Cependant subsite pour moi une interrogation qui est : en quoi le fait de poser un doigt sur cet écran permet de modifier le rebond des rayons et donc de créer un point lumineux??
    Merci d’avance!!!

  8. Avatar de Xfennec
    Xfennec

    Quentin : l’effet FTIR tient au fait que,du point de vue de la lumière infrarouge, le doigt « fusionne » avec le plexi (en clair : la distance doigt-surface doit être inférieure à quelques longueurs d’ondes de la lumière concernée) et donc la lumière n’entre plus en contact avec la surface du plexi (réflexion totale) mais avec le doigt, ce dernier agissant comme un diffuseur (la lumière « part » dans des directions diverses, dont celle de la caméra)

    C’est à cause de cette minuscule longueur d’onde qu’il faut appuyer fort sur la surface pour faire un joli blob de lumière (ou trouver une surface intermédiaire un peu molle pour faciliter le contact entre le doigt et l’écran)

Laisser un commentaire