DevTip : Créer l’illusion du mouvement

Il faut savoir que créer du mouvement dans un jeu vidéo est extrêmement gourmand en ressources et encore plus lorsqu’on veut déformer un objet.
Il existe plusieurs techniques mais vu qu’ici le but est de, littéralement, faire bouger des kilomètres de falaises, mon choix s’est porté vers la solution la moins gourmande en ressource : les matériaux.

Cela peut paraître assez étrange de parler de créer du mouvement par une technologie qui a été développée pour afficher des textures mais cette propriété supplémentaire des matériaux existe bien dans presque tous les moteurs de jeux vidéo. Dans Unreal, elle est accessible via la pin World Position Offset ou plus simplement WPO. Cette propriété permet de donner l’impression de déplacer les points d’un objet dans l’espace depuis leur position d’origine. La seule contrainte est de trouver la bonne fonction mathématique qui fera bouger correctement les points. Et pour ça, vous pouvez avoir confiance en la créativité des développeurs.

Voici un petit exemple de matériau avec une déformation sinusoïdale en fonction de la hauteur :

Mais revenons à notre problème. Pour les falaises, nous voulions donner l’impression d’une distorsion de la matière s’intensifiant au plus on se rapproche d’un certain niveau zéro. Ce mouvement est composé de deux parties :

  • Un mouvement vertical de haut en bas
  • Un mouvement horizontal qui rentre dans la falaise donnant une impression d’infinité.

J’ai mis cela en place par phase.

Mouvement vertical

Partant de la modélisation de base, je provoque un étirement vertical graduel (en accélérant vers le centre) lorsque je me rapproche de l’interface.

Comme il y a de l’étirement vertical vers le bas, je décide de clamper les valeurs afin de ne pas dépasser la limite que nous avons définie. Ou pour le dire plus simplement, on écrase le mesh à partir d’une certaine valeur.

Mouvement horizontal

Je rajoute un mouvement horizontal. Le concept est identique que précédemment.

La spécialité d’Olivier

S’il y a bien un trait de caractère à savoir chez moi, c’est que je ne sais pas me contenter de ne faire qu’une seule tâche et j’ai toujours besoin de remettre en question les systèmes mis en place. Ça m’aide a voir et comprendre un problème dans son ensemble.
Cette fois-ci, mon attention s’est porté vers le niveau zéro.

Je sentais qu’avoir une ligne plate dans tout le niveau rendrait nos niveaux un peu trop fades.
Après m’être penché sur différentes technologies, mon choix s’est porté sur les Virtual Textures.

Cet outil est proposé par Unreal. Son objectif premier et de permettre un meilleur blend des objets avec leur environnement.

https://www.youtube.com/watch?v=0-xXIMjlmqE

Malgré une utilisation plus vaste, ce qui m’intéressait dans cet outil, c’est surtout la notion de calcul de distance entre un terrain et les vertex d’un objet.

Grâce à la virtual texture mise en place ici, j’ai pu récupérer la valeur de distance entre un premier mesh -le niveau zéro- et les points d’un deuxième mesh -la falaise.
À partir de ça, on peut dessiner le niveau zéro en partant d’une simple spline. J’obtiens alors automatiquement les déformations de mon mesh d’origine le long de cette géométrie.

Résultats

Au final, on obtient :