Projet Alita

ou comment une équipe de futurs ingénieurs ont appris à réaliser un jeu video

AABB et OOBB

Posted by Florian Gutierrez sur décembre 15, 2008

Comme nous l’avons vu dans l’article précédent, l’étape suivante de notre projet est d’implémenter des personnages. Dès lors, plusieurs difficultés apparaissent. Principalement, il est necessaire de gérer les collisions, que ce soit entre le modèle et le terrain, ou entre deux modèles.

L’objet de cet article est de préparer la gestion de collision entre deux objets. XNA nous propose deux solutions: les BoundingSphere et les BoundingBox. Le second est, comme son nom l’indique, une boite englobante. Celle ci englobe le modèle. Cette boite est définie par un point maximum, et un point minimum. De fait, une faiblesse important apparait: lorsque notre objet est modifié par une rotation, par exemple, la boite reste alignée sur les axes. C’est pourquoi on la nomme AABB (Axis Aligned Bounding Box).

Pour palier à celà, quelles solutions avons-nous ? Dans un premier temps, il existe le principe de BoundingSphere. Sur le même principe que précédemment, cette sphère englobe l’objet. Seulement, dans le cas d’un arbre, par exemple, on s’apperçoit que le rayon va être déterminé par la hauteur, alors que la largeur sera excessive par rapport au modèle.

C’est ce qui nous pousse à utiliser un nouveau concept: l’OOBB (Object Oriented Bounding Box), parfois nommé OBB (Oriented Bounding Box). C’est cela principe que nous allons mettre en place en sein de notre projet.

Posted in Uncategorized | Tagué: , , , , , , | Leave a Comment »

Bilan – Semestre 1

Posted by Guillaume Gas sur décembre 14, 2008

Le premier semestre s’achève, il est donc temps de faire le bilan des tâches effectuées…

Sur le tableau ci-dessous, figurent les tâches effectuées dans les temps (en vert), les tâches qui n’ont pas pu être finalisées à temps (en rouge) et les tâches qui sont à faire pendant le second semestre (en blanc).

planningprojet3d

Au terme de ce premier semestre, l’équipe du projet Alita a réussi à concevoir la base de l’application souhaitée, à savoir le terrain, la texture et le relief. Il a été nécessaire, dans un premier temps, de prendre connaissance avec les nombreux et différents concepts de programmation, ce qui a demandé un certain temps et qui a, du même coup, provoqué un léger retard dans le planning.

Concernant l’implémentation des objets 3D, l’équipe a mis d’abord un certain temps pour se familiariser avec le concept en XNA. Il sera donc utile de poursuivre sur cette voie pendant le 2ème semestre.

Les phases d’ores et déjà programmées pour le second semestre sont :

  • L’insertion des personnages 3D (au format .fbx)
  • Le déplacement des personnages
  • La liaison 3D-CodeMétier (relier les objets 3D aux classes métier représentant les personnages)
  • La gestion des collisions
  • L’insertion d’un menu

Nous avons encore environ six semaines pour achever ce projet dans les temps, et pour découvrir encore de nouveaux concepts liés au framework XNA !

Posted in Uncategorized | Leave a Comment »

Intégrer les objets 3D en XNA… mais comment faire ?

Posted by Christian Couder sur décembre 14, 2008

Après avoir défini pour de bon notre terrain, il est désormais nécessaire de pouvoir intégrer des objets 3D au sein de notre environnement virtuel.

Dans un premier temps, il faut savoir que XNA permet d’intégrer différents types de fichiers, avec les extensions 3DS, RAW, FBX, etc… Dans notre cas, nous allons essayer de trouver des fichiers 3D à l’extension FBX (spécifiques aux projets XNA).

Dès le départ, notre projet a défini l’insertion de différents types d’objets 3D :

  • Personnages de différents types
  • Maisons, arbres, rochers…

L’insertion des fichiers s’effectue de la même manière que pour le skydome ou l’image de texture. Il suffit de placer l’objet 3D dans le dossier « Content » du projet, et de le charger ensuite grâce à la ligne ci-dessous :

objet3D = content.Load<Model>(« Guerrier »);

Nous avons déjà défini des classes métier correspondant à chaque type de personnage que nous souhaitons voir apparaître sur notre terrain. Notre principale difficulté est de pouvoir maintenant trouver les objets 3D correspondant à nos personnages.

Durant deux semaines, nous avons cherché le maximum d’objets 3D qui pourraient correspondre, mais la plupart étaient soit payants, soit trop complexes à intégrer, soit incohérents avec notre projet. Néanmoins, nous avons pu expérimenter l’insertion d’objets au sein de l’univers 3D.

Pour le second semestre, nous avons décidé de poursuivre les recherches d’objets 3D et de continuer à tester leur insertion. La fonctionnalité de gestion des collisions sera implémentée durant le second semestre, après la première revue de projet…

