|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
TUTORIAL 1: THE 3D ENGINE |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
INTRODUCTION
Premièrement, il est nécessaire d’expliquer le principe de d’un moteur
3D. La réponse est relativement simple: un moteur 3D est un ensemble de structures, fonctions et algorithmes utiliser
pour visualiser, après de nombreux calculs et transformations des objets 3D
sur un écran en 2D. Les 3 parties principales d’un moteur 3D sont: 1-L’aquisition des données
des objets dans des structures 2-Les transformations de
position des objets dans le monde 3-Le rendu de la scène
sur l’écran 2D C’est pourquoi nous existons… allez maintenant au taf ! Dans cette leçon, nous verrons comment définir les structures principales
pour tracer un objet 3D.
LES VERTICES
Supposons que l’on ai un objet et que l’on veuille le montrer sur un écran
en 2D. Afin de le réaliser, il est nécessaire d’obtenir des informations a
propos de sa structure. Comment
faire? Premièrement, on définit des points clés : les
vertices de l’objet. Chaque vertex est composé de 3 coordonnées x, y et z.
Chaque coordonnée doit être exprimée travers une variable FLOAT ou DOUBLE,
car nous avons toujours besoin de la meilleure résolution pour rendre la scène.
Cette solution est utilisée dans tout moteur 3D mais n’est pas sans défauts,
en effet on perd de la précision pour des valeurs numériques trop élevés.
Cela limite l’espace dans lequel la simulation évolue. Dans un simulateur
spatial on peut éventuellement faire face a ce problème. En bref pour définir
un vertex en C, on utilise une structure composée de 3 variables x,y,z. typedef struct{
LES POLYGONES
Les polygones sont les faces de l’objet et sont composées de N vertex.
Dans la plupart des moteurs 3D, les polygones sont composés de
3 vertex, en accord avec cette règle. typedef
struct{ Nous déclarons aussi une variable tableau
polygon_type qui sera remplie par tous les polygones qui constitue
l’objet #define MAX_POLYGONS 2000 Mais… attention ! Notre définition assigne 3 vertices à chaque
polygone et ces vertex ne sont pas partagés avec les autres polygones. En
effet, si l’on réfléchit un peu nous allons voir que chaque polygone
d’un objet partage en fait ses cotés, et aussi ses vertices avec les autres
polygones. Donc nous avons fait une erreur ! Bon, c’est pas vraiment
une erreur, mais nous avons augmenté considérablement le nombre réel de
vertex de la scène bien plus que de nécessaire. On a déjà dit que le
moteur utiliserait les vertex pour faire ses calculs donc on devrait vraiment
trouver une autre méthode pour définir nos polygones. On pourrait créer une
liste de vertices qui contiendrait l’ensemble des vertices de l’objet.
Afin de définir les polygones, on utilisera une sorte de schéma de références
qui pointe sur les vertices de la liste. On déclare maintenant un tableau de
type vertex_type qui contiendra MAX_VERTICES vertices. #define MAX_VERTICES 2000 La structure polygone ne contiendra plus les vertices mais seulement 3
nombres qui pointent sur 3 éléments de la liste des vertices. Dans ce sens,
plus de polygones peuvent pointés sur le même vertex. Cela optimise
grandement le design du moteur. typedef struct{
L’OBJET On effectue ici un peu de nettoyage, et on organise les définitions précédentes
dans une structure que l’on appelle obj_type typedef struct{ C’est la seule définition de base. Plus tard, on ajoutera plus de champs
qui identifierons la position, rotation et état de l’objet. A ce point nous pouvons déclarer la variable objet et remplir la liste des
vertices. obj_type obj; obj.vertex[0].x=0; obj.vertex[0].y=0; obj.vertex[0].z=0;
//vertex v0
La liste des polygones doit être remplie comme suit: obj.polygon[0].a=0; obj.polygon[0].b=1;
obj.polygon[0].c=4; //polygon v0,v1,v4 On doit garder à l’esprit que pour définir les polygones proprement, il
est nécessaire de toujours utiliser la même direction sens des aiguille
d’une montre ou sens inverse pour tous les polygones de la scène. On verra
dans le prochain tutorial, comment la direction est utilisée pour déterminer
si le polygone est visible ou pas. Donc faites très attention à la façon
dont vous définissez les polygones ou nombres d’entre eux ne seront pas
visibles. On utilisera ici la méthode sens inverse des aiguilles (par exemple
le premier polygone est définit par v0,v1,v4 ou v1,v4,v0 ou v4,v0,v1 et non
pas par v1,v0,v4 ou v0,v4,v1 ou v4,v1,v0).
UNE AUTRE METHODE PLUS ELEGANTE POUR
DEFINIR NOTRE OBJET En C/C++ on peut remplir la structure obj_type de cette façon plus élégante:
On peut également noter que les coordonnées de vertices de 0,1 à 10, -10.
Cela est intentionnel, en effet, on a besoin d’avoir le centre de l’objet
à 0,0 (on comprendra pourquoi dans le prochain tutorial). Notre objet est également
20 fois plus gros (pour faciliter la manipulation des coordonnées).
CONCLUSIONS C’est tout pour cette leçon. Dans la suivante, on commencera par utiliser
OpenGL pour afficher notre cube à l’ecran. Si vous avez des doutes ou
trouvez des erreurs n’hésitez pas à me contacter
info[at]spacesimulator.net (en anglais svp) SOURCE CODE Téléchargez le code source ici: C/C++ source code
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
©2000-2003 Damiano Vitulli. All Rights Reserved. No Portion Of This Site May Be Reproduced Without Permission. Best viewed at 1024x768. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||