Une photo ne montre pas la marche

Un contrôle qui prend une photo d'un personnage en train de marcher ne contrôle rien. Il existe un instant, au milieu de chaque pas, où un bras qui se balance et un bras mort sont exactement à la même place. Photographiés là, ils se ressemblent. On l'a payé, et on a changé nos contrôles.

1. Le contrôle disait vert, le personnage marchait mal

On venait de refaire les mouvements des personnages du jeu. Jusque-là ils étaient fabriqués à la main, geste par geste, et ça se voyait : un épouvantail sur un tapis roulant. On a arrêté ça et on a recopié de vraies animations sur les squelettes des avatars.

Un contrôle automatique vérifiait le résultat. Il ouvrait le jeu, faisait avancer le personnage, lisait la position de l'os du bras droit, et disait : le bras n'est pas au repos, donc il bouge, donc c'est bon. Vert.

Sauf qu'à l'écran, le personnage marchait toujours mal. Le contrôle ne mentait pas : il regardait au mauvais moment.

2. Pourquoi une seule mesure ne prouve rien

Un bras qui se balance passe par toutes les positions, y compris la position de repos, deux fois par pas. Si le contrôle lit l'os pile à cet instant-là, il lit exactement la même valeur que si le bras était mort. Une seule mesure ne distingue pas les deux.

La question à se poser devant n'importe quel contrôle : existe-t-il un instant où le bon résultat et le mauvais résultat se ressemblent ? Si oui, une mesure unique ne prouve rien. Il faut regarder plus longtemps.

3. Ce qu'on a changé : le contrôle devient patient

Au lieu de lire l'os une fois, le contrôle le lit une dizaine de fois de suite, avec trois dixièmes de seconde entre chaque lecture. Il garde deux nombres seulement : la plus petite valeur vue, et la plus grande. À la fin, il fait la soustraction.

Cette soustraction, c'est l'amplitude : de combien le bras s'écarte entre son point le plus haut et son point le plus bas. Un bras mort a une amplitude de zéro, où qu'on le photographie. Un bras qui marche a une amplitude qu'on peut exiger.

bras = { min: très grand, max: très petit }

répéter une dizaine de fois :
    valeur = lire l'os du bras droit
    si valeur < bras.min : bras.min = valeur
    si valeur > bras.max : bras.max = valeur
    attendre 300 millièmes de seconde

amplitude = bras.max − bras.min

On fait la même chose pour la cuisse et pour les hanches. Trois os, trois amplitudes, trois seuils à dépasser. Le contrôle ne demande plus « est-ce que ce bras est au repos ? », il demande « est-ce que ce bras a parcouru assez de chemin ? ».

4. Ce que ça a attrapé tout de suite

Deux vrais défauts, invisibles à l'œil pendant plusieurs jours.

Le premier : les habitants du village n'étaient jamais remis en position après leur chargement. Le jeu les charge en arrière-plan pour démarrer plus vite, et personne ne leur redonnait leur pose une fois arrivés. Ils bougeaient — un peu — mais pas comme les autres. Un contrôle patient l'a vu ; un coup d'œil, non.

Le second : la photocopie d'un avatar plantait. Le personnage contient une information qui se pointe elle-même, et le copieur tournait en rond dessus. On met cette information de côté pendant la copie, on la remet après.

5. La règle qu'on en tire

Trois contrôles ont été rendus patients d'un coup. Ce n'est pas une histoire de jeu vidéo : c'est vrai pour tout ce qui change dans le temps. Une machine qui chauffe, une file qui se vide, un site qui répond de plus en plus lentement. À chaque fois, une mesure unique peut tomber pile sur la valeur qui rassure.

Ce qu'on mesure n'est pas la pose, c'est le mouvement. Un contrôle qui ne regarde qu'un instant ne dit pas « tout va bien ». Il dit « à cet instant-là, je n'ai rien vu ». Ce n'est pas la même phrase.

Un contrôle qui n'a jamais refusé ne garde rien. Celui-ci refuse maintenant, et c'est pour ça qu'il sert.

🔭