Introduction
Ceci est le dernier article d'une série de trois articles techniques de Jater (Ruohao) Xu, dans lesquels il partage le travail réalisé pour Reverse Collapse : Code Name Bakery.
- Vous pouvez consulter le premier article ici, dans lequel il explore l'utilisation de Wwise pour contrôler les cinématiques du jeu.
- Vous pouvez consulter le deuxième article ici, dans lequel il explique comment la vue en 2D inclinée du jeu a nécessité un système audio 3D personnalisé pour résoudre des défis uniques liés à l'atténuation.
Synchronisation labiale des animations avec le plugin Wwise Meter
Série d'articles techniques | Partie 3
Il existe de nombreux éléments et moments dans le jeu où la mécanique est pilotée par l’audio. Grâce au plugin Wwise Meter, nous pouvons obtenir en temps réel des données audio précises pouvant être ensuite transmises au moteur de jeu pour alimenter différents systèmes audio.
Comme dans beaucoup d'autres jeux utilisant un style anime, Reverse Collapse comporte de riches dialogues narratifs ; bien que certains soient déclenchés durant les combats, la majorité se déroule dans des séquences narratives en 2D où deux personnages, placés à gauche et à droite de l'écran, interagissent à travers des dialogues de type question-réponse.
L'image ci-dessus illustre un exemple de système narratif en 2D dans le jeu, où le personnage de Mendo est en train de parler au moment où la capture d'écran a été faite. Lorsque le personnage parle, une animation labiale est déclenchée sur ses sprites. Cette fonctionnalité est pilotée par les données de volume audio récupérées via Wwise.
Le jeu peut synchroniser l'animation labiale avec la parole en utilisant les données de volume audio, ce qui améliore l'immersion et renforce le réalisme des interactions entre les personnages. Cette méthode enrichit l’expérience narrative, la rendant plus captivante pour les joueurs.
Pour récupérer les données de volume en temps réel, le plugin Wwise Meter (Wwise Meter (audiokinetic.com)) a été utilisé. Il s’agit d’un outil simple d’utilisation et très performant, permettant de transmettre les données audio de Wwise vers le moteur de jeu. L’image ci-dessous montre la configuration de Wwise Meter sur notre bus de voix principal.
Dans le plugin Wwise Meter, nous avons associé un RTPC nommé Speech_MeteringData qui nous sert à transmettre les données au moteur de jeu. Ce RTPC collecte les informations relatives au volume de sortie des voix déclenchées dans le jeu. Sa valeur varie entre -48 et 0, ce qui représente l’étendue de volume audio. Même si la valeur peut théoriquement dépasser 0 en cas d’écrêtage du volume, c’est une situation qu’il est en général recommandé d’éviter en mixage où il est préférable de maintenir la valeur en dessous de 0.
Avec cette configuration, nous pouvons capturer et transmettre précisément les données de volume audio au moteur de jeu, de manière contrôlée, facilitant ainsi l’implémentation de diverses mécaniques de jeu.
Voilà qui conclut la configuration côté Wwise. Pour exploiter ces données côté moteur de jeu, il suffit d’ajouter quelques lignes de code pour détecter le niveau de volume et transformer cette valeur en donnée exploitable par notre système d’animation. Le code d’animation ci-dessous est volontairement simplifié, car chaque jeu possède ses propres systèmes d’animation ou peut utiliser des plugins différents.
Dans notre jeu, le système d’animation est assez simple : la bouche du personnage n’a que deux états, Open (ouverte) et Closed (fermée), et nous pouvons donc simplement utiliser une opération ternaire conditionnelle pour déterminer si la bouche du personnage doit être ouverte, et l’animer en conséquence. (Voir les paragraphes ci-dessus pour l’implémentation de GetGlobalRTPC())
bool bIsCharacterMouthOpen = (GetGlobalRTPC(“Speech_MeteringData”) > -48.0f && GetGlobalRTPC(“Speech_MeteringData”) <= 0) ? true : false;
Dans de nombreux autres jeux, notamment en 3D, les personnages peuvent posséder des articulations et des os dans leur squelette 3D ; il est alors possible d’ajuster l’angle de l’articulation utilisée par l’animateur pour ouvrir la bouche. Cet angle est généralement exprimé par une valeur flottante. Dans cet exemple, imaginons que cette valeur puisse être appliquée avec speakingCharacter.SetMouthOpenness(float mouthJointAngle) ; l’angle minimum et maximum d’ouverture de la bouche s’étend de 0 degré à speakingCharacter.MaxMouthOpenness() degrés.
Dans ce cas, nous allons créer une petite fonction utilitaire pour extraire la valeur de sortie du modificateur de paramètre et l’utiliser directement dans les zones où cette fonctionnalité est requise.
public float GetGlobalRTPC(string rtpcName)
{
int rtpcType = 1;
float acquiredRtpcValue = float.MaxValue;
AkSoundEngine.GetRTPCValue(rtpcName, null, 0, out acquiredRtpcValue, ref rtpcType);
if(acquiredRtpcValue >= 0.25 && acquiredRtpcValue <= 16)
{
return acquiredRtpcValue;
}
else
{
return 1.0f;
}
}
Outre la définition globale du RTPC, la fonction ci-dessus garantit également que, si des valeurs incorrectes sont détectées, elle ignorera l’application du RTPC et réinitialisera la valeur à 1.0f, ce qui correspond à la valeur par défaut.
Dans ce cas, nous pouvons améliorer le code précédent en utilisant la fonction suivante :
public float SetMouthOpenessByWwiseAudio()
{
float mouthOpennessToSet = 0.0f;
float retrievedMeteringRTPCvalue = GetGlobalRTPC(“Speech_MeteringData”);
if (retrievedMeteringRTPCvalue > -48.0f && retrievedMeteringRTPCvalue <= 0)
{
mouthOpennessToSet = speakingCharacter.MaxMouthOpenness() * Normalization(retrievedMeteringRTPCvalue, -48.0f, 0.0f));
}
speakingCharacter.SetMouthOpenness(mouthOpennessToSet);
}
En effet, la fonction fournie ajustera précisément l’ouverture de la bouche en fonction des données de volume audio reçues du plugin Wwise Meter. Cela garantit que l’animation de la bouche reste fidèle et synchronisée avec le volume audio.
Avertissement : Les extraits de code utilisés dans cet article sont des versions génériques reconstituées et destinées uniquement à des fins d'illustration. La logique sous-jacente a été vérifiée pour fonctionner correctement, les appels et fonctions API spécifiques au projet ont été omis des exemples en raison de restrictions potentielles en matière de droits d’auteur.
Commentaires