Posted in Uncategorized | Tagué: , , , , | Leave a Comment »

Un outil très pratique : le Content Pipeline

Posted by Christian Couder sur décembre 14, 2008

Je vais vous présenter ce qu’on a utilisé pour créer des objets 3D tel que le terrain ou le skydome à partir d’une texture par exemple.

Nous avons créé un projet à part avec deux classes qui sont :

TerrainProcessor.cs => Celui-ci permet de créer un terrain en 3D à partir d’une heightmap

TerrainContent.cs => Celui-ci permet de sauvegarder les données du de notre terrain. (sa taille, ses vertices,etc).

En terme de performance et de rapidité il est intéressant d’utiliser ce mécanisme que XNA car nous générerons un terrain avant de démarrer notre application 3D. Les deux fichiers seront donc une application à part que j’ai nommé Projet Pipeline. Ensuite il nous faut communiquer à notre projet les informations ainsi que l’objet 3D du terrain. On utilise un tunnel (pipeline) qui va permettre de communiquer entre les deux projets. Projet Pipeline va utiliser un ContentTypeWriter pour écrire dans le tunnel et inversement Projet3D va utiliser un ContentTypeReader pour lire les données qui ont été transférer. Voici comment ça marche :

pipeline

Notons enfin que la texture pour le terrain a été modifiée, afin d’obtenir un paysage un peu plus réaliste, ainsi que l’image formant le skydome :

3d

Posted in Uncategorized | Leave a Comment »

Concept du « Heightmap »

Posted by Guillaume Gas sur novembre 29, 2008

Après de nombreuses recherches, nous avons finalement trouvé une méthode intéressante pour la création d’un relief conforme à nos attentes. C’est là qu’est intervenu le concept du « Heightmap ».

Un « Heightmap », c’est quoi ? Il s’agit, traduction française, d’une « carte de hauteur » destinée à concevoir un relief à partir des variations de couleur. Dans notre cas, il s’agit donc d’un fichier image en noir et blanc qui représente le relief d’une carte, dont voici un exemple :

heightmap

Sur cette image, on peut distinguer des zones hautes (en blanc) et des zones basses (en noir).

On se servira donc de ce fichier pour définir l’allure que prendra notre terrain : il suffira d’utiliser un tableau à deux dimensions (largeur et longueur) qui contiendra la hauteur (donc la couleur) de chaque point de notre terrain. En gros, il va falloir matérialiser cette image sous la forme d’un tableau. La fonction suivante permet de concevoir ce terrain à partir du tableau passé en paramètres (sur lequel on a chargé le fichier image ci-dessus) :

creationrelief3d

Ainsi, nous avons finalement réussi à concevoir notre terrain, avec un relief intéressant :

relief3d

Posted in Uncategorized | Tagué: , , , , , , , , , | Leave a Comment »

Caméra, terrain, texture, relief…

Posted by Guillaume Gas sur novembre 23, 2008

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 :

  • IsKeyPressed => permet de savoir si une touche est appuyée
  • IsKeyJustPressed => permet de savoir si une touche a été appuyée puis relâchée

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 :

terrainnumber1

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.

Posted in Uncategorized | Tagué: , , , , , , | Leave a Comment »

Création d’un projet XNA

Posted by Guillaume Gas sur novembre 23, 2008

Après avoir installé le framework XNA, la création d’un projet XNA s’effectue normalement sur Visual C# :

creationprojetxna

Une fois le projet créé, certains fichiers sont créés automatiquement :

  • Program.cs => Point d’entrée de l’application
  • Game.cs => Fichier contenant les différentes sections pour le jeu

game1

Un dossier nommé « Content » est également créé pour contenir tous les documents à charger durant l’exécution du programme (image pour la texture du terrain, fichier « .fbx » pour les objets à insérer…).

content

Posted in Uncategorized | Leave a Comment »

Planning

Posted by Guillaume Gas sur novembre 23, 2008

Etant donné que nous ne disposons pas d’un grand nombre d’heures, il a été essentiel de concevoir un planning pour bien distinguer les différentes tâches à effectuer. Nous avons ensuite réparti les tâches :

Pour la fin du premier trimestre (lundi 15 décembre) :

  • Création du projet sur Visual C#
  • Création du terrain
  • Implémentation du relief et de la texture
  • Implémentation d’un skydome
  • Corrections sur l’interface graphique
  • Implémentation des objets 3D (format .fbx)
  • Déplacement des objets

Pour la fin du second semestre (lundi 2 février):

  • Gestion des collisions entre objets
  • Création d’un menu pour la gestion du jeu

A chaque fin de semestre, nous rédigerons un rapport sur ce blog.

Posted in Uncategorized | Leave a Comment »

