DriveForest
Conduire en VR avec un téléphone comme volant
DriveForest est un simulateur de conduite VR fait en 2026 pour un cours. On était deux : l’artiste a modélisé l’environnement, j’ai pris le code et les outils.
J’ai choisi la largeur : plusieurs briques branchées autour d’un gameplay qui tourne (jeu Unity, serveur Rust, outils d’asset), aucune vraiment finie. La boucle jouable fonctionne, le reste n’est pas finalisé. Dans le dépôt, les premiers commits datent des 24 et 25 mars 2026, puis une sauvegarde du 5 juillet avant ma migration sous Linux.
Unity : contrôleur véhicule
J’ai écrit le contrôleur de zéro en C#. Car_Drive.cs gère la vitesse, l’accélération et le braquage, et un ground-snap par raycast (longueur du rayon et vitesse de recalage réglables) plaque la voiture sur le terrain.
Les entrées passent par plusieurs scripts. Car_Input.cs lit le clavier et la manette, Car_JoinControler.cs fusionne les sources en une entrée commune, Car_Honk.cs déclenche le klaxon, et OSC_Receiver.cs reçoit les messages du serveur Rust. Le téléphone se branche donc comme une manette de plus, et le reste du gameplay ne bouge pas.
Unity : VR et recentrage
Le build est en OpenXR. Si le joueur met son casque sans être assis dans la direction du volant, tout est décalé. VR_SeatRecenter.cs règle ça : il attend que le casque soit tracké, puis recale le point de vue sur le siège virtuel de la scène. Une action de recentrage manuel, branchée sur l’Input System, sert quand le joueur se retrouve de travers en cours de partie.
Serveur Rust : quaternions et OSC
Le téléphone fait le volant. ZIG SIM tourne dessus et envoie quaternion et accéléromètre en OSC sur UDP. Le serveur Rust écoute sur le port 50000 (sur toutes les interfaces) et lit les messages /quaternion et /accel des bundles reçus.
La première version projetait l’avant du téléphone sur un plan pour en tirer un angle. Je l’ai remplacée par le quaternion relatif à une pose de référence : nalgebra 0.33 calcule référence⁻¹ × courant, j’en tire l’angle autour d’un axe (X, Y ou Z) avec 2 × atan2, je le divise par un angle maximal (π par défaut) et je borne le résultat entre -1 et 1. Le choix de l’axe et du signe est réglable, parce qu’ils changent avec la façon dont on tient le téléphone.
À chaque bundle reçu, le serveur renvoie en OSC à Unity sur 127.0.0.1:9000 :
/driveforest/steering: braquage normalisé/driveforest/accel: accélération normalisée/driveforest/honk: valeur 1.0, envoyée quand la variation de l’accéléromètre entre deux trames dépasse un seuil (8.0 par défaut, réglable de 2 à 20), au plus une fois toutes les 500 ms
Je mesure la variation entre deux trames pour ne pas avoir à retirer la gravité : une secousse brusque dans n’importe quelle direction suffit.
Interface de calibration
L’interface (eframe 0.30) liste les adresses IP locales avec le port, ce qui permet d’entrer la bonne dans ZIG SIM. Elle affiche braquage et accélération en barres et règle le seuil du klaxon.
La calibration se fait en quatre temps : tourner à droite, tourner à gauche, incliner vers l’avant, incliner vers l’arrière, en tenant chaque position quelques secondes. L’interface prend l’axe qui a le plus bougé et en déduit le signe, après un retour au neutre qui sert de pose de référence.
Pipeline d'assets PowerShell et addons DCC
Je voulais que l’artiste puisse créer et versionner ses fichiers Blender et Substance Painter sans passer par moi. Create-AssetTemplate.ps1 crée l’arborescence d’un nouvel asset (personnage, accessoire ou véhicule), Increment-AssetVersion.ps1 archive les fichiers de la version courante et ouvre la suivante, et tout se lance depuis un menu console, Asset.bat.
Pour Blender, le script crée le fichier .blend avec l’addon embarqué directement dedans : Blender est lancé en arrière-plan et y enregistre l’addon, qui suit donc l’asset. Substance Painter ne permet pas de lier l’addon au fichier de projet : il s’installe dans le dossier de plugins du logiciel, avec des scripts d’installation, de mise à jour et de retrait.
Les deux addons sont restés à l’état de base, un panneau avec un bouton d’essai. Je voulais y mettre la création et le versionnage pour éviter la console, mais ça s’est arrêté à la création des dossiers et des fichiers, à cause de cette limite côté Adobe.
Ce que ça change
Avant, créer un asset, monter ses dossiers, ses fichiers Blender et Substance Painter, puis le versionner se faisait à la main, dans l’explorateur. Maintenant, un menu console crée le dossier avec sa structure et les fichiers de travail, installe le plugin Painter si besoin, et archive la version précédente avant d’en ouvrir une nouvelle.
Lancer le jeu
Le build se lance en deux processus côte à côte : Unity_DriveSim.exe (standalone Windows) et le serveur Rust, compilé et copié dans dist/ par build.ps1. Une fois le téléphone appairé via ZIG SIM et le casque sur la tête, c’est jouable.
Équipe
- Alice Bert : modélisation et environnement