Homemade Pixels

Des pixels frais qui sortent du four le blog de MrHelmut.

Archive pour la catégorie ‘Hoy’

« Articles plus anciens

Récemment, quelques événements ont fait que j’ai continué à bricoler Hoy! Contre mon avis initial, j’ai même décidé de publiquement le diffuser. Cerise sur le gâteau, Hoy! sera présent aux Techdays cette semaine !

hoy

Rappel : qu’est-ce que Hoy ?

Hoy! est un jeu Kinect plutôt simple dans son principe : le jeu vous présente des figures que vous devez reproduire, et crier “Hoy!” pour la valider. Le but étant d’en enchainer un maximum en 60 secondes.

A défaut d’avoir pu filmer un trailer en bonne et due forme, il y a la vidéo d’il y a un an (sur une version buggée et beaucoup moins aboutie).

Release

Vous trouverez dans ce billet (en anglais) un lien de téléchargement et tout ce qu’il y a à savoir sur le jeu.

Suite aux remarques de Lucyberad, Hoy! est désormais pourvu d’un mode multijoueurs ! Le principe est le même que le jeu original, avec le twist que seul le joueur le plus rapide l’emporte (ou le plus malin, à vous de voir). J’ai organisé quelques séances de playtest avec des amis (merci à eux !) et l’effet était direct dès la première partie, une bonne rigolade de 60sec et des crampes à gogo. Je suis très satisfait du résultat.

Dans mon précédent billet sur Hoy!, je vous parlais de son nouvel algorithme de reconnaissance. La version rendue publique ne fonctionne pas avec cet algorithme ci, mais l’ancien (pour peu qu’on puisse appeler ça un algorithme). La raison est que toutes les postures du jeu n’ont pas encore été enregistrées avec le nouvel algorithme (je n’ai pas eu le temps ni les cobayes pour finir et tester une version pour les Techdays).

Pour les gens qui ont un Kinect Xbox360 : par défaut, Hoy! ne marchera pas avec (explications), mais si vous installez le SDK Kinect sur votre machine, cela fonctionnera. Il ne m’est pas permis d’inclure l’installation du SDK dans l’installeur de Hoy! et je ne suis pas censé vous dévoiler cette manip’ si vous n’êtes pas développeur. Mais j’ai quand même envie que vous puissiez jouer à Hoy!

Le futur de Hoy! en question

En l’état, les seules mises à jour de Hoy! que je ferai seront des bugfix.

J’aimerais beaucoup amener Hoy! vers d’autres sphères. J’ai tout un tas d’idées déjà prêtes pour faire un mode solo consistant, au moins deux autres modes multi (dont du team battle 2vs2) et plein de petites features qui vont bien pour favoriser les soirées entre amis, voire l’e-sport. Hellgy est partante pour étendre sa patte graphique et on m’a même proposé du sound design. Bref, ca nous plaira d’aller plus loin.

Mais tant que Microsoft bridera autant l’usage du SDK Kinect, je n’ai aucune raison de perdre du temps à poursuivre son développement.

Si un jour tout ceci se dénoue, je ferai tout pour que Hoy! atterrisse sur des plateformes comme Desura, voire Steam, voire plus.

Kinect Genius Bar

kgb

Vincent Guigui et un ensemble de professionnels œuvrant autour des technologies Microsoft ont créé une communauté d’enthousiastes francophones : le Kinect Genius Bar (ou KGB). Le but étant de partager autour de Kinect, voire d’organiser des événements types afterworks ou présentations sur un ton décontracté. Le KGB est quasi centré sur Paris.

Malgré son nom, ce groupe ne se restreint pas aux technologies Microsoft et partage régulièrement autour d’autres choses telles que Leap Motion. Suite à mes articles sur Hoy!, Vincent m’a convié à contribuer à ce groupe (avec un nom pareil, Hoy! y avait forcément sa place ^^). Chose que, pour l’instant, je n’ai pas vraiment eu l’occasion de faire. Mais cela nous mène au point suivant.

Hoy! aux Techdays de Paris, les 12, 13, 14 février

Les Techdays sont trois jours de conférences pour développeurs organisés par Microsoft. C’est un peu the place to be si vous vous investissez dans les technologies Microsoft à titre professionnel. A ce titre, durant les trois jours de conférence, un gros nombre de sessions techniques sont proposées et couvrent généralement les dernières nouveautés, des tips and tricks, etc. C’est une conférence plutôt orientée business et le gaming n’y a pas vraiment sa place (en dehors des sessions “coding for fun”).

Cependant, Vincent y tient une session Kinect et aimerait mettre en avant les travaux de la communauté en dehors de celle-ci et faire la promotion du KGB. A ma surprise, il m’a proposé de mettre Hoy! sur leur stand afin de partager mon retour d’expérience sur l’utilisation du SDK Kinect.