Présentation de XNA

Posted by Guillaume Gas sur novembre 17, 2008

xna

Microsoft XNA (XNA’s Not Acronymed) désigne une série d’outils et de fonctionnalités fournis gratuitement par Microsoft, afin de faciliter les développements de jeux pour les plates-formes Windows et Xbox 360. L’objectif est de réunir un maximum d’outils en provenance de Microsoft et de ses partenaires (DirectX, Visual Studio, XACT…).

Il contient principalement un framework, des outils d’intégrations de contenu et la documentation nécessaire.

L’IDE utilisé est Visual Studio 2005 Express, et le langage natif de XNA est le C#.

La dernière version du framework XNA est la version 3.0.

Pour les développeurs et les utilisateurs de Xbox 360, XNA est une porte ouverte vers le développement indépendant : les jeux produits sont distribués via le Xbox Live, et les différents outils offerts par XNA permettent aux développeurs (et aux amateurs) de gagner un temps important et de développer d’intéressantes applications exploitant le concept de la 3D.

Le site des créateurs est disponible à l’adresse suivante : http://creators.xna.com/fr-FR. Il contient quelques exemples de jeux développés à partir de XNA, et présente quelques tutoriaux de formation.

Posted in Uncategorized | Leave a Comment »

Projet Alita

Posted by Florian Gutierrez sur novembre 15, 2008

C’est avec un grand plaisir que j’ouvre aujourd’hui le blog du projet Alita. Tout d’abord, qu’est-ce que ce projet ? Avant tout, c’est une aventure dans le monde de la 3D; aventure vécue par trois futurs ingénieurs de l’EPSI (École Privée des Sciences Informatiques) de Montpellier. Actuellement en dernière année, nous avons décidé de mettre à l’épreuve nos compétences en réalisant ce projet.

Comme beaucoup d’informaticiens, nous avions un jour rêvé de créer notre propre jeu vidéo. Mais par où commencer ? Notre première tâche a été de définir le projet: quel type de jeu vidéo nous voulons réaliser ? Sur quelle plateforme ? serait-ce un jeu en réseau ou non ? Tant de questions qui ont orienté notre démarche. Ainsi, je vais présenter tous ces choix que nous avons effectués.

Le point suivant a été de définir les technologies que nous allions utiliser. Si nous avons l’habitude de développer pour des ordinateurs (Windows et Linux), nous n’avons jamais eu l’occasion de déployer une application sur une console de jeu. Sur cette dernière, les ressources étant limitées, les contraintes sont plus importantes que ce à quoi nous avons été habitués. Cela dit, il nous a paru extrêmement intéressant d’apprendre à créer un jeu pour console. Après quelques recherches sur internet, nous sommes tombés sur une série d’outils gratuits, proposés par Microsoft et ses partenaires. XNA, c’est le nom de cet outil, permet un développement simplifié de jeux vidéos pour deux plateforme: Windows et XBox 360.

Ainsi, nous allons débuter notre apprentissage en développant pour Windows, puis nous comprendrons comment porter notre jeu sur XBox 360. Et c’est au travers de ce blog que nous vous ferons part des difficultés rencontrées et de la façon dont nous les avons résolues.

Pour commencer, quel type de jeu allons nous créer ? S’il est important de se faire plaisir, il est tout aussi important à nos yeux de ne pas être trop ambitieux pour ne pas être découragé face à l’étendu des tâches à réaliser. En lieu de MMORPG (Massivement Multiplayer Online Role Playing Game), voire même de RPG tout court, nous nous sommes mis d’accord pour développer une base de RTS (Real Time Strategy). Dans un premier temps, cela nous permettra de comprendre beaucoup de facettes de la programmation tri-dimensionelle.

Plus clairement, quelles sont les caractéristiques d’un tel jeu ? Des personnages (nommés ci-dessous « Unités Mobiles ») et des bâtiments (nommés « Unités Statiques »), peuvent être créées par le joueur. Comme dans la plupart des jeux, les unités mobiles peuvent se déplacer et attaquer les ennemis (mobiles ou statiques). Le but du jeu étant evidemment de détruire toutes les unités ennemis avant qu’elles ne détruisent celles du joueur. En termes de 3D, on voit clairement apparaître plusieurs phases. Tout d’abord, il faut créer un terrain sur lequel les unités évolueront. Ensuite, les unités devront être créées et positionnées à la surface de ce terrain.

Avant de gérer les collisions entre les différentes unités, il est important que les unités mobiles aient la possibilité de se déplacer. Cela sera possible après avoir permis au joueur de séléctionner l’unité (ou les unités). Le joueur décidera ensuite à quel endroit l’unité devra aller, au travers d’un menu affiché directement sur l’écran.

Posted in Uncategorized | Tagué: , , , , , | Leave a Comment »