Haptic VR Gloves – Lutherie Numérique
For my VR Unity project, Seeds, in which the environment is made up of particles, I had the idea of designing haptic gloves. This project is carried out within the course Lutherie Numérique, at the UDEM. The particles are generated and controlled via the Vfx Graph of Unity’s new Scriptable Render Pipeline. The control and sensor part of the project is currently done using an Arduino Uno for prototyping, but I will switch for a smaller microcontroller later. A sensor on the gloves will also allow the movement of the particles to be synchronized with the user’s heartbeat. The main modules of the project are as follows:
MODULE | SOLUTION | ÉTAT |
Detect Hands Position | Leap Motion | Ready |
Detect Heartbeat | Heartbeat sensor plugged in an Arduio | WIP |
Read Sensor on the serial port (SlipOut) |
Temporary: PureData Finally: VVVV or Unity |
Ready (PureData) |
Dialogue OSC with Unity |
PureData OSCjack (unity package) |
Ready |
VfxGraph InOut : interaction with the particles |
In : Parameter binder Out : Gpu Event to Render Texture |
Ready |
Send datas to serial (SlipIn) |
Temporary: PureData Finally: VVVV ou Unity |
WIP |
Trig haptic feedback | Mini vibrating engines on gloves : one on each finger and one on each palm (12 in total) | WIP |
The main difficulty at the moment is to capture the collisions between the virtual fingers and the particles. The vfx graph is a GPU particle engine, so the scripts are fully executed on the graphics card. It’s not possible for now to get datas that are readable in the graph. This part is not scriptable either at the moment.
The current solution works quite well, but is not very optimized: In the VfxGraph (image opposite), the collision between the fingers and the particles can be detected. At each collision, the particle dies, and triggers a GPU event. This event generates a particle above the user so that he can’t see it. Each finger gives a different grayscale color to the particle. A camera is pointed at the particle and generates a low resolution (10px x 10px) rendering texture. Then, a script allows to retrieve the color of the texture center and to guess which finger touched a particle, which then allows to send the right OSC message to make the right finger vibrate.
Pour mon projet en réalité virtuelle Seeds dans lequel l’environnement est constitué de particules, j’ai eu l’idée de concevoir des gants haptiques. Ce projet est réalisé dans le cadre du cours Lutherie Numérique, à l’UDEM. Les particules sont générées et contrôlées via le Vfx Graph du nouveau Scriptable Render Pipeline de Unity. La partie commande et capteurs du projet est pour l’instant réalisée à l’aide d’un Arduino Uno pour du prototypage, mais je passerais à un microcontrôleur plus petit par la suite. Un capteur sur les gants permettra également de synchronises le mouvement des particules avec les pulsations cardiaques de l’utilisateur. Les principaux modules du projets sont les suivants :
MODULE | SOLUTION | STATE |
Capter la position des mains | Leap Motion | Prêt |
Capter les pulsations cardiaques | Capteur cardiaque branché au Arduino | WIP |
Lire les données capteurs sur le port série (SlipOut) |
Temporaire : PureData Terme : VVVV ou Unity |
Prêt (PureData) |
Dialogue OSC avec Unity |
PureData OSCjack (unity package) |
Prêt |
VfxGraph InOut : interaction avec les particules |
In : Parameter binder Out : Gpu Event to Render Texture |
Prêt |
Envoyer les données vers le port série (SlipIn) |
Temporaire : PureData Terme : VVVV ou Unity |
WIP |
Déclencher des retours haptiques | Mini moteurs vibrants sur des gants : un sur chaque doigt et un sur chaque paume (12 au total) | WIP |
La principale difficulté pour l’instant est de capter les collisions entre les doigts virtuels et les particules. Le vfx graph est moteur de particules GPU, donc les scripts sont entièrement éxécutés sur la carte graphique. Il n’est pour l’instant pas possible de récupérer des données pourtant lisibles dans le graph. Cette partie n’est pas non plus scriptable pour le moment.
La solution actuelle fonctionne assez bien, mais n’est pas très optimisée : Dans le VfxGraph (image ci-contre), on peut détecter la collision entre les doigts et les particules. A chaque collision, la particule meurt, et déclenche un GPU event. Cet événement génère à son tour une particule au dessus de l’utilisateur afin qu’il ne puisse pas la voir. Chaque doigt donne une couleur en niveau de gris différente à la particule. Une caméra est dirigée sur la particule et génère une texture de rendu en basse définition (10px x 10px). Ensuite, un script permet de récupérer la couleur du centre de la texture et de deviner quel doigt a touché une particule, ce qui permet par la suite d’envoyer le bon message OSC pour faire vibrer le bon doigt.