Hoy! et moi-même seront donc présents cette semaine aux Techdays pour faire suer un max de personnes.

Si vous y assistez aussi, n’hésitez pas à venir me dire bonjour. Pour trouver le stand du KGB, il suffira a priori de suivre les “Hoy!” à l’oreille, ou de vous diriger vers le stand 63 de l’Espace Numérique.

Je ne serai pas non plus contre quelques bières en soirée entre nofragés. Et encore mieux, si vous avez un lieux où on peut filmer un trailer, c’est top.

Au besoin :

contact

Hoy! Public release

Dimanche 10 février 2013

Avant propos à l’attention de mes lecteurs francophones : exceptionnellement, ce présent billet sera en anglais car destiné à diffusion plus large. En fait, j’aimerais faire de ce billet une page de projet entretenue avec les futures mises à jour de Hoy!

hoy

YouTube Preview Image

What is Hoy!?

Hoy! is a free Kinect game for Windows. The game presents you stances that you have to mimic and validate by shouting “Hoy!”

This game has been originally developed during the Global Game Jam 2012 in about 2 hours. The game prototype has now been extended to a full blown demo. Hoy! is intended to be an example of what you can get out of the Kinect SDK with just a few lines of code. It is not intended to be a widely available game, just a gameplay/tech demo. This may evolve upon feedback and time.

This page is being rewritten

We recently had the opportunity to continue Hoy! development and make it a full featured game. Downloads of the prototype are therefore suspended until the future of Hoy! is sorted out.

Credits

Credits go to:

  • Thomas “MrHelmut” Altenburger : game design and code
  • Laurence “Hellgy” Vagner : graphics design

Hoy! rights are held by MrHelmut.

Redistribution: game redistribution is not allowed outside of this webpage.

Commercial use: no commercial use is permitted.

Contact

Feel free to contact MrHelmut:

contact

Il y a peu, j’ai ressorti Hoy de mes cartons afin de le montrer en public à une soirée. Je ne l’avais pas modifié depuis sa création qui m’avait pris une poignée d’heures au cours de la Global Game Jam 2012. J’avais entre temps pesté sur la politique de licensing de Microsoft au sujet de Kinect sur PC, puis plus ou moins abandonné l’idée de continuer tout développement sur Hoy. Mais le ressortir a été une bonne occasion pour m’y remettre, et notamment pour passer à la dernière version du SDK Kinect qui, entre la création de Hoy et aujourd’hui, est passé de la Beta 2 à la version finale 1.6.

Pas de bol pour moi, les changements dans le SDK étaient plutôt majeurs et j’ai du au final re-coder l’ensemble de Hoy (pas bien long cela dit, en tout et pour tout, j’ai 600 lignes de code). Quitte à tout refaire, j’en ai profité pour remettre à plat mon algorithme de reconnaissance de postures. D’où le présent article, histoire de poser un peu la démarche.

(Lisez l’article en pleine page si les figures sont rognées.)

Mais qu’est-ce que Hoy déjà ?

Voir la vidéo de gameplay.

Hoy est un jeu PC pour Kinect au principe tout simple : une posture apparait à l’écran, le joueur doit la reproduire et crier “Hoy !” pour la valider. Si elle est bien reproduite, le jeu passe à la posture suivante. Le but du jeu est alors d’enchainer un maximum de postures en une minute, l’ordre des postures étant aléatoire (parmi 10 postures différentes).

Un principe tout bête mais qui marche diablement bien en soirée et qui fait perdre des kilos (et donnait des méga crampes à son concepteur avant que le SDK Kinect n’intègre Kinect Studio).

L’enjeu, d’un point de vue programmation, est de reconnaître ces fameuses 10 postures avec Kinect. Mais en fin de compte, Kinect n’a pas grand chose à voir la dedans, c’est un problème purement algorithmique.

Les 10 postures de Hoy

Les 10 postures de Hoy.

Le SDK Kinect, la simplicité même

Le SDK Kinect officiel a un très très gros avantage sur ses “concurrents” (tels que OpenKinect) : l’API est d’une simplicité rare et la reconnaissance du corps est très performante.

Je vous aurais bien fait un article dédié à l’utilisation du SDK, mais honnêtement, il est déjà super bien documenté et sa mise en œuvre est un jeu d’enfant. C’est simple, en C#, cela se résume à de la programmation événementielle : on déclare un délégué qu’on associe à un événement. Et voilà, c’est fini, Kinect appelle alors votre délégué à chaque fois qu’un (ou des) squelette est reconnu (30x/seconde). Le SDK vous renvoie alors l’intégralité des squelettes, des jointures reconnues, leurs positions dans l’espace, leurs angles, etc. Et il se charge aussi tout seul du tracking.

