La génération procédurale dans le jeu vidéo

Je recycle ici un travail étudiant datant d’il y a trois ou quatre ans. Le texte a été un peu désuni­ver­si­ta­risé, à part ça il est tel quel. Le format était volon­tai­re­ment court et limité au jeu vidéo.

Les jeux vidéos grand public actuels ont souvent une grande valeur ajoutée en terme de contenu : graphismes réalistes, envi­ron­ne­ments vastes et variés, acteurs profes­sion­nels, etc. Même avec un gros budget, cette richesse repré­sente un défi de produc­tion. Par exemple, la ville immense et détaillée de GTA4 a été entiè­re­ment créée « à la main » : chaque immeuble a été dessiné et placé avec soin par des artistes. Il existe une autre approche, qui consiste à partir d’éléments de base (ici, un ensemble de bâti­ments) et à les disposer semi-aléatoirement, avec certaines contraintes (laisser des vides pour que des rues se forment, rassem­bler les immeubles simi­laires pour que chaque quar­tier ait une iden­tité, etc.). Cette approche dite procé­du­rale est très géné­rique : avec elle, on peut générer des textures, des terrains, des niveaux de jeu, des scéna­rios, etc.

Un peu de technique

Il y a globa­le­ment deux familles de tech­niques : celles des gram­maires de formes et celles utili­sant des fonc­tion de bruit.

[Note 2014 : J’avoue ne plus savoir d’où je sors cette distinc­tion. Il existe des dicho­to­mies plus géné­rales, notam­ment entre algo­rithmes onto­gé­né­tiques et téléo­giques, c’est-à-dire en gros entre les modèles réalistes seule­ment en appa­rence et ceux qui le sont vrai­ment. Voir cette liste et cet article.]

Les gram­maires de formes sont héri­tées des gram­maires formelles, qui permettent de décrire avec un jeu de règles l’ensemble des phrases correctes d’un langage donné. On procède en géné­rant toutes les phrases possibles à partir d’un alphabet et de règles de tran­si­tion. Par, exemple, à partir de l’alphabet {a, b} et de la règlea => b, on peut générer le langage {a, ab, abb, abbb…}. Cette idée fut d’abord utilisée pour modé­liser des phéno­mènes de crois­sance natu­relle (feuilles, colo­nies de bactérie), puis étendue à l’architecture. En prenant des formes géomé­triques simples comme alphabet de base, on peut créer des façades, des bâti­ments, voire des villes entières.

Système L
Système L

Passons aux fonc­tions de bruit. On commence par placer des points dont les valeurs sont géné­rées de façon pseudo-aléatoire, puis à effec­tuer une inter­po­la­tion entre eux afin d’obtenir une courbe. Faire la somme de plusieurs de ces courbes permet d’en obtenir une d’aspect plus fractal, compliqué et naturel. On peut faire la même chose en deux dimen­sions, ce qui donne alors une texture. Le passage à la troi­sième dimen­sion permet d’obtenir un terrain, ce qui est rela­ti­ve­ment trivial : il suffit d’interpréter la valeur du niveau de gris comme une hauteur.

Bruit de Perlin en dimensions 1, 2 et 3
Bruit de Perlin en dimen­sions 1, 2 et 3

Un nouveau processus de conception

Générer du contenu procé­du­ra­le­ment au lieu de le créer à la main a de multiples avan­tages :

  • Réduction des coûts de main d’œuvre. Concevoir et para­mé­trer un algo­rithme qui génère une forêt n’est pas trivial, mais ce sera toujours moins long que de dessiner et placer chaque arbre.
  • Diminution des besoins de stockage et de bande passante. Par exemple si l’on veut des textures haute­ment réalistes, il suffit de stocker l’algorithme qui les génére à la volée, et pas les lourdes images finales. C’est ce qui permet à certains de créer des démos graphiques spec­ta­cu­laires avec un fichier d’origine pesant quelques dizaines de Ko, alors que l’équi­valent en vidéo pèse­rait beau­coup plus. Voir par exemple .kkrieger.

