La première question que nous nous sommes posés a été de savoir comment concevoir un terrain en 3D. Notre objectif premier était de concevoir un terrain plat, et d’insérer une caméra afin de pouvoir se déplacer librement sur le terrain (grâce aux touches du clavier).
CLAVIER
Tout d’abord, l’implémentation de la caméra et la gestion des touches du clavier ont été intégrés au projet en tant que « services ». Ces services seront appelés dans la fonction « Initialize » du fichier Game.
Concernant le clavier, nous avons donc implémenté deux fonctions primordiales :
CAMERA
Dans notre jeu, le plan horizontal est défini par les axes X et Z (l’axe Y représentant l’axe vertical). Pour pouvoir afficher le terrain, XNA a besoin de plusieurs matrices : une première pour représenter la position d’un objet dans un espace 3D, une deuxième pour représenter la matrice de vue de la caméra (ce qui veut dire, sa position et son orientation), et une troisième pour indiquer comment les points en 3D seront transformés dans l’espace 3D (matrice de projection). Par conséquent, le service de gestion de la caméra devra gérer efficacement ces deux dernières matrices.
La caméra se définit par deux paramètres : un point dans l’espace (sa position), et un point qu’elle cible dans l’espace (sa cible). Il sera donc important de calculer le vecteur d’orientation de la caméra à partir de ces deux paramètres, ceci afin que la caméra soit bien orientée comme nous le souhaitons.
Après avoir implémenté ces données ainsi que le calcul de la matrice de projection, il est désormais possible de mettre à jour la position de la caméra (et donc la vue) lorsque l’utilisateur se déplace avec les touches du clavier. Cela s’effectue dans la fonction « Update » du fichier Game.
Les différentes fonctionnalités implémentées sont les suivantes :
- Déplacement de la caméra à partir des touches directionnelles (Haut, Bas, Gauche, Droite)
- Elévation de la caméra (touches PageDown et PageUp)
- Bridage de la hauteur de la caméra, afin que la caméra ne puisse pas aller trop haut ou ne puisse pas descendre en dessous du terrain.
Après avoir géré cela, on calcule à nouveau la matrice de vue.
TERRAIN
Tout ce qui est affiché dans un jeu XNA est à base de vertex (ou vertices, au pluriel). Pour expliquer très simplement ce qu’est un vertex, on peut dire qu’il s’agit d’un sommet d’une forme. De cette façon, à partir de ces vertices, on peut dessiner soit des points (un vertex), soit des lignes (deux vertices), soit des triangles (trois vertices). Il faut savoir que DirectX (et donc XNA) ne peut dessiner que ces trois objets. On sera donc limité à des formes de 3 vertices maximum !
Comment peut-on alors dépasser cette limitation ? C’est cette question qui nous pousse à créer ce que l’on nomme des « mesh » (traduit en français par « maille »). Concrètement, un mesh est un objet tridimensionnel, sous forme de fil de fer, composé de polygones. Puisque sous XNA nous avons, au mieux, des triangles, il est important de bien cerner le principe des mesh. En effet, nous pouvons considérer, sous XNA toujours, qu’un mesh correspond à la concaténation des différents triangles, lignes ou points.
Dans l’exemple ci-dessous, on voit très clairement la composition d’un mesh. Chaque carré le composant est composé de 2 triangles.
Un nouveau problème se pose alors. En effet, un vertex peut faire partie de un, deux, trois, quatre, cinq ou même six triangles. Nous allons alors faire appel à un nouveau concept: les indices. A ce moment, il est important de différencier le vertex et l’indice : le vertex représente un point présent dans un espace, l’indice représente ce point pour chaque triangle sur lequel il se trouve. Ainsi, si l’on veut créer 16 triangles, il y aura 15 vertices et 48 indices.
Par la suite, on crée les vertices et les indices, avec leurs caractéristiques, et on dessine ainsi les différents triangles qui vont composer le terrain. Par la suite, on utilise la fonction « Draw » du fichier Game pour dessiner les vertices et les indices : notre terrain est créé !!!
TEXTURE
Après avoir créé le terrain, il faut maintenant plaquer une texture sur ce terrain, afin de lui donner belle allure. Il suffit d’insérer le fichier image dans le dossier Content, et de le charger dans l’application. Ensuite, la méthode Draw se charge de dessiner la texture sur le terrain. Le résultat est le suivant :
RELIEF
Nous avons maintenant un terrain texturé, mais il manque une donnée importante : le relief. Pour ce faire, il existe différentes techniques, et nous nous sommes intéressés aux fichiers « .fx ». Ces fichiers contiennent des paramètres sur l’allure que prendra le terrain, sous la forme de « techniques » que l’on peut charger directement dans l’application. Nous avons essayé d’implémenter un relief intéressant, mais nous n’avons pu obtenir qu’un résultat assez banal : chaque vertex de notre terrain voyait sa position sur l’axe Y augmentée.
Notre objectif étant d’obtenir un relief variable à certains endroits, nous avons choisi de laisser cette idée de côté et de rechercher une autre méthode.