Tous les joints que Kinect reconnait

Tous les joints que Kinect reconnait.

Première version de Hoy, approche très naïve

Dans la première version que j’avais développé, complètement à l’arrache en ~4h, j’avais implémenté une reconnaissance ultra basique où je mesurais simplement le positionnement de points relativement à d’autres. Prenons l’exemple de la posture suivante.

Les joints important dans la reconnaissance de cette posture

Les joints important dans la reconnaissance de cette posture.

Grosso modo, pour déterminer si le joueur est en train de faire cette posture, je vérifie si les coudes sont vers l’extérieur (elbowRight.X < handRight.X && elbowLeft.X > handLeft.X) et que les mains sont bien levées au dessus de la tête (handRight.Y < head.Y && handLeft.Y < head.Y). Simple comme bonjour, et efficace dans la majorité des cas.

Problème : plus on a de postures différentes, et plus certaines conditions commencent à se recouvrir. Dans les faits, l’algorithme a des fois des ratés et peut considérer une posture comme étant valide alors que le joueur en fait une autre qui partage des similarités. Par effet de bord, si le joueur valide une posture et que la posture suivante fait parti de ces cas limites, alors le jeu valide directement la posture (car très peu de temps s’est écoulé et que le cri de validation est encore actif). Pour résumer, mes conditions et mes postures ne sont pas suffisamment discriminées pour que cette approche soit optimale. De plus, Kinect part ponctuellement en sucette et donne pendant une fraction de seconde des valeurs aberrantes, qui parfois peuvent ressembler à une posture.

Résultat : le jeu accorde bien plus de postures qu’il n’est censé le faire, et donc dans de rares cas, 2, 3 ou 4 postures peuvent être validées d’un coup d’un seul.

Donc Thomas W., si tu me lis, NON, TU N’ES PAS LE CHAMPION DE HOY, tu as juste fait un putain de bug exploit. ^^ (Et le connaissant il me répondra que les bug exploit font parti de la maîtrise d’un jeu, et enchainera avec les speedruns, etc.)

J’ai tenté bien des choses pour amortir le problème. Ajouter un timestamp pour empêcher trop de validations si le joueur cri comme un barbare, empêcher que des postures trop semblables se suivent, avoir des conditions plus nombreuses et précises, etc. Ça marchait plus ou moins, mais je n’en étais pas vraiment satisfait parce que ça atrophiait un peu trop le gameplay rapide du jeu.

Nouvelle version, pattern matching et apprentissage

Un autre problème de la méthode précédente est que les valeurs des conditions ont été choisies sur base de ma propre physionomie et de ma propre compréhension des postures. Ce qui fait que le jeu n’est pas adapté à tous et ça énerve certains joueurs. Je considère qu’à partir du moment où le joueur doit crier 4 fois “Hoy !” pour valider, mon algorithme a chier dans le pâté. Et ça arrivait régulièrement.

Comment faire pour que ma reconnaissance soit générique pour toutes les physionomies, tout en ayant un certain degré de tolérance pour que tout le monde fasse les postures à sa façon et tout en levant le problème de l’ambiguïté entre certaines postures ? Le Pattern Matching ! (ou reconnaissance de patron)

Le pattern matching consiste à comparer deux ensembles de points entre eux, point à point, et de mesurer une “distance” entre ces deux ensembles. Plus la distance est courte, plus les deux ensembles sont similaires. C’est par exemple ce type d’algorithmes qui est utilisé pour la reconnaissance d’empreintes digitales (les points étant les nœuds et imperfections naturelles de votre peau). Voyez un peu ça comme une version informatique d’un jeu de formes pour enfant.

