Système audio spatial dynamique pour une expérience immersive en réalité virtuelle

Contexte et problématique

Dans le cadre d’un projet de recherche immersif en réalité virtuelle, j’ai développé une architecture audio temps-réel visant à reproduire des ambiances naturelles complexes, interactives, tout en maintenant une gestion optimale des ressources. L’intégration conjointe de Unity et de FMOD permet un contrôle fin des paramètres sonores en fonction de paramètres externes, indispensable à l’adaptation contextuelle des signaux audio dans une simulation.

Approche et méthodologie

L’implémentation repose sur un ensemble modulaire d’une vingtaine de scripts C#, répartis en sous-systèmes (ambiances environnementales, occlusion dynamique, interactions utilisateurs et routage audio multi-périphériques). Chaque module manipule en temps réel les instances FMOD et leurs paramètres associés (snapshots, occlusion, depth-based attenuation, randomisation), permettant la variation contextuelle automatique des évènements sonores et la cohérence spatiale lors des déplacements de l’utilisateur en VR.

Résultats et perspectives

Les expérimentations démontrent un rendu sonore cohérent et réaliste, éliminant les discontinuités et assurant une immersion tout au long de l’expérience de jeu. La conception modulaire facilite l’intégration future de paramètres externes (par exemple les données météorologiques en temps réel ou d’autres acteurs), l’extension du système d’occlusion, ainsi que l’exploration de routages audio multi-sorties distincts (PC vs casque VR) pour une expérience multi-utilisateur avancée.

Introduction

Ce travail s’inscrit dans le cadre d’un projet de restitution immersive de la vie préhistorique autour de l’Homme de Tautavel. L’objectif est de proposer une expérience pédagogique et scientifique en réalité virtuelle, permettant aux utilisateurs – étudiants, chercheurs ou grand public de s’immerger dans un environnement fidèle à la période paléolithique. La reconstitution sonore n’est pas un simple habillage : elle participe à la compréhension du contexte écologique, des interactions avec l’environnement et des comportements humains du Paléolithique. La dimension audio devient ainsi un vecteur de recherche (test de scénarios sonores plausibles) et un levier pédagogique (renforcement de la présence et de la mémoire spatiale).

Dans ce projet, nous présentons une architecture audio temps-réel pensée pour un environnement VR représentant les paysages, les climats et les ambiances de la préhistoire. Notre système se compose d’une vingtaine de scripts C# regroupés en quatre grands ensembles :

I. Ambiances environnementales (sons atmosphériques, gestion des zones naturelles, animaux, effets d’eau)
II. Interactions joueur / environnement (footsteps, splashes, transitions sous-marines, adaptation aux paramètres contextuels)
III. Occlusion et propagation (raycasting dynamique et filtrage adaptatif)
IV. Routage et multi-périphériques (tentative de séparation PC/VR pour une spatialisation distincte)

Cette modularité permet d’orchestrer l’intégralité de la scène sonore avec une granularité élevée : chaque script pilote directement des paramètres FMOD, synchronise les événements, et ajuste les instances audios en fonction des positions, des collisions, et des conditions contextuelles. L’approche est pensée pour minimiser les ruptures perceptibles (crossfade entre zones, limitation du nombre d’instances, randomisation spatiale) et pour ouvrir la voie à des contrôles automatisés (ex. adaptation aux données météo en temps réel).
En articulant recherche scientifique, enregistrements de terrain, restitution immersive et pédagogie, cette approche audio contribue à renforcer la valeur scientifique et éducative de l’expérience VR sur l’Homme de Tautavel.

I – Ambiances environnementales

Les ambiances environnementales constituent la base perceptive du système sonore développé pour l’expérience VR de l’Homme de Tautavel.

Le système d’ambiances repose principalement sur un script, AmbiancesSounds, qui agit comme un gestionnaire centralisé des événements atmosphériques.
Il instancie et maintient actifs plusieurs événements FMOD persistants comme les sons de vent globaux, le vent localisé autour du joueur, les différentes ambiances (caverne, extérieur), la respiration du personnage ainsi que la faune environnementale.
L’objectif est de produire un socle sonore stable et dynamique, évitant toute rupture perceptive lors des déplacements en VR.

