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
III
Gestion de la caméra
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é. |
|
|
|
|
|
|