Joystick magnétique et réalité virtuelle

Par Thibault Farnier, le 24.11.2016

Le Google Cardboard est l’avènement de la réalité virtuelle pour tous. Un morceau de carton adéquatement découpé, des lentilles, un smartphone utilisant des effets de distorsion et vous voilà plongé dans un autre monde. L’expérience est si peu onéreuse et tant convaincante qu’il serait bien dommage de passer à côté si vous n’en avez pas encore eu l’occasion !

Mais ce qui nous intéresse aujourd’hui, ce sont les aimants.

Les aimants et la réalité virtuelle ? Quel rapport ?

Il faut avant tout avoir connaissance des différents capteurs qu’un smartphone possède pour pouvoir aller plus loin.

Un smartphone est une mine de capteurs. Si les plus évidents sont l’écran tactile ainsi que le microphone, l’appareil possède également des capteurs moins connus de l’utilisateur ordinaire mais qui permettent de rendre l’expérience utilisateur plus riche : un accéléromètre couplé à un gyroscope pour détecter l’orientation de l’appareil, un capteur de luminosité pour adapter celle de l’écran… Et également un magnétomètre. Ce dernier permet de mesurer les composantes du champ magnétique dans lequel se situe l’appareil, et est donc celui qui oriente la boussole sur votre smartphone.

Une bonne partie de ces capteurs a son importance pour fonctionner avec le Cardboard. L’accéléromètre et le gyroscope permettent de détecter l’orientation de la tête et donc de changer ce que l’on voit selon la direction dans laquelle notre tête est tournée.

Le magnétomètre a lui aussi eu son importance dans les premiers modèles de Cardboard. En effet, pour interagir avec le monde virtuel, il faut pouvoir signifier à l’application que l’on a envie de sélectionner un élément dans un menu, l’environnement… Un bouton somme toute permet cela. Google a choisi de faire fonctionner ce bouton de manière originale. Après plusieurs expérimentations incluant le fait de siffler ou de claquer des dents, ils ont choisi de le faire à l’aide d’aimants.

Deux précisement : l’un fixé à l’intérieur du Cardboard, l’autre à l’extérieur amovible capable de se déplacer verticalement. Lorsque l’on le descend, il est rappelé par la force de l’autre aimant vers sa position initiale, et la variation du champ magnétique générée par le mouvement de l’aimant est détectée par l’application à l’aide du magnétomètre qui comprend que l’on veut appuyer sur le bouton.

Exploitons plus ces aimants !

Au travers d’un article plus détaillé sur le fonctionnement des aimants, un des ingénieurs ayant travaillé sur le projet a expliqué que de futures implémentations pourraient détecter des doubles-clics, voir même avoir des contraintes physiques permettant des déplacements plus élaborés qu’une simple translation verticale, à la manière d’un joystick.

Il serait pratique en effet de pouvoir ajouter un joystick à un objet qui permet d’évoluer dans des univers virtuels, ne serait-ce que pour pouvoir s’y déplacer ! De plus, garder l’aimant pour permettre cette interaction conserve la philosophie initiale du projet qu’est d’offrir de la réalité virtuelle avec des matériaux basiques. Pas questions d’ajouter de périphérique externe pour pouvoir se déplacer !

En revanche, en ce qui concerne l’implémentation, elle est un peu plus complexe que la détection d’une variation significative du champ magnétique. Il faut être capable de transformer le champ magnétique en une position sur le plan du Cardboard.

D’un champ magnétique à une position sur un plan

La solution retenue pour effectuer cette transformation est une parmi d’autres, mais elle a le mérite d’être plutôt simple.

Un prototype avec deux aimants, l’un fixe à l’intérieur et l’autre complètement libre à l’extérieur, a été mis en place. Le magnétomètre du téléphone peut nous renvoyer un champ magnétique brut à trois composantes (x,y,z). En obervant l’évolution de ces champs en déplaçant l’aimant sur le plan du Cardboard, le champ magnétique évolue de façon non linéaire. Impossible donc de convertir directement le champ magnétique en position avec une transformation linéaire basique. Néanmoins la façon dont les composantes varient peuvent être interpolées pour renconstituer approximativement la surface représentant leur évolution.

La solution retenue est l’utilisation de l’interpolation bicubique. Il s’agit d’une méthode d’interpolation de surface, parfois utilisée pour le redimensionnement d’images, qui nécessite au moins 9 points en entrée pour pouvoir reconstituer une surface. On place l’aimant sur 9 points du plan, puis on lance l’interpolation pour les 3 composantes du vecteur. Une fois les 3 surfaces obtenues, on cherche l’endroit où ces composantes pourraient se trouver sur les surfaces (une recherche de voisin somme toute), et la position est obtenue.

Silence… Moteur… Action !

Pour démontrer le potentiel de cette méthode, une démonstration a été réalisée avec SceneKit, l’éditeur haut-niveau d’Apple pour réaliser des scènes en 3D. Il a fallu ajouter quelques effets supplémentaires pour que la scène soit rendue avec un effet de distorsion, mais quelques projets sur Github montraient déjà la voie pour le faire (permettant notamment de gérer des parties sous OpenGL).

Deux applications simples : un univers dans lequel on peut voler, un autre où l’on simule une descente infinie en bobsleigh.

Ces applications ne sont qu’un exemple de ce qui est réalisable, on pourrait imaginer d’autres applications comme par exemple l’avance et le recul rapide lors du visionnage de vidéos en 360°, le changement entre plusieurs applications lancées en réalité virtuelle, et sûrement bien d’autres.

Le code source du projet exemple est disponible ici, pour que vous puissiez reproduire l’expérience chez vous. Vous aurez besoin d’un iPhone, d’un Cardboard fonctionnant sans aimant, d’un bout de feuille de papier quadrillée, de deux petits aimants et du scotch (vive le DIY !).

N’hésitez pas à nous contacter sur Twitter si vous avez des questions sur l’implémentation ou des idées d’amélioration !