Casque de Réalité virtuelle Oculus Go
Programmation Unity
TP 1 & 2

Découverte de l'environnement Oculus Go

Les casques Oculus Go sont des casques de réalité virtuelle d'entrée de gamme permettant de s'initier au potentiel de la réalité virtuelle. Ils n'exploitent que 3 degrés de liberté au niveau du casque (seule l'orientation de la tête est prise en compte) et autant au niveau du périphérique de controle tenu en main (orientation uniquement). Ils permettent donc certaines formes d'interaction dans des environnements immersifs (comme la sélection d'objets par pointage au rayon) mais en restreignent d'autres (impossible d'attraper des objets directement avec la main).

Allumer le casque en appuyant 10secondes sur le bouton de mise en route (au sommet du casque) ou jusqu'à entendre une petite musique. Note importante : Faites bien attention tout au long de la séance de ne pas mélanger votre controller Oculus avec celui de votre voisin !

Découvrez l'environnement d'accueil Oculus Home au démarrage du casque. Explorez les différentes rubriques et la manière d'interagir avec les menus. Choisissez votre fond d'écran (l'univers qui vous entoure) préféré. Testez quelques applications à télécharger.


Présentation rapide d'Unity

Unity 3D est un moteur 3D. C’est un logiciel permettant de créer des jeux vidéo 2D ou 3D. C’est un logiciel qui ressemble à un logiciel de modélisation 3D comme Blender, il y a donc une partie graphique et une partie programmation pour créer ses projets. Les projets peuvent êtres exportés pour être lus sur PC, Mac, Linux, PS Vita, PlayStation 4, Xbox One, iPhone, iPad, Android, etc. Dans le cadre de la programmation pour les casques Oculus Go, nous exporterons des applis Android.

Découverte d'Unity

Au lancement d'Unity vous êtes accueillis par une page pour créer un nouveau projet ou en lancer un ancien. Un onglet Learn vous propose des tutoriels d'apprentissage. Choisissez les 4 tutoriels basiques, lancez les à tour de rôle pour vous familiariser avec les bases de l'environnement Unity.

Les différentes fenêtres

La fenêtre Scene montre la scène que l'on édite. Un onglet Assets permet d'accéder à une fenêtre de recherche d'assets à importer.

La fenêtre Hierarchy montre les différentes scènes sur lesquels nous travaillons, et l'organisation hiérarchique des GameObjects dans ces scènes.

La fenêtre Project montre tous les assets disponibles dans le projet (dont les assets que l'on importe).

Projets

Un projet contient une ou plusieurs scènes.

Scenes

Une Scène se composent de GameObjects, organisés en une hiérarchie arborescente.

GameObjects

Dans Unity, tous les types de contenus commencent avec un élément GameObject. Tout objet de votre jeu est un GameObject : les personnages, les éclairages, les effets spéciaux, etc. Un GameObject seul ne fait rien; il faut lui attacher des components pour lui attribuer des comportements.

Components

Les composants (components) définissent des comportements que l'on attache à des GameObjects. Ils sont visibles et attachables à un GameObject dans la fenêtre Inspector du GameObject. Ils peuvent être associés à des scripts qui décrivent le comportement voulu.

Variables

Propriétés d'un component, elles sont visibles et éditables dans la fenêtre Inspector.

Scripts

L'écriture de scripts permet de créer de nouveaux components avec le comportement exact que l'on souhaite.

Documentation

Documentation Unity : Unity User Manual


Premier programme Unity

Pour débuter nous allons construire une première scène interessante à observer en choisissant des GameObjects à ajouter, positionner, orienter, mettre à la bonne échelle dans la scène. Essayez de construire un décor simple qui vous plait.

Pour créer des matériaux à appliquer aux objets de la scène, suivez Assets->Create->Material dans le menu principal ou passez par le menu contextuel de la fenêtre Projet. Faites glisser les matériaux de la fenêtre Projet vers vos objets pour les appliquer.

Controlez la vue de votre scène en sélectionnant la caméra dans la fenêtre Hierarchy pour obtenir une fenêtre de prévisualisation.

Quand vous êtes prêts, passez en mode Game (bouton de lecture play tout en haut) pour lancer le programme sur écran.


Programmer une appli Oculus Go avec Unity

Pour programmer Unity pour des casques de réalité virtuelle Oculus, il est recommandé de construire son programme à partir de composants déja codés automatisant la gestion d'un certain nombre de tâches. Ces "assets" doivent être récupérés et importés dans chaque projet que nous créérons.

Importer Oculus Integration

Vous êtes actuellement dans l'onglet Scene. Dans une fenêtre d'exploration de fichiers allez dans le répertoire c:\unityassets\assets (nom inexact mais proche) et copiez-collez le sous-répertoire "oculus" qui s'y trouve dans le répertoire assets de votre projet. Nous avons prétéléchargé pour vous cet asset Oculus Integration dans la version 18 (nécessaire à notre installation). Vous remarquerez que le répertoire oculus apparait alors dans la fenêtre Project et dans les assets, montrant la hiérarchie de nos ressources. Dans la vue principale revenez sur l'onglet Scene après l'import.

Préparer la scene

Nous disposons maintenant de components (créés par des scripts) déjà écrits et prêts à être utilisés. Nous allons commencer à les utiliser. Tout d'abord ajouter un OVRCameraRig dans la scene, puis déplacer la caméra traditionnelle sous ce OVRCameraRig dans le panneau de hiérarchie de scène.

Créez la scène simple suivante : une pièce carré avec un sol et 4 murs épais, sans toit. Nommer chacun des objets de la scene avec des noms pertinents.

Compiler le projet et lancer sur le casque

Depuis la création du programme jusqu'au lancement de notre projet sur le casque, les étapes sont : Compilation => Création d'un fichier appli android .APK => Téléchargement du .APK sur le casque (par le cable USB) => lancement du .APK sur le casque (automatique la première fois après compilation)

Pour compiler notre projet, aller dans le menu File > Build Settings. Si notre scene n'est pas listée dans l'encadré appuyer sur Add Open Scene pour l'y ajouter. Décochez la scene par défaut SampleScene. Choisir la plateforme Android et appuyer sur switch platform pour valider. Changez également l'option de compilation "gradle" en "internal".

Aller dans le menu Edit > Project Settings > Player (ou directement par son bouton dans l'écran Build Settings). Dans l'inspector qui apparait, modifier dans Other Settings l'option Minimum API level et la mettre à API level 23, et choisissez un nom pour votre application (remplacer Productname). Enfin dans XR Settings choisir pour Virtual Reality SDK = Oculus.

Revenir dans File > Build Settings et lancer enfin Build and Run, qui vous demandera de choisir un nom pour le fichier apk à produire. Si un message annonce que le casque n'est pas détecté, vérifiez qu'il est bien branché par son cable et enfilez le casque pour donner les authorisations demandées au PC. S'il n'y a plus d'erreur de compilation, le fichier APK sera généré sur disque, puis copié vers et lancé dans le casque. Le fichier apk peut être retrouvé plus tard dans la section Bibliothèque>source inconnue de l'environnement Oculus.

Résumé de la procédure :

Documentation

Documentation Unity de référence : Unity Developer Guide for Oculus

Documentation sur la gestion des controllers tenus en main : OVRInput


Avatar et gestion du controller

Nous voulons à présent ajouter un objet représentant le joueur dans la scène et le diriger grâce aux inputs du controller de l'Oculus Go tenu en main.

Création de l'avatar

Ajouter un GameObject Sphere à la verticale du centre de votre pièce. Changer son nom pour Player. Compiler et lancer sur le casque.

Ajouter maintenant à Player un component Physics>RigidBody. Compiler et lancer sur le casque.

Diriger l'avatar avec le controller

Pour ajouter un comportement à l'objet Player nous allons écrire un script C#.

Ajouter un nouveau script à Player. Nommer le script "ControllerBehaviour" (comportement du controller). Unity associe un component à ce script. Pour l'instant éditer le script. Dans ce script nous allons expliquer comment l'avatar (Player) va bouger selon les commandes du controller. Il contient un code minimal que nous allons enrichir.

Commencer par ajouter des instructions dans la fonction Update() pour que la balle saute verticalement lorsqu'on appuie sur la gachette du controller. La position de l'objet courant (la balle) est obtenue en accédant à transform.position et un vecteur se définit en Vector3.Testez votre résultat dans le casque.

Nous souhaitons ensuite paramétrer la hauteur du saut dans l'interface Unity. Pour cela, ajouter dans le script un champ privé réel : jumpHeight, précédé de la mention [SerializeField] pour qu'il devienne visible dans l'interface du component correspondant. Tenez en compte ensuite pour régler la hauteur du saut.

Diriger maintenant la balle avec le touchpad sur la partie haute du controller. On pourra utiliser Vector3.right et Vector3.forward pour les directions principales de mouvement. La vitesse du mouvement sera un paramètre speed réglable dans l'interface.

Vue à la troisième personne

La caméra (notre point de vue) est statique dans la scène. Si l'on veut qu'elle suive la balle (le Player) en vue à la troisième personne, il faut attacher la caméra au Player. Déplacer dans la vue hiérarchique le OVRCameraRig pour le placer en fils du Player et constater le résultat dans le casque.

Vers un labyrinthe...

Modifier votre scène pour ajouter une deuxième pièce avec un couloir entre les deux. Utiliser les outils de rotation pour faire en sorte que les deux pièces ne soient pas à la même hauteur et que le couloir les reliant soit un plan incliné. Observez dans le casque le comportement de la balle lorsque vous tentez de monter la pente.

Lorsqu'on contrôle la balle, nous souhaitons désactiver le calcul de la vitesse par le moteur physique pour imposer nos directives. Récupérez cette vitesse en accédant au champ velocity de l'objet retourné par GetComponent<Rigidbody>() et mettez la à zéro chaque fois qu'on dirige la balle.

Orienter sa vue autour de l'avatar

Pour orienter la vue autour de notre avatar nous allons commander un mouvement en orbite autour de l'avatar, dirigé par l'orientation de la tête de l'utilisateur. La caméra (OVRCameraRig) étant maintenant attachée à la balle (sous la balle dans la hiérarchie), cette orientation sera décidée dans le même script que précédemment, le script comportement de la balle. L'idée est de faire tourner la balle pour réorienter la Camera, qui est solidaire de la balle mais éloignée d'elle.

Vous pouvez récupérer l'orientation de la tête en consultant cette page (choisir l'api version 2018.4) et en appliquant la méthode appropriée au noeud UnityEngine.XR.XRNode.Head. L'angle de rotation qui nous intéresse est le lacet (yaw en anglais). Les autres angles (tangage = pitch, et roulis = roll) ne seront pas utilisés ici.

Remarque : pour le confort de l'utilisateur il est préférable que la vue ne tourne pas à la moindre réorientation de la tête. Pour des angles inférieurs à 20 degrés, ne tournez pas la vue.

Que constatez-vous pour la direction de vos mouvements si vous tournez la vue à 180 degrés par exemple ? Essayez de corriger le problème.