Aller au contenu principal

WhiteBoard - Introduction

Introduction

Les plateformes d'interactions à distance proposent souvent une solution de dessin collaboratif. On souhaite réalisé une telle solution, permettant la collaboration de tous les utilisateurs peu importe leur plateforme. Pour commencer, on ne s'intéresse qu'aux utilisateurs connectés via une application client unreal.

Etapes

Etant donné qu'il s'agit d'un des premiers prototypes que nous réalisons avec Unreal, nous avons procédé par petites itérations.

Fonctionnalité de dessin

Le premier prototype a consisté à prendre en main le moteur de jeu, et à découvrir comment dessiner sur des objets de l'environnement virtuel.

Ce prototype est réalisé exclusivement en Blueprint. C'est notre première expérience avec ce langage de programmation visuelle. On réalise la fonctionnalité de dessin en modifiant la texture de l'élément sur lequel on souhaite dessiner, qu'on appelle Whiteboard. Lors de sa réalisation, nous avons pris en main les composants de base d'Unreal ... On découvre notamment les interactions entre Actors (nom donné aux éléments de l'environnement virtuel, indépendants les uns des autres et dotés de fonctions et paramètres).

[img proto 1]

A ce stade, le prototype est très limité :

  • Elle ne supporte qu'une couleur et un fond prédéfinis.
  • Les modifications ne peuvent pas être partagées avec d'autres utilisateurs.

Prise en main de l'architecture multijoueur d'Unreal

Dans l'itération qui suit, on cherche à synchroniser le dessin entre plusieurs utilisateurs. Pour ce faire, on exploite les fonctionnalités multijoueurs proposées par Unreal.

Une solution multijoueur réalisée dans Unreal nécessite un serveur, qui fait tourner une instance de l'environnement virtuel, auquel se connecte les clients. Serveur et clients utilisent le même code source.

Le serveur fait autorité, toute la logique importante doit théoriquement être exécutée côté serveur et le résultat doit être copié sur les clients. Dans notre cas, plutôt que d'envoyer tous les points de notre dessin directement à l'autre client, on envoie chaque point au serveur qui les valide, les enregistre et les distribue à tous les clients.

On parvient ainsi à reproduire le dessin d'un client à l'autre mais la solution est faillible : envoyer très fréquemment des données au serveur cause des pertes. Il nous faut mieux répartir ce qui relève du client et du serveur pour éviter les messages répétés.

Amélioration du multijoueur

Pour améliorer la synchronisation, nous revoyons la gestion des dessins. Chaque dessin correspond à un objet, qui contient toutes les propriétés nécessaires à sa reproduction, et est enregistré dans le Whiteboard dont on modifie la texture. Le dessin est créé localement et n'est envoyé pour duplication qu'à sa complétion. Ainsi, on peut envoyer toutes les informations importantes en un unique appel au serveur.

Le résultat est concluant : il n'y a pas de perte, on parvient à reproduire exactement le dessin d'origine. Cependant, la solution devient plus complexe : la logique est dispersée entre Whiteboard et personnage de l'utilisateur, et entre serveur et client.

Amélioration du dessin

La technique utilisée pour modifier la texture à l'origine est peu flexible : les couleur de dessin et de fond sont prédéfinis. Nous explorons d'autre solutions pour la modification de texture. Malheureusement, aucune solution n'est entièrement satisfaisante.

On parvient à une solution qui permet de dessiner sur n'importe quelle fond avec des couleurs pleines (tout ou rien, sur r, g et b), et une solution qui fonctionne avec toutes les couleurs sur tous les fonds mais avec un tracé moins lisse.

[img proto final]

Création d'un plugin

Enfin, afin de faciliter l'intégration de la fonctionnalité de dessin multijoueur dans d'autres solutions, on réorganise le projet pour en faire un plugin. Outils très pratiques proposés par Unreal, les plugins peuvent être ajouté rapidement à tout projet pour en réutiliser les classes et les Blueprints.

Interfaces 3D

Outre cette feature principale, nous avons expérimenter avec des interfaces 3D : un menu de sélection de couleurs et l'affichage de leur nom au-dessus des utilisateurs. Ces éléments sont directement intégrés aux Blueprints disponibles dans le plugin.

Conclusion et projections

Au terme de ces itérations, nous avons réalisé un prototype de solution de dessin collaboratif, fonctionnelle entre clients unreal. L'étape suivante consiste à intégrer ce prototype à une solution qui supporte d'autres types de clients, web notamment. N'ayant à ce stade étudié aucun moyen de communication vers l'extérieur depuis l'application Unreal, l'étape suivante consiste à explorer nos options.

Aussi, on peut travailler à adapter le plugin à un utilisateur doté d'un casque VR. Les fonctions sous-jacentes ne devraient pas changer, il s'agit surtout de créer un personnage pilotable avec un casque VR, et d'ajouter de petits éléments interactifs pour rendre le dessin en VR plus naturel (dessiner avec un feutre plutôt qu'au regard, par exemple).

Documentation technique