Présence sonore des arbres

Le script TreeSoundDynamic.cs a été conçu pour simuler la présence acoustique diffuse des arbres dans l’environnement, en particulier les bruits de feuillage et de mouvement induits par le vent. Contrairement à une approche classique consistant à placer manuellement des sources audio fixes dans la scène, ce script adopte une stratégie procédurale : il extrait dynamiquement les positions des arbres à partir des données du terrain, puis génère un nombre limité d’instances sonores spatialisées en fonction de la proximité du joueur.

Lors de l’initialisation, le script parcourt les instances d’arbres définies dans le TerrainData. Les positions correspondantes sont stockées dans une liste interne. À intervalles réguliers, un calcul de distance est effectué entre la position du joueur (ou de la caméra principale en VR) et l’ensemble des arbres répertoriés. Les arbres situés à l’intérieur d’un rayon défini (triggerDistance) sont triés par distance croissante, puis seuls les 3 plus proches sont conservés.

Cette limitation du nombre d’instances permet d’optimiser les performances tout en maintenant une cohérence: le joueur perçoit toujours une présence arborée proche, sans surcharge CPU ni multiplication excessive d’événements FMOD. Les instances sonores sont mises à jour en temps réel via set3DAttributes, assurant une spatialisation cohérente lors des déplacements.
Ce système crée ainsi une illusion de densité forestière continue, illustrant un compromis efficace entre réalisme acoustique et contraintes computationnelles en VR.

L’ambiance de rivière

Le script RiverSound implémente une approche procédurale de spatialisation sonore adaptée aux environnements linéaires complexes, tels qu’une rivière. Plutôt que d’utiliser une unique source sonore centrée, le système exploite la spline définissant le tracé du cours d’eau pour générer un ensemble de points de référence le long de son parcours.

À l’initialisation, les coordonnées locales de la spline sont converties en positions mondiales, chacune pouvant potentiellement servir de support à une instance sonore FMOD. Cependant, afin de préserver les performances et d’éviter une accumulation excessive de sources actives, le script sélectionne dynamiquement un nombre limité de points proches du joueur (paramétrable via NumberRiverInstances). Cette sélection est recalculée à intervalles réguliers, garantissant une continuité sonore fluide lors du déplacement.

Chaque instance active est mise à jour spatialement en temps réel grâce aux attributs 3D de FMOD. Cette méthode permet de restituer une présence sonore distribuée et progressive, évitant les variations abruptes de volume ou de localisation lorsque l’utilisateur longe la rivière.

Les sons d’animaux

Le script AnimalsSounds constitue le cœur du système sonore dédié aux animaux dans l’environnement préhistorique. Il ne se limite pas à déclencher des sons ponctuels, mais met en place une architecture paramétrique permettant de relier comportements animés, distance spatiale et réponse émotionnelle du joueur dans un même flux audio cohérent. Ce module assure ainsi la traduction sonore dynamique des états comportementaux de la faune tout en participant à la dramaturgie globale de la scène.

Architecture événementielle et gestion des états
Le système repose sur un événement FMOD unique (EV_Animals) piloté par plusieurs paramètres dynamiques. Chaque instance sonore est configurée à partir de deux paramètres labeled principaux :
Parameter_AnimalType, qui définit l’espèce (loup, ours, renne, oiseau, etc.), Parameter_AnimalState, qui correspond à l’action en cours (Idle, Walk, Run, Howl, Bite, Death…).
Cette structuration permet de centraliser l’ensemble des comportements sonores au sein d’un même événement FMOD, simplifiant la maintenance et garantissant une cohérence stylistique. Le script gère différentes instances (InstanceIdle, InstanceRun, InstanceHowl, etc.) qui sont créées, configurées et relâchées dynamiquement en fonction des animations déclenchées.
Chaque appel à PlayEvent() associe automatiquement la position 3D de l’animal à l’événement sonore via set3DAttributes, assurant une spatialisation fidèle dans l’espace VR.

Gestion dynamique de la distance et de la perseption

