Les bases de la programmation 3D
L’indispensable théorie
Avant de se lancer corps et âme dans la création d’une scène en 3D avec XNA, il est bon de s’intéresser à quelques notions théoriques, faute de quoi vous risqueriez de ne pas vraiment comprendre le code que vous écrivez. Le système de coordonnées Après avoir lu (et pratiqué !) tous les chapitres précédents, vous connaissez maintenant par cœur le système de coordonnées qui est utilisé par XNA pour les scènes en deux dimensions : l’origine est dans le coin supérieur gauche de l’écran avec les axes représentés tels que sur la figure 12-1. =Labat FM.book Page 259 Vendredi, 19. juin 2009 4:01 16 Les bases de la programmation 3D Développement XNA pour la XBox et le PC 260 Lorsqu’il s’agit de 3D, une nouvelle composante (Z) vient s’ajouter aux deux autres (X et Y). Celle-ci représente la profondeur. Il existe deux types de systèmes de coordonnées pour représenter ces trois axes : le repère main gauche et le repère main droite. La différence entre ces deux repères est la direction de l’axe Z. Essayez : alignez vos mains sur l’axe X, le bout de vos doigts pointant vers la droite, relevez vos doigts (sauf le pouce) dans la direction de l’axe Y et enfin, écartez le pouce du reste des doigts, ce dernier vous donne la direction de l’axe Z. Concrètement (et pour vous éviter de vous casser le poignet), dites-vous que dans le repère main gauche, les valeurs de Z augmentent lorsque vous partez de l’écran vers un point éloigné de vous. Dans le repère main droite, c’est tout simplement l’inverse ; plus les points sont loin de vous, plus les valeurs de Z diminuent (figure 12-2). XNA utilise par défaut le repère main droite, donc plus la valeur de Z d’un objet est petite, plus il est loin de vous. Construire des primitives à partir de vertices L’élément le plus simple qui compose une scène 3D est le vertex (au pluriel, vertices). Le terme vertex est souvent traduit par sommet, or dans XNA, un vertex est bien plus Figure 12-1 Système de coordonnées 2D Figure 12-2 Repère main gauche et repère main droite =Labat FM.book Page 260 Vendredi, 19. juin 2009 4:01 16 Les bases de la programmation 3D CHAPITRE 12 261 qu’un simple point de l’espace, il contient d’autres informations telles que la couleur, la texture, etc. Lorsque l’on crée des objets en 3D, il faut non seulement spécifier la position des vertices et d’éventuelles informations, mais également préciser le type de primitive à utiliser. Une primitive définit la manière dont une collection de vertices doit être affichée. Au final, on ne dessine donc pas directement les vertices, mais les primitives. Les vertices peuvent être dessinés sous forme de points déconnectés les uns des autres, sous forme de lignes ou encore sous forme de triangles. Généralement, c’est cette dernière catégorie qui est utilisée pour dessiner n’importe quel objet. Ainsi, pour dessiner un carré, vous aurez besoin de deux triangles (figure 12-3)
Les vecteurs dans XNA
Dans XNA, il existe trois types de vecteurs : • les objets Vector2, que vous avez déjà rencontrés lorsque nous avons travaillé sur des scènes en deux dimensions ; • les objets Vector3, qui disposent en plus de la composante Z ; • les objets Vector4, qui disposent d’une quatrième composante, susceptible d’être utilisée par exemple pour contenir des informations sur la couleur. Une fois de plus, XNA nous simplifie la vie en fournissant des méthodes de calcul sur les vecteurs (notez tout de même que le fait de comprendre les aspects mathématiques qui se cachent derrière ces fonctions ne peut être que bénéfique). Ainsi, la structure Vector3 dispose d’une vingtaine de méthodes utilitaires. Le tableau 12-2 en présente quelques-unes. Lorsque vous développerez vos premiers jeux en 3D, vous utiliserez la plupart de ces méthodes. Nom Description Illustration TriangleList Les vertices sont représentés par groupe de trois, sous la forme de triangles isolés. Figure 12-7 Les vertices sous forme de triangles isolés TriangleStrip Les vertices sont représentés sous forme de triangles connectés entre eux. Il y a un gain de performances puisque les vertices communs à deux triangles ne sont représentés qu’une fois. Figure 12-8 Les vertices sous forme de triangles connectés entre eux TriangleFan Les vertices sont une nouvelle fois représentés sous forme de triangles, et tous ces triangles ont un vertex en commun. Figure 12-9 Les triangles ont tous un vertex en commun Tableau 12-1 Primitives 3D (suite) Tableau 12-2 Principales méthodes de calcul sur les vecteurs Méthode Description Add Effectue la somme de deux vecteurs. Substract Soustrait un vecteur à un autre. Distance Calcule la distance entre deux vecteurs. Les matrices et les transformations Les matrices constituent l’outil mathématique indispensable pour effectuer : • des rotations, pour faire tourner un objet autour d’un ou plusieurs axes ; • des mises à l’échelle, que cela soit pour agrandir ou diminuer la taille d’un objet ; • des translations, c’est-à-dire déplacer un objet. Les matrices sont des tableaux de données à deux dimensions. Dans XNA, ce tableau contient 4 lignes et 4 colonnes, et il est représenté par la structure Matrix. Comme toujours, XNA nous simplifie le travail. Même si vous n’avez jamais entendu parler de matrices et que vous ignorez tout des règles de calcul qui s’appliquent, vous ne serez pas gêné dans leur manipulation. Gérer les effets sous XNA La gestion des effets (qu’il s’agisse de la lumière ou de techniques de rendus plus complexes) est un point crucial dans la réalisation d’un jeu. Au chapitre suivant, nous verrons comment créer des fichiers dédiés aux effets en HLSL (High Level Shading Langage). Pour l’instant, nous allons nous concentrer sur le maniement de la classe BasicEffect qui mettra à disposition tout le nécessaire pour un premier jeu. Le tableau 12-4 liste les propriétés qui vous serviront le plus. Conseil Toutefois, pour comprendre parfaitement les transformations, nous vous conseillons de jeter un coup d’œil à un cours d’algèbre linéaire. Citons par exemple : http://www.librecours.org/cgi-bin/course?callback=info&elt=562). Tableau 12-3 Principales méthodes de calcul sur les matrices Méthode Description CreateRotationX CreateRotationY CreateRotationZ Crée une matrice de rotation pour chacun des axes. Translation Crée une matrice de translation. CreateLookAt Crée une matrice utilisée pour positionner la camera en définissant son emplacement et la position vers laquelle elle est tournée. Propriété Effet LightingEnabled Si elle est définie à false, la scène possède une source de lumière qui illumine toutes les faces de tous les objets, sinon, la source de lumière sera celle définie par l’effet. AmbientLightColor Cette propriété permet de définir la couleur de la lumière ambiante qui illumine de la même manière toutes les faces de tous les objets si la propriété LightEnabled est définie à true. DirectionalLight0 DirectionalLight1 DirectionalLight2 Ces propriétés définissent des lumières directionnelles qui seront utilisées seulement si la propriété LightingEnabled est définie à true. FogColor FogStart FogEnd Ces propriétés font apparaître du brouillard sur les scènes. Spécifiez la couleur du brouillard, ainsi que la distance où il commence et où il se ter mine.
Comprendre la projection
Comment XNA transforme-t-il une scène en 3D vers une image en 2D que votre écran pourra afficher ? C’est le principe de la projection, le but étant d’obtenir la même image que ce que nos yeux verraient si nous étions dans la scène. XNA supporte deux types de projection : • La projection en perspective est la plus couramment utilisée. Dans ce type de projection, l’ensemble des objets présents dans un volume en forme de pyramide tronquée (défini par un plan proche (near plane), un plan éloigné (far plane) et un angle appelé champ Tableau 12-4 Principales propriétés de la classe BasicEffect Propriété Effet LightingEnabled Si elle est définie à false, la scène possède une source de lumière qui illumine toutes les faces de tous les objets, sinon, la source de lumière sera celle définie par l’effet. AmbientLightColor Cette propriété permet de définir la couleur de la lumière ambiante qui illumine de la même manière toutes les faces de tous les objets si la propriété LightEnabled est définie à true. DirectionalLight0 DirectionalLight1 DirectionalLight2 Ces propriétés définissent des lumières directionnelles qui seront utilisées seulement si la propriété LightingEnabled est définie à true. FogColor FogStart FogEnd Ces propriétés font apparaître du brouillard sur les scènes. Spécifiez la couleur du brouillard, ainsi que la distance où il commence et où il se ter mine. de vision (FOV, pour field of view)) sont projetés vers le sommet de la pyramide (figure 12-10). Ainsi, plus un objet est éloigné de la caméra, plus il semble petit, et inversement. • La projection orthogonale, aussi appelée projection parallèle. Dans ce type de projection, la composante Z est ignorée, c’est-à-dire qu’un objet éloigné de la caméra semblera aussi gros que s’il était tout proche de celle-ci.