Cette approche a évidem­ment des limites. Générer procé­du­ra­le­ment un objet revient à auto­ma­tiser sa créa­tion, ce qui implique dans une certaine mesure qu’on le comprenne. Par exemple, créer des récits vrai­sem­blables suppose que l’on sache ce qui fait qu’une histoire est bonne. Il faut au pire avoir de bonnes intui­tions et heuris­tiques à ce sujet, au mieux avoir isolé des inva­riants et savoir les combiner. Cela fait écho à la quête des théo­ri­ciens du récit et des spécia­listes des séries télé­vi­sées qui cherchent à trouver des arché­types et des méca­nismes présents dans tout récit.

Ces limites suggèrent une méthode de concep­tion diffé­rente de celle fréquem­ment en vigueur. Les jeux vidéo pour le grand public sont souvent très linéaires, avec une suite d’évènements scriptés minu­tieu­se­ment. Par exemple, un avion doit passer au-dessus du joueur préci­sé­ment au moment où il sort d’un tunnel. Le but est de contrôler autant que possible l’expérience du joueur, dans la pers­pec­tive clas­sique d’un artiste démiurge et tota­le­ment maitre de l’univers fictionnel. Cet idéal devient impos­sible dans une pers­pec­tive procé­du­rale, puisque le contenu est large­ment aléa­toire1. Par exemple, on ne peut pas savoir la dispo­si­tion exacte des arbres et des clai­rières dans une forêt.

Pourtant, on regagne en faci­lités de macro-gestion ce qu’on perd en contrôle minu­tieux. On ne peut pas placer telle espèce d’arbre à tel endroit, mais on peut faire des chan­ge­ments globaux sur la flore simple­ment en modi­fiant l’algorithme. Ce nouvel état d’esprit peut se répandre dans tout le processus de concep­tion. Par exemple, puisqu’on ne peut pas plani­fier préci­sé­ment l’emplacement d’une rencontre en forêt, on peut laisser le programme s’en occuper en suivant certaines condi­tions (« dans une clai­rière à moins d’un kilo­mètre de la ville »). Ensuite, on peut être tenté de rendre aléa­toire la survenue elle-même des évène­ments. Certains moments clés dans le scénario peuvent restés pré-codés, tandis que d’autres peuvent se faire au hasard (par exemple les rencontres que le joueur ferait dans une ville).

De nouveaux types d’interactions

L’approche procé­du­rale change aussi beau­coup la manière de jouer. Certains jeux promettent en effet une re-jouabilité poten­tiel­le­ment infinie, puisque la carto­gra­phie des niveaux, l’emplacement des objets, les objec­tifs à remplir, etc. sont diffé­rents pour chaque nouvelle partie et chaque joueur. La ques­tion de la durée de vie d’un jeu doit donc être repensée, puisqu’elle dépend plus de la propen­sion du joueur à se lasser que de l’imagination du déve­lop­peur. À charge pour ce dernier de créer un programme qui génère des envi­ron­ne­ments et des aven­tures inté­res­santes, le reste se passe entre le jeu et le joueur. C’est à nouveau une perte de contrôle pour le créa­teur, mais qui se révèle payante, puisqu’elle permet au joueur de mieux s’approprier le jeu et de se faire sa « propre » aven­ture.

Plus géné­ra­le­ment, le centre de gravité se déplace du créa­teur vers la créa­tion elle-même. Dans beau­coup de jeux clas­siques, le joueur essaye de composer avec ce qu’il devine des inten­tions du créa­teur, en essayant de prédire où un piège a été placé, ou quel va être le prochain rebon­dis­se­ment dans l’in­trigue. Dans un jeu généré procé­du­ra­le­ment, on cherche plutôt la logique qui gouverne la géné­ra­tion de ces struc­tures variées. Passé l’émerveillement initial, on cherche la néces­sité derrière la contin­gence appa­rente des formes.

L’approche procé­du­rale est ainsi très promet­teuse. Il existe même des travaux qui tentent de rendre auto­ma­ti­sable la géné­ra­tion des règles elles-mêmes, notam­ment Angelina, un moteur aléa­toire de créa­tion de jeux. Toutefois, étant donné les limi­ta­tions de concep­tion, ne sont envi­sa­geables que des méthodes où seul un aspect du jeu est procé­dural.


  1. Dans les faits, peu de jeux sont générés inté­gra­le­ment de manière procé­du­rale. De plus, on peut tech­ni­que­ment rendre l’environnement iden­tique à chaque géné­ra­tion, puisque le géné­ra­teur est pseudo-aléatoire : il suffit d’entrer à chaque fois les même para­mètres de départ. 

Articles liés

Attention, commentaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.