On appelle effet Doppler la modification de la fréquence d'une onde relativement à un observateur se déplaçant par rapport à la source de l'onde. Ce phénomène physique se produit lors de la propagation de tous types d'ondes, et les ondes sonores ne font pas exception. Avec le développement de l'industrie de l'audio de jeu vidéo, de nombreux moteurs de jeux se tournent vers l'intégration de leurs propres solutions Doppler. Par exemple, Unity et UE ont tous deux introduit des fonctions audio pour créer l'effet Doppler. Cependant, ces fonctions ne sont disponibles que dans les moteurs de jeu et ne peuvent pas interagir avec Wwise, ce qui signifie que vous ne pourrez pas en tirer profit lorsque vous développerez l'audio d'un jeu avec Wwise.
Récemment, j'ai fait quelques recherches sur la façon de créer un effet Doppler en utilisant Wwise, et j'ai utilisé UE4 en combinaison avec Wwise pour créer un projet de démonstration afin de vérifier mon travail, comparant par la même occasion les effets Doppler des deux moteurs. Jetez un coup d'œil et écoutez les résultats !
Créer un effet Doppler avec Wwise
Comparons les résultats obtenus dans différentes situations : sans effet Doppler, avec l'effet Doppler de UE, et avec l'effet Doppler de Wwise.
Comme vous pouvez le constater, l'effet Doppler fait une grande différence sur l'expressivité du son. Sans effet Doppler, on ne peut pas du tout sentir la vitesse du mouvement. Quant aux effets Doppler de UE et de Wwise, il n'y a presque aucune différence concernant leurs timbres. La seule différence notable est que, dans UE, j'ai positionné le listener sur le personnage et non sur la caméra, ce qui crée une panoramique plus étroite. J'ai fait cela pour m'assurer que le calcul de la position du joueur reste constante entre UE et Wwise, et que l'effet Doppler ne soit pas affecté par le mouvement de la caméra.
Maintenant, comment cela fonctionne ? Jetons un coup d'œil aux paramètres audio dans UE et dans Wwise :
Image 1.1 : Paramètres de l'effet Doppler dans UE
Pour créer un effet Doppler dans UE, il suffit d'ajouter l'élément Doppler.
Image 1.2 : Paramètres de l'effet Doppler dans Wwise
Dans Wwise, il suffit de créer un RTPC et de s'assurer que tous les sons concernés aient le même effet Doppler que l'élément Doppler. Maintenant, laissez-moi vous expliquer comment j'ai créé la courbe RTPC et comment elle fonctionne.
2. Contrôler l'effet Doppler avec un RTPC
Avant de régler une courbe destinée à un effet Doppler, nous devons connaître le phénomène physique derrière celui-ci. Pour éviter les ambiguïtés et réduire les variables, permettez-moi de clarifier une chose : dans les sections suivantes, lorsque je fais référence à des « ondes », je parle d'ondes sonores. Ces ondes se déplacent à 340 m/sec dans de l'air restant absolument immobile. Le mouvement (par rapport à l'air) de tous les émetteurs et auditeurs est plus lent que la vitesse du son (l'influence des ondes lumineuses et de la transformation de Lorentz sur l'effet Doppler ne sera pas abordée ici). Dans ces conditions, l'effet Doppler résultant du mouvement de l'émetteur et de l'auditeur suit la formule suivante :
f' est la fréquence du son entendu par l'auditeur ; f est la fréquence du son émis par la source sonore ; v est la vitesse du son ; v0 est la vitesse de déplacement de l'auditeur par rapport à l'air ; v8 est la vitesse de déplacement de l'émetteur par rapport à l'air.
Il existe deux situations : (1) l'émetteur reste immobile, l'auditeur est en mouvement ; ou (2) l'auditeur reste immobile, l'émetteur est en mouvement. Ces deux situations sont très différentes concernant l'effet Doppler. Dans la première situation, v8 = 0 ; dans la seconde, v0 = 0. Voyons comment cette formule évolue et quelle courbe nous pouvons en tirer.
Image 2.1 : Courbe f'-v0 lorsque v8 = 0
Image 2.2 : Courbe f'-v8 lorsque v0 = 0
Écoutons les effets Doppler de ces deux situations.
Nous pouvons désormais constater qu'il y a une grande différence entre ces deux situations. Et nous ne pouvons pas simplement ignorer l'une des deux, ni même simplement ajuster une valeur moyenne. Cela ne fonctionnera pas. Pour obtenir un effet Doppler convaincant, nous devons prendre en compte les deux situations. Cependant, utiliser deux RTPC en même temps n'est pas un bon choix considérant les besoins de suivi à long terme. Nous pouvons prendre la valeur f'/f comme variable de RTPC, plutôt que d'utiliser deux valeurs de vitesse. De cette manière, nous ne devons créer qu'une seule courbe RTPC dans Wwise. Il sera beaucoup plus facile pour nous d'en faire le suivi et de la modifier. La hauteur et la fréquence suivent une règle de base : Une octave supérieure signifie deux fois la fréquence. Cela peut être exprimé par une courbe de fonction simplifiée : y = 2x. Cependant, vous ne pourrez pas créer une telle courbe dans Wwise, car seule la hauteur du son peut être utilisée comme axe y. En échangeant les positions de y et x, nous obtenons une nouvelle courbe de fonction : x = log2y. Maintenant, nous savons que la vitesse du son est de 340 m/sec, et que 1200 cents (la valeur de la hauteur du son) correspond à une octave dans Wwise. Avec ces informations, nous pouvons créer une courbe hauteur-vitesse dans Wwise.
Image 2.3 : Courbe hauteur-vitesse dans Wwise
Nous avons désormais une idée générale de la façon de créer un effet Doppler dans Wwise. Ensuite, nous devons clarifier nos besoins auprès des programmeurs-euses : « Je veux que vous m'aidiez à calculer les vitesses relatives entre le joueur et l'émetteur, que vous les mettiez dans la formule pour obtenir f'/f, puis que vous la transmettiez à Wwise comme une valeur de RTPC. »
Regardez la vidéo suivante pour voir comment cela fonctionne.
Bien sûr, j'ai fait cela avec l'aide de programmeurs professionnels. Mais que se passe-t-il si les programmeurs-euses ne sont pas disponibles ou si vous voulez simplement le faire vous-même ?
Voyons comment nous pouvons définir les valeurs de RTPC.
3. Obtenir les variables de RTPC depuis le moteur de jeu
Regardez le workflow suivant :
Image 3.1 : Workflow pour obtenir les variables de RTPC nécessaires.
Comme je ne m'y connais pas beaucoup en C++, je ne vais pas vous montrer le code ici. Jetons simplement un coup d'œil aux Blueprints Unreal que j'ai créés. Les Blueprints montrent simplement comment implémenter les effets et comment obtenir les paramètres d'opération nécessaires. Ils ne sont pas complètement logiques, mais servent juste de référence. Selon le workflow ci-dessus, j'ai créé le Blueprint suivant :
Figure 3.2 : Blueprint permettant d'obtenir les variables de RTPC requises.
Cependant, il y a un petit problème. L'élément Get Component Velocity ne fonctionne que pour les composants ayant des paramètres de vélocité. Par exemple, le jeu de démonstration à la troisième personne de UE 4 est livré avec un personnage par défaut.
Image 3.3 : Paramètres de vélocité pour le personnage par défaut du jeu de démonstration de UE4
Si un composant n'a pas de paramètre de vélocité, alors l'élément Get Component Velocity ne peut pas retourner de valeur. Dans ce cas, nous devons calculer la vélocité par nous-mêmes. Voici le Blueprint que j'ai créé :
Image 3.4 : Blueprint permettant d'obtenir les variables de RTPC en calculant la vitesse de déplacement (1)
En voici un autre :
Image 3.5 : Blueprint permettant d'obtenir des variables de RTPC en calculant la vitesse de déplacement (2)
Les deux Blueprints lisent les positions du joueur et de l'émetteur à chaque image, obtiennent le vecteur vitesse de l'image précédente, puis projettent ce vecteur sur la ligne entre le joueur et l'émetteur afin d'obtenir une vitesse relative, et enfin en tirent la valeur de RTPC selon la formule. Toutefois, la première méthode permet d'obtenir la vitesse relative en calculant les coordonnées de position de l'émetteur ou de l'auditeur à chaque image ; alors que la seconde permet d'obtenir la vitesse relative en calculant la distance de l'émetteur ou de l'auditeur l'un par rapport à l'autre à chaque image. La différence entre les valeurs obtenues par ces deux méthodes est presque négligeable.
4. Réglages de l'intensité du Doppler
Tous les calculs de RTPC mentionnés précédemment nécessitent un chargement très faible au niveau de la plate-forme système. Ces opérations de nombres en virgule flottante sont vraiment insignifiantes en comparaison du traitement de l'image. Cependant, il peut y avoir des situations où nous ne voulons pas d'un effet Doppler d'une telle précision. Dans ce cas, nous pouvons alléger la charge du système en diminuant simplement les valeurs et en réduisant les temps d'opération. Dans les Blueprints, j'ai utilisé un Tick Event pour contrôler le calcul du RTPC. Ce Tick Event prend des valeurs à chaque image. Si vous n'avez pas besoin d'un effet Doppler aussi précis, il suffit de créer un Loop Event supplémentaire pour effectuer le calcul du RTPC. L'intervalle de la boucle peut être défini comme vous le souhaitez. Nous utiliserons cette valeur au lieu de la valeur Delta Seconds fournie par le Tick Event. La plage de valeurs devra être relativement petite. Sans quoi, vous entendrez un changement brusque en cas de variation drastique de la vitesse de déplacement.
Dans mon projet de démonstration, j'ai essayé de nombreuses façons d'ajuster l'intensité du Doppler. Cependant, pour des raisons de simplicité, elles ne sont pas montrées ici. Pour mieux comprendre le changement de fréquence, le moteur du vaisseau (« UFO Engine ») a été réglé sur « Helicopter ».
Il y a deux façons d'ajuster l'intensité du Doppler : changer la forme de la courbe dans Wwise, ou modifier les valeurs de RTPC. L'intensité du Doppler peut être contrôlée à volonté en multipliant la valeur de la vélocité résultante par un facteur choisi. Notez que l'intensité du Doppler et la vélocité suivent une fonction inversement proportionnelle. Cette manière est légèrement différente de la façon dont c'est fait dans UE (les valeurs ne sont pas les mêmes).
Maintenant, pourquoi voudrions-nous ajuster l'intensité du Doppler ? Théoriquement, le phénomène de Doppler est fixe dans la vie réelle, et il devrait être de même dans un jeu. Sauf si vous voulez changer le type ou la densité du milieu de propagation. Les jeux vidéo de demain pourraient avoir de telles exigences. Un autre grand avantage est que vous pouvez utiliser différentes unités de distance dans un même niveau. Disons que nous avons un jeu dans lequel le personnage du joueur peut grossir ou rétrécir. Lorsque le joueur devient plus petit, il se déplace beaucoup plus lentement, tout comme les objets qui interagissent avec lui. Dans ce cas, les sons sont moins expressifs. Au lieu de modifier les valeurs de distance, il serait beaucoup plus facile d'ajuster l'intensité du Doppler.
5. Effets de Doppler interactifs
Bien que les effets de Doppler interactifs fournis par le moteur de jeu soient convaincants, ils ne sont applicables que dans certains scénarios, en fonction du développement du jeu et de la conception audio.
Les effets de Doppler interactifs sont généralement utilisés pour des émetteurs subsoniques qui existent pendant une longue période temporelle et émettent des sons en continu, comme les voitures, les hélicoptères, les montagnes russes, les projectiles dans un RPG, etc.
Pour les objets transsoniques ou supersoniques, cela ne fonctionne pas automatiquement. Si un émetteur s'approche de la vitesse du son, le modèle sonore change, et la plupart des sons qu'il émet ne proviendront plus de son propre son, mais de la friction de l'air et des ondes de choc. Cela implique des théories acoustiques plus complexes, qui dépassent les possibilités de l'effet Doppler. Si un auditeur dépasse la vitesse du son, le son provenant de l'arrière ne peut plus être entendu, et l'auditeur lui-même devient un émetteur. Ainsi, l'effet Doppler ne peut pas représenter complètement le comportement des objets supersoniques.
Pour les objets supersoniques dans un jeu, nous préférons la méthode traditionnelle de création d'assets : les assets sonores eux-mêmes contiennent l'effet Doppler, et il suffit d'ajuster le timing pour simuler leurs comportements. L'un des exemples les plus courants est celui des balles dans un jeu. Chaque fois qu'une balle passe, on entend un son de type « woosh ». La vitesse de la balle est très rapide, et les joueurs ne sentent généralement pas de différence même s'il y a une légère déviation dans le timing et l'intensité.
Il existe également des sons dont la durée et le timing sont fixes. Dans ce cas, certains assets peuvent être déclenchés, plutôt que d'effectuer un calcul en temps réel. Par exemple, lorsque le joueur 1 tire une flèche, nous allons intégrer le son de woosh dans les fichiers audio correspondant aux tirs, au lieu de calculer l'effet Doppler en temps réel. Pour obtenir le résultat optimal, il est important d'avoir un système différent adapté à chaque contexte.
6. Intégrer l'effet Doppler dans Wwise
Pour créer un effet Doppler dans le jeu avec Wwise, il suffit d'obtenir les vitesses relatives entre l'émetteur et l'auditeur, de les traduire en valeurs de RTPC, puis d'utiliser ces valeurs pour contrôler la hauteur. Pour traduire les valeurs de RTPC, nous devons obtenir les coordonnées de l'émetteur et de l'auditeur de façon continue. Heureusement, Wwise surveille et capture ces données en permanence lors de l'exécution du jeu, afin de calculer l'atténuation, les informations de spatialisation audio, etc. En fait, Wwise est déjà tout équipé pour effectuer des opérations de Doppler. Il s'agit surtout de calculer la distance de chaque émetteur, mais avec des opérations en virgule flottante légèrement plus complexes. Il est possible d'adapter le système selon le projet en ajustant simplement l'intensité du Doppler. Par exemple, l'unité de mesure de base est le centimètre dans UE, alors qu'elle peut être le mètre pour d'autres moteurs de jeu. Dans ce cas, il suffit de remplacer la vitesse du son (34 000) par 340 pour le calcul du RTPC. Et si l'unité de distance dans le jeu et l'unité de distance réelle ne sont pas égales ? Eh bien, c'est assez facile. Il suffit d'introduire un facteur d'échelle. C'est un peu ce que l'on fait lorsque l'on ajuste l'intensité du Doppler.
En créant l'effet Doppler avec Wwise, j'ai été surpris de constater que le moteur avait déjà tous les prérequis pour un tel module. Et j'espère pouvoir utiliser des outils de Doppler personnalisés avec Wwise à l'avenir !
Commentaires