Les débuts de KSP #4

Comme vous le savez, KSP n’a pas toujours été ce qu’il est aujourd’hui. Le jeu étant en constante évolution, ses débuts furent bien différents de ce que l’on connait aujourd’hui ! Saviez-vous par exemple que le jeu n’était pas censé être disponible à tous, mais un simple test d’un développeur ? Vous risquez d’en apprendre beaucoup au cours de cette série d’articles.

Aujourd’hui, nous débutons le quatrième et dernier article de cette série inédite, vous pouvez retrouver le précédent article sur ce sujet via ce lien.

Attention : Cet article contient beaucoup de termes techniques, si vous avez envie de pleurer et de recevoir un câlin de l’équipe parce que vous ne comprenez pas, nous pourrons vous fournir une explication simplifiée en commentaire !

4 – KSP 0.4

Continuons l’histoire de KSP. Tout le message qui suit est une citation directe des développeurs, traduit par nos soins.

KSP 0.4 fut la version qui nous fit travailler – enfin ! – sur le problème du relief, à l’échelle planétaire. Cela faisait un bout de temps que j’avais travaillé sur des terrains générés de manière procédurale, mais ici, c’était plutôt simple. Néanmoins, j’ai réalisé un petit générateur d’astéroïdes, principalement pour me prouver que je pouvais le faire :

J’avais précédemment fait un générateur de terrain, mais il ne fonctionnait correctement que sur des terrains à peu près plats : (regardez le bug sur la colline !)

Le terrain était composé de tuiles, qui se suivaient tant que le joueur bougeait, permettant de parcourir des distances infinies sans problème de performances. Mais malheureusement,  ça ne marchait que sur les terrains plats, et par extension les mondes plats.

Il fallait quelque chose qui marcherait pour les planètes rondes, et là, ça s’est compliqué.

Si vous regardez sur internet des systèmes de génération de terrains procéduraux, 99% sont pour des terrains plats. Il y a très très peu de projets qui ont résolu le problème de la génération de planètes, et ceux qui l’ont fait était bien trop complexes où inadaptés.

Je commençais à me dire que cela allait être beaucoup plus dur que prévu. Mais le jeu ne pourrait pas vivre sans un système de terrain; aussi j’ai mis tout mon possible dans cette tâche et j’ai réalisé quelque chose, qui, au moins, ressemblait à du terrain, et c’était rond.

Il y avait même une atmosphère. Cela a été fait avec les shaders de « dispertion atmosphérique », rendus accessibles par quelqu’un au nom de Sean O’Neil, qui a posté un article à propos de ce sujet sur un magazine appelé  « GPU Gems ». Grâce à ça, il y avait quelques shaders atmosphériques pour tous usages. J’ai eu du mal à les configurer, mais après quelques temps passés à bidouiller, voilà le résultat :

Le système de terrain marchait à peu près similairement au système de tuiles évoqué précédemment. Il utilisait une bibliothèque nommée LibNoise, que vous pouvez télécharger, et auquel j’ai trouvé une version pour Unity, qui vous donne facilement un terrain généré par bruit. Il peut faire des choses extraordinaires, ne vous inquiétez pas au sujet des performances.

Dans un monde plat, convertir ce bruit numérique en terrain est plutôt simple.

On obtient une valeur de bruit par LibNoise pour chacun des points du monde, et on pousse des sommets aussi hauts que cette valeur.

Cependant, pour une planète, ce n’est pas aussi simple. Pour commencer, « haut » est un terme très relatif avec les objets ronds, donc on ne pouvait plus bouger les sommets ‘vers le haut’ comme précédemment. Il fallait les ‘pousser’ depuis le centre de la sphère vers son opposé. Ok, pas trop dur, mais si vous avez des tuiles carrées, comment les emballer autour de la sphère ? Vous avez déjà essayé d’emballer un ballon de football avec du papier cadeau ? C’est à peu près le même problème.

Ma ‘solution’ était de ne pas utiliser de tuiles du tout, mais un seul gros disque, que j’ai créé dans 3Ds Max. Il a été tessellé en plusieurs étapes , donc le centre avait une plus grande densité en polygones que les bords :

L’idée derrière tout cela était que le disque deviendrait plus large si vous montez, et plus petit si vous descendez.

Il marchait, mais il y avait un gros problème. Le disque avait à peu près 19 000 sommets, et seul, Unity arrivait à le mettre à jour à chaque image. Le problème était qu’il fallait le rendre matériel, et le fait que l’on puisse occasionner des collisions avec (atterrissage, …) était impossible. Unity va plutôt vite tant que l’on utilise pas de système de collision sur des choses qui changent de forme, et c’était le cas ici.

La solution était de ne laisser qu’une partie du disque matérielle en dessous du joueur. Elle était invisible, et assez petite pour pouvoir jouer sans trop de ralentissements.

Mais il y avait un autre problème. Comme le terrain était un disque, ses sommets pouvait potentiellement se retrouver quelque part dans tout l’univers, ce qui occasionnerait quelque chose d’indescriptible. Si pendant une frame un sommet se situe en haut d’une montagne, à la prochaine il pourrait se trouver à mi-lieu de sa pente, et il n’y aura plus de sommet sur le haut. Cela signifient que plus vous vous déplacerez, plus le terrain oscillera et brillera car le ‘champ’ de bruit sera plus détaillé que le mesh.

La solution que nous avons trouvé était de ne déplacer le terrain qu’au bout d’une certaine distance de déplacement. En réduisant la fréquence des mises à jour du terrain, le terrain vibrerait beaucoup moins et beaucoup plus rarement.

Donc à la fin de ce cycle de mise à jour, voici ce que nous avons :

Nous utilisions 2 disques. Un pour le terrain, un autre pour l’eau. Les textures étaient gérées par un shader que j’avais trouvé et que j’avais modifié pour qu’il fonctionne correctement. Sur cette image, vous pouvez voir quand le disque de terrain s’arrête, et que la vue lointaine de la planète commence.

Ce système était une autre solution que nous avons trouvé. Comme le disque de terrain était fini, il fallait pouvoir afficher une représentation plus simple de la planète après ce disque. Cela a été résolu en plaçant une sphère texturée en dessous du terrain, et en la générant avant le terrain. Ceci, couplé avec un shader qui simplifie visuellement le terrain le plus éloigné, réalise la première version d’un système de terrain planétaire potable.

C’est tout pour cette chaîne d’articles, qui malheureusement a une fin comme les bonnes choses…

Nous espérons que vous avez apprécié cette série, et on vous dit à bientôt pour de nouveaux articles !

Source : kerbalspace.tumblr.com

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *