Accueil

TODO section


U.W.R project

Download Section

ScreenShots

Contact Section

Member Section


Untitled Document
Moteur Graphique & Sonore
   
 

I Gestion de l’affichage

II Conception des objets 3d

  • les maps

III Gestion de la caméra

  • Niveau objet
  • Niveau type

IV Gestion de la lumière

V Gestion du son

Gestion de l’affichage

On utilise direct3d pour tout ce qui concerne l'affichage, alors il y a des milliers de possbilités et de fonctions associées à direct3d. Pour l'instant notre moteur est en fait un loader de mesh, c'est à dire au lancement du programme il charge des objets3d ( extension .x) et les textures qui leur sont associés. Ensuite chaque objet est défini par une matrice 4*4 (ie un quaternion), pour plus de clarté j'ai associé un vecteur position et un vecteur orientation à nos objets, car il est un peu difficile de manipuler directement les matrices.

Qu'est ce qui va se passer ?

A chaque boucles du jeu, le moteur physique calcule les nouvelles positions de chaque objets, ainsi que la position de la caméra. Ensuite il faut déplacer ces objets, pour cela on va utiliser des matrices de rotation et de translation, le code source étant assez détaillé sur cette partie, je vous invite à y jeter un coup d'oeil. Si vous ne comprenez rien de ce que je raconte et n' imaginiez pas que les matrices existaient en dehors des films, laisser tomber ou potasser un cours d'algèbre. J'expliciterais plus cette partie un de ces jours.
Lorsque l'on connait la nouvelle position des objets, on demande à directx de les afficher et voilà le travail. L'avantage de cette méthode, c'est qu'on ne ce prend pas trop la tête par contre on ne sait pas vraiment ce qu'il se passe derrière donc ca risque d'être difficile à optimiser...éternel pardoxe.

Qu'est ce qu'il reste faire ?

Essayer de comprendre un peu mieux comment, ça marche tout ça pour optimiser un peu.

 

 
Conception des objets 3d

Comme je viens de le dire, on va utiliser direct3d donc quoi de plus logique que d'utiliser l'extension .x des fichiers directx. C'est tout bénef pour nous, car si j'ai bien lu cette extension est sous licence libre, alors pourquoi s'embêter. Le seul problème c'est qu'il n'existe pas de logiciel gratuit permettant de créer des .x et au niveau des logiciles hors de prix même le célèbre 3ds ne le permet pas. Que faire ? On peut toujours ce procurer 3d canvas pro qui permet d' importer et d'exporter des .x et surtout qui ne vaut qu'une quarantaine d'euros. Mais si vous êtes très très pauvre comme moi, vous pouvez toujours modifier les .x à la main, j'allais vous d'écrire comment faire, mais c'est tellement chiant que je laisse tomber. Je pense que je vais économiser ou faire la manche, parce que c'est vraiment trop long. Par contre il existe souvent des plugins ou des petits programmes pour convertir des .3ds et autres en .x. Par exemple, vous pouvez télécharger conv3ds qui permet de convertir un fichier 3ds en fichier directx. Au sujet de la conception proprement dite des objets vous êtes complètement libre, mais sachez qu'il est inutile de faire des batiments comportant 12 millions de polygones car on mettra deux siècles à les afficher, il faut essayer de trouver le meilleur compromi entre rendu visuel et le frame rate.

 

Les maps

Si vous ouvrez le répertoire maps vous y trouverez deux fichiers :
  • .ldo : ce fichier contient la liste des objets utilisés dans la map. Editer grâce à wordpad ce fichier. Vous trouverez quelque chose de ce type :

    16
    1,objets/decors/road.x,2.0,1.0,1.0,
    2,objets/decors/roadpavementw.x,5.0,1.0,1.0,
    ...

    le premier nombre (16) correspond au nombre total d'objet contenu dans le fichier, à l'avenir cette ligne disparaitra, on calculera au moment de l'ouverture le nombre de ligne. Donc notre liste contient 16 objets.
    ensuite on rempli les lignes de la manière suivante :
    id_objet , chemin et nom de l'objet, longuer ,lageur , hauteur.

    Avec id_objet = le nombre qui identifie de manière unique l'objet
             chemin   = le chemine du répertoire contenant l'objet
             nom       = nom de l'objet
    longeur, largeur,hauteur  correspondent au paramètre de la bounding box (voir propriétés des collisions).
  • .map : ce fichier contient la liste et la position des objets de la map. En faites le premier fichier contient la liste des objets utilisables, qui sont chargés au lancement du programme, et le second la position des objets, on duplique après le chargement les objets qui sont utilisés plusieurs fois ainsi on ne les charge qu'une seul fois. De la même manière éditez le fichier .map, vous devriez obtenir quelque chose de ce type:

    86
    1,76.0,0.0,-12.0,1.5708,
    1,76.0,0.0,-28.0,1.5708,
    2,100.0,0.0,-44.0,1.5708,
    1,76.0,0.0,-60.0,1.5708,
    1,76.0,0.0,-76.0,1.5708,
    4,76.0,0.0,0.0,0.0,
    ...

    Le premier nombre (86) correspond au nombre total d'objet contenu dans le fichier.
    Ensuite, ca marche comme ça:

    id_objet, x,y,z,yaw,

    id_objet = c'est le même qu'au dessus. Comme vous pouvez le remarquer il peut y avoir plusieurs fois le même.
    x,y,z = coordonnées initiale de l'objet.
    yaw = c'est l'orientation des objets autour de l'axe y en radian.
    à l'avenir il y aura deux autres angles.
Voilà pour les maps, si vous voulez faire la votre il suffit de complèter les fichiers comme je viens de l'expliquer, si vous rencontrez des problèmes, contactez nous.

Le ciel, le soleil, les nuages...

Dans cette partie nous allons aborder tout ce qui concerne la création et l'affichage du ciel et des éléments qui le constituent :

  • Le ciel : J'ai étudié deux grands concepts au cour de ces derniers mois : le skyplane et le skydome. J'ai choisi de faire un skydome parce que je trouve le qu'il est plus proche de réalité ou en tout cas de l'image que l'on s'en fait. J'ai fait une page spéciale pour cette partie, cliquez ici pour y accéder.
  • Les nuages : je suis en train de lire des articles du web sur ce sujet, ça a l'air assez coton. Certains parlent de générer les nuages comme des fractales, pour l'instant je plaque une texture de nuage sur l'ensemble du dome, mais ça rend pas trop mal mais ça reste léger.
  • Le soleil : Je commence à y réfléchir, a priori je pense que le soleil est affiché comme sprite mais je vois pas trop ce qu'il faudra faire pour le rendre éblouissant.
  • La lune : Même principe que le soleil, je pense.
  • Les avions : pour l'instant, je n'ai pas eu le temps d'y réfléchir. Afficher des sprites d'avions dans le ciel ça ne me parrais pas trés compliqué, ils auraient un mouvement circulaire avec des paramètres aléatoires (comme la vitesse, l'altitude...). Par contre pour le sillon des avions, je ne sais pas encore comment faire.
 
Gestion de la caméra
  J' ai subdivisé la gestion de la caméra en deux niveaux, un niveau objet qui traitera de l'objet "caméra" dans un monde en 3d et un autre qui traitera des différentes types de caméra ( poursuite, vue de dessus...).

Niveau objet

J'ai déjà commencé à faire deux trois trucs dans cette partie, mais de toute manière directx nous donne un gros coup de main. Dans le fichier, camera.cpp vous avez plusieurs fonctions, qui permettent de positionner la caméra, définir l'angle de vue et les plans proche et lointain. Tout ce qui est placé entre les deux plans sera afficher à l'écran. Mais parfois les objets seront si petit qu'il n'est pas très utile de les afficher, par contre le ciel doit toujours être afficher alors comment faire ... et bien j'ai des idées, c'est une histoire de bloquer le buffer, enfin à vous de jouer.
 

Niveau type

Ici aussi il y a déjà pas mal de chose, cette partie ne nécessite pas réellement de compétences informatiques mais plustôt de l'imagination, vous trouverez quelques exemples ci-dessous des vues déjà implémentés. Pour chaque vue il faut préciser la position de la caméra et la position de ca cible:

  • Vue de haut :
    SetCible(MyCar.getPosition());
    SetPosition(MyCar.getPosition() + D3DXVECTOR3(1.0f,35.0f,0.0f));

    Donc la la cible c' est le centre de gravité de la voiture et la position c'est 35 unités au dessus du centre de gravité. Rappel : les coordonnées dans le monde virtuel sont X,Y,Z avec Y l'axe vertical.

  • Vue de haut avec hauteur proportionnel à la vitesse :

    SetCible(MyCar.getPosition());
    SetPosition(MyCar.getPosition() + D3DXVECTOR3(1.0f,55.0f + fabsf(MyCar.getVitesseNorme()),0.0f));

    Ici on ajoute à la hauteur la une fois la vitesse du véhicule, ce qui rappelle le premier GTA (pour les nostalgiques).
  • Vue troisième personne :

    SetCible(MyCar.getPosition());
    SetPosition(MyCar.getPosition() + D3DXVECTOR3( 40.0f * (Vx),8.0f, 40.0f* (Vy) ) );

    Avec Vx et Vy les projections de la vitesse de dérapage dans le répère lié à la voiture.

Voilà quelques exemples, il n'y a pas de limite à la création, pour crée une nouvelle vue ou modifier une vue existante, il suffit de modifier la fonction VueType() en rajoutons des cas, après il faudra modifier le fichier input.cpp pour ajouter une touche relié à votre nouvelle vue. Si vous ne compreniez rien de ce que je raconte envoyer moi un mail.

Gestion de la lumière
  Directx gère différent type de lumière, pour l'instant je ne m'en suis pas vraiment occupé donc c'est encore une question ouverte.


Gestion du son
  Directx gère le son, mais pour l'instant cette partie reste secondaire, donc je n' y ai pas encore touché.