Au-delà de la simple spatialisation native de FMOD, le script ajuste explicitement le paramètre Parameter_Distance, calculé en fonction de la distance entre l’animal et la caméra. Cette approche permet un contrôle plus fin de l’atténuation ou de la coloration sonore, indépendamment de la courbe d’atténuation standard.
Un second paramètre, Parameter_Herd, est utilisé pour simuler la densité d’un groupe. En modulant ce paramètre selon la proximité et le contexte, le système donne l’illusion d’un troupeau ou d’une présence collective, même si un nombre limité d’instances sonores est réellement actif. Cela contribue à enrichir le paysage sonore sans surcharger le moteur audio.

Système de tension

L’un des aspects les plus intéressants du script réside dans la gestion d’un paramètre global d’adrénaline (Parameter_Adrenaline). Lorsqu’un animal potentiellement dangereux émet un son dans un rayon défini autour du joueur, une valeur de tension est progressivement incrémentée. Cette valeur influence un paramètre global FMOD, susceptible d’affecter la respiration du personnage ou d’autres couches sonores.
Le script inclut également un mécanisme de décrémentation progressive de cette tension via une coroutine, simulant un retour au calme lorsque le danger s’éloigne. Certains animaux non menaçants (comme les oiseaux ou les cervidés juvéniles) sont explicitement exclus de ce mécanisme afin de préserver la cohérence comportementale.
Cette intégration d’un paramètre émotionnel transforme le système animalier en un dispositif narratif implicite : la faune n’est plus seulement un élément décoratif, mais un facteur influençant l’état physiologique du joueur.

Optimisation et cohérence en temps réel

Afin d’éviter les déclenchements excessifs ou incohérents, le script surveille en permanence l’état de lecture des événements (PLAYBACK_STATE) et limite les activations successives via des temporisations. Les sphères de détection peuvent être visualisées en mode debug, facilitant l’ajustement spatial lors du développement.
L’ensemble fonctionne en synchronisation avec les animations contrôlées par ControllerAnimation.cs, garantissant une correspondance précise entre mouvement visuel et réponse sonore.


Le script AnimalsSounds illustre une approche avancée de la gestion sonore procédurale en VR : il combine paramétrisation comportementale, spatialisation 3D, simulation de groupe et réponse émotionnelle adaptative.
En intégrant ces dimensions au sein d’un seul module, le système contribue à créer un écosystème sonore vivant et interactif, où la faune participe activement à la perception immersive du monde préhistorique de Tautavel.

II – Interactions joueur / environnement

Le système d’interaction sonore repose sur plusieurs modules indépendants mais interconnectés, chacun chargé de traduire une classe d’événements physiques ou comportementaux en signaux audio.

Parmi ceux-ci, trois scripts se distinguent : ImpactManagerSound.cs, SplashSound.cs et FoliageSound.cs, qui assurent respectivement la gestion des impacts, des interactions avec l’eau et des déplacements dans la végétation.

Ces scripts appellent les events FMOD et les fonctionnalités physiques de Unity (collisions, triggers, raycasts) pour générer des sons en fonction de la position, de la vitesse et du type d’objet en interaction. Cette approche modulaire et temps réel garantit une adaptation continue du paysage sonore à l’action du joueur.

Les sons d’impact

Ce script constitue le noyau du système de gestion des impacts physiques dans la scène. Son rôle est de détecter, classer et déclencher les événements sonores associés à toute collision entre objets dynamiques.

Le script s’appuie sur un système d’événements centralisé : lorsqu’une collision est détectée par le composant CollisionEvent.cs, celui-ci envoie une requête à l’instance unique d’ImpactManagerSound. Ce dernier :
– Analyse les propriétés physiques de la collision (matériaux, vitesse d’impact, intensité).
– Sélectionne le type d’événement FMOD approprié.
– Calcule les paramètres audio dynamiques, notamment l’intensité ou la réverbération en fonction de la force d’impact.
– Déclenche le son à la position exacte de la collision, garantissant une spatialisation correcte dans l’environnement 3D.