Une illustration un peu quelconque du pattern matching piqué au pif sur google images (http://www.cs.helsinki.fi/research/pmdm/cpm/)

Une illustration un peu quelconque du pattern matching piqué au pif sur google images (source en lien sur l'image).

Un tel algorithme repose alors sur une base de données de patterns (ensembles de points) représentant les postures à détecter.

Une schématisation de la base de données de patterns de Hoy (et non, le point dans l'entre jambe n'est pas ce que vous vous imaginez, bande de perverts).

Une schématisation de la base de données de patterns de Hoy (et non, le point dans l'entre jambes n'est pas ce que vous vous imaginez, bande de pervers).

Une fois que l’on a une base de données de points, on compare tous les patterns à ce que Kinect a reconnu comme points. Dans la pratique, j’ai implémenté un algorithme de comparaison point à point assez simple connu, elastic matching. Vous ai-je déjà dit que je suis chercheur en informatique ? Car oui le lien précédent pointe vers un article scientifique et que ça m’arrive de mettre en application une partie de mes recherches dans mes jeux (en l’occurrence, j’ai repris un algorithme que j’avais déjà développé pour faire de la reconnaissance d’écriture manuscrite, ça marche aussi à base de points). En sorti de cet algorithme, on a un histogramme du résultat de la reconnaissance.

Un exemple de reconnaissance, une valeur de 1 étant une concordance parfaite avec une figure.

Un exemple de reconnaissance, une valeur de 1 étant une concordance parfaite avec une posture.

On peut alors aisément supposer que la posture ayant le meilleur taux de reconnaissance est la posture que le joueur est bel et bien en train de faire. Bingo ? Pas tout à fait.

Le problème des algorithmes de matching (cette catégorie ci en tout cas) est que leur qualité dépend grandement de la base de données de patterns sous-jacente. Dans mon cas, cette base de données a été faite à partir de mes propres postures, et donc toujours de ma seule et unique physionomie. Ce qui fait que l’algorithme marche très bien avec des gens qui me ressemblent, mais lorsque que d’autres personnes s’y collent, les taux de reconnaissance se resserrent. Comment être certain que la meilleure posture reconnue est bien la bonne lorsque la suivante a à peine 2% d’écart ? L’incertitude est trop faible pour que l’on puisse conclure de manière sure, et donc valider la posture en toute sérénité.

Il faut donc construire une base de patterns la plus générique possible, et pour cela, j’ai enregistré tout un ensemble de patterns sur la base de postures de deux amis à la physionomie radicalement différente de la mienne. Résultat ?

Le même exemple qu'avant avec une base de patterns composées à partir de plusieurs personnes.

Le même exemple qu'avant avec une base de patterns composées à partir de plusieurs personnes.

Les écarts sont beaucoup plus importants ! Ce qui signifie que deux choses : qu’il y a beaucoup moins d’ambiguïté entre les postures et que l’algorithme est beaucoup plus tolérant aux différentes physionomies.

Mieux encore, la base de données de patterns peut être enrichi à volonté au fur et à mesure que Hoy est joué. Vous vous souvenez des postures mal reconnues où le joueur cri plus de 4 fois ? Lorsqu’un tel cas de figure survient, je considère toujours que l’algorithme a merdé, mais ici, je peux ajouter la posture du joueur au pattern de la posture qu’il est censé reproduire. Ceci aura pour effet d’alimenter la base de donnée et de la rendre de plus en plus générique au fil des échecs de l’algorithme. En d’autres termes, Hoy apprend et devient de plus en plus performant au fur et à mesure qu’il est joué.

A titre de comparaison, l’algorithme de Kinect qui reconnait le squelette a un peu été conçu de la même manière. Sauf que chez Microsoft, on n’y va pas avec le dos de la cuillère et on utilise des centaines de milliers d’échantillons. Et je suis persuadé que des jeux comme Dance Central fonctionnent sur ce genre de principe, avec une dimension temporelle en plus cela dit (car il s’agit de mouvements, et non plus de simple poses).

Fun facts autour de Hoy

  • Je ne reconnais pas le mot “Hoy” en tant que tel lorsqu’un joueur le cri. Je reconnais uniquement le volume ! C’est assez rigolo car le tutoriel demande bien de dire “Hoy”, mais la supercherie est telle que les gens ne s’en rendent pas compte et crient “Hoy” comme des damnés ^^. Tout ce que je fais, c’est une mesure du bruit de fond à chaque début de partie pour déterminer le seuil de volume qui représente un cri. Kinect peut faire de la vrai reconnaissance vocale, mais il y a une trop grande latence pour que ce soit exploitable dans le gameplay rapide de Hoy.
  • Dans sa première version, sur certaines postures, je ne reconnaissais pas tout. Par exemple sur les postures avec les bras bien écartés, je ne faisais pas de reconnaissance sur les bras. On pouvait mettre les bras comme on voulait. Mais les joueurs étaient bernés par le fait que l’image leur demandait d’écarter les bras, et en faisaient donc autant. Je me suis bien poilé à regarder les gens jouer tout en sachant qu’ils transpiraient pour RIEN.
  • Kinect permet de localiser spatialement un son. En clair, on est capable de déterminer si c’est bien le joueur qui vient de crier. J’ai donc voulu implémenter un mode versus, où deux joueurs font chacun des postures et doivent crier. Dans la théorie c’était parfait, mais Kinect ne fait pas de mesure de son suffisamment rapidement. Il donne la position générale d’un son que toutes les 500ms environ, un temps beaucoup trop grand qui est bloquant. J’ai donc laissé tomber le mode versus.

Si vous n’êtes pas membres wefrag, vos commentaires peuvent être recueillis par mail :

contact