Un singleton ImpactManagerSound.Instance permet une gestion optimisée, évitant la duplication d’instances FMOD et assurant la cohérence sonore sur l’ensemble du projet.

De plus, l’intensité sonore et la nature du son dépendent directement de la vitesse relative des objets au moment de l’impact, ce qui permet de reproduire aussi bien de légères collisions que des chocs puissants.

Le système communique avec d’autres scripts d’environnement (comme les collisions liées à l’eau dans SplashSound) pour garantir la continuité sonore entre matériaux (pierre, terre, eau, végétation).

Les sons d’eau

Le script WaterSound constitue le cœur du système acoustique lié à l’eau. Il assure à la fois la détection d’immersion du joueur, sa profondeur sous l’eau et le contrôle de plusieurs états acoustiques dans FMOD.

En s’appuyant sur un raycast vertical, il évalue en permanence la distance entre la position du joueur et la surface de l’eau afin de déterminer un paramètre de profondeur (depth). Ce dernier alimente directement le paramètre FMOD « Parameter_Water », contrôlant la présence d’une couche sonore liée à l’eau dans les footsteps et d’autres éléments ambiants.

Lorsque la profondeur dépasse un seuil défini (environ 1.6 mètre, correspondant au passage de la tête sous l’eau), un snapshot FMOD dédié (Snapshot_UnderWater) est activé. Celui-ci modifie globalement la scène sonore en filtrant les hautes fréquences, en augmentant la réverbération interne et en réduisant les sons extérieurs, simulant ainsi la propagation atténuée et amortie du son sous l’eau.

Le script gère également une phase de transition douce : lors de la sortie du joueur de la zone aquatique, un paramètre "Parameter_WaterEnd" est progressivement décrémenté sur une durée paramétrable, permettant un fondu acoustique cohérent entre les deux milieux.

En combinant tout cela, ce système recrée une immersion audio-réaliste et réactive, fidèle aux variations physiques perçues dans un environnement aquatique réel — un point essentiel dans le cadre d’une simulation VR scientifique et pédagogique.

Les sons de feuillage

Le script FoliageSound simule la réaction sonore du feuillage lorsque le joueur entre en contact avec la végétation. Chaque collision ou proximité avec un volume végétal déclenche dynamiquement un événement FMOD, ajusté selon la vitesse du joueur et la densité du feuillage.
Le système repose sur une détection par colliders multiples associés aux zones de végétation. Lorsqu’un contact est détecté, un événement event:/Environment/Foliage est joué à la position correspondante, avec un paramètre d’intensité dérivé de la magnitude de la vélocité.

Cette approche permet une réponse graduée — un léger bruissement lors d’un déplacement lent, un craquement marqué lors d’une traversée rapide.
Pour éviter la redondance sonore, un délai de réactivation empêche les déclenchements successifs sur la même zone.

Le résultat est une ambiance végétale vivante, synchronisée avec le mouvement du joueur, participant activement à la perception de l’espace et de la matière dans l’environnement VR.

III – Occlusion et propagation

La simulation de l’occlusion acoustique constitue un élément essentiel dans toute expérience immersive, notamment en réalité virtuelle. Dans un environnement 3D complexe, la perception sonore dépend non seulement de la distance à la source, mais également des obstacles intermédiaires (reliefs, murs, végétation, etc.) qui altèrent la propagation du signal.

Afin de renforcer le réalisme perceptif et la cohérence spatiale, un système d’occlusion dynamique a été mis en place. Celui-ci repose sur des calculs en temps réel effectués par raycasts, permettant d’ajuster la réponse fréquentielle et l’atténuation du son selon la géométrie rencontrée entre la source et le joueur.

Ce dispositif garantit que le son ne se comporte pas uniquement selon des lois géométriques simples, mais qu’il réagit physiquement à l’environnement — une condition indispensable pour la crédibilité de la scène sonore dans un contexte immersif comme celui ci.

L’occlusion dynamique

Ce script implémente une méthode d’occlusion sonore adaptative à partir de raycasts projetés entre la source sonore et la position du joueur.

Chaque trame, le script effectue une série de tests de collision qui permettent de déterminer si un obstacle bloque partiellement ou totalement la ligne directe de propagation.
Le résultat de cette détection (binaire ou pondéré selon le matériau traversé) influence directement un paramètre FMOD dédié, généralement nommé "Parameter_Occlusion". Ce paramètre agit sur un filtre passe-bas et un volume global dans FMOD, simulant ainsi la perte de clarté sonore et la réduction d’intensité dues à l’obstruction.

La conception modulaire du script permet de l’attacher à n’importe quel objet sonore : il peut ainsi être appliqué à des sources environnementales fixes (comme une cascade ou un feu de camp) ou à des entités mobiles. De plus, les calculs ont été optimisés afin de limiter la charge CPU, en ajustant la fréquence d’échantillonnage du raycast et en restreignant la portée de détection.

IV – Routage et multi-périphériques

Dans le cadre d’expériences collaboratives en réalité virtuelle, la gestion multi-utilisateur et multi-périphérique représente un enjeu majeur pour l’immersion.

En particulier, certaines configurations expérimentales impliquent la présence d’un joueur en casque VR et d’un second utilisateur sur écran, chacun nécessitant une spatialisation audio adaptée à sa propre perspective.
La mise en place d’un routage sonore différencié vise donc à assigner des sorties audio distinctes à chaque dispositif, permettant d’optimiser la perception auditive selon le contexte (proximité, orientation, champ visuel).

Cette approche ouvre la voie à des scénarios collaboratifs ou pédagogiques où plusieurs auditeurs perçoivent simultanément des paysages sonores cohérents, mais personnalisés.

DriversOutputs

Le script DriversOutputs constitue une tentative de routage audio multi-périphérique exploitant les capacités internes de FMOD CoreSystem. L’objectif initial était de séparer le flux audio vers deux périphériques distincts :
le casque VR, associé à un StudioListener spécifique,
l’ordinateur principal, gérant les sons perçus par un second auditeur ou un observateur extérieur.

Le script procède à une initialisation parallèle de deux systèmes FMOD (CoreSystem et CoreSystem2) et tente d’assigner à chacun un driver audio différent via setDriver(). Chaque système est ensuite lié à son propre bus logique dans FMOD (BUS_Computer et BUS_VR), permettant d’acheminer des événements sonores indépendants.

Bien que le fonctionnement complet n’ait pas été atteint (limitations du moteur Unity et de l’API FMOD Unity), cette approche illustre une piste de recherche prometteuse pour la diffusion spatiale multi-canal et multi-dispositif.

Un tel routage permettrait à terme de synchroniser plusieurs écoutes subjectives dans un même environnement virtuel, ouvrant la voie à des expérimentations collectives en réalité virtuelle, particulièrement adaptées à un cadre muséographique ou pédagogique comme celui du projet de reconstitution de l’Homme de Tautavel.

Conclusion

L’architecture audio développée repose sur une structuration modulaire articulée autour de quatre ensembles complémentaires cités et expliqués ci dessus.
Chaque bloc joue un rôle essentiel dans la cohérence et la crédibilité du paysage sonore en réalité virtuelle.
Les ambiances constituent le socle perceptif de l’expérience, garantissant la continuité et la dynamique du monde sonore. Les scripts environnementaux, tels que la gestion d’occlusion ou les sons dynamiques d’arbres et de vent, ajoutent une profondeur contextuelle, renforçant la sensation de présence.

Le sous-système aquatique, particulièrement abouti, illustre la capacité du moteur à réagir finement aux interactions physiques et à la topologie du monde virtuel, en combinant détection de profondeur, variation d’intensité et rendu subaquatique.

Enfin, le routage multi-périphérique, bien qu’expérimental, ouvre la voie à une approche multi-utilisateur et spatialisée, adaptée aux dispositifs collaboratifs et aux contextes muséographiques.

Dans son ensemble, le système démontre qu’une intégration audio procédurale et contextuelle, fondée sur des scripts autonomes et interconnectés, peut dépasser le cadre du simple design sonore pour devenir un vecteur d’immersion scientifique et pédagogique dans la reconstitution du monde préhistorique de Tautavel.