Moteurs 3D 
Developpement d'un Moteur 3D
Objectifs
L'objectif fixé était celui de développer un mini moteur 3D permettant une définition aisée de scènes et d'animations. Celui-ci devant implémenter les fonctionnalités suivantes :
- Pouvoir spécifier des objets et leur position
- Pouvoir spécifier des fichiers / textures
- Pouvoir ajouter des effets de lumières aux objets
- Pouvoir définir une ou plusieurs caméras (vue sur le monde)
- Pouvoir décrire une scène : lumières, caméra, objets, etc
- Permettre le mouvement des acteurs
Les pré-requis sont :
- un Ide pour Java (Eclipse)
- au moins le JDK v1.4
- Jogl (librairie OpenGL) v1.1.1 : https://jogl.dev.java.net/
Démarche
J'ai tout d’abord tenté de consulter quelques bons tutoriels en C++ pour l'élaboration d'un moteur 3D, cependant étant plutôt à l'aise en Java j'ai décidé de continuer mes recherches.
J'ai par la suite trouvé le site d'un enseignant proposant le développement d'un moteur 3D utilisant OpenGL en java, à ses élèves en tant que projet. Ce site contenant un guide m'a fortement aidé dans ma réflexion en ce qui concerne l'architecture et l'agencement des éléments entre eux.
J'ai également consulté un maximum de site web pour apprendre à utiliser la fameuse librairie OpenGL.
Les bases d'OpenGL
Voici un petit éventail des principales fonctions de la bibliothèque OpenGL nécessaire pour l'élaboration d'un tel moteur 3D :Affichage de points / lignes / polygones
glVertex3f(1.0,1.0,1.0); // ( x , y , z )

glBegin(GL_POINTS); // GL_LINE ou GL_POLYGONE
glVertex3f(1.0,1.0,1.0);
...
glEnd();


glColor3f(float r, float v, float b);
glTranslatef(x, y, z); // translation
glRotatef(Angle, x, y, z); // rotation
glScalef(x, y, z); // mise à échelle
Description de la caméra :
gluPerspective(45.,1.,near,far);
- angle d’ouverture
- ratio largeur/hauteur
- domaine validité de la profondeur z

gluLookAt(position,cible,haut); // (0,0,0) centre du monde
- position : coordonnées de la caméra
- cible : coordonnées de la cible
- haut : direction de la verticale caméra
Description de l’éclairage :
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);



Description de la texture :
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texName);
Plein d’autres fonctions et options : Doc de l’API : http://www.opengl.org/documentation/
Livre référence : OpenGL Reference Manual
Architecture et fonctions
Voici tout d'abord un aperçu de l'architecture du mini moteur 3D implémenté. Il existe trois principaux acteurs : Lumière, Caméra et Solide.

Chaque type d'objet Solide héritera de l'acteur Solide (classe mère). En fonction de chaque type de solide, des traitements différents seront effectués sur la surface.
Le développeur n’a pas avoir à faire avec l’API OpenGL. Tout lui est simplifié. Pour cela il a juste à manipuler les fonctions ci-dessous pour contrôler les différents acteurs.
Liste des fonctions du mini Moteur 3D
Gestion de l’éclairage :
- Positionnement : placerEn(x,y,z);
- Ajout au final à l'espace : ajouteLumiere(lum);
Gestion des objets :
- Ajout à l'espace : ajouteActeur(terre);
- Effectuer une translation de l'objet : terre.translationEns(x,y,z) ;
- Effectuer une rotation de l'objet : terre.rotation(90,x,y,z) ;
- Effectuer un changement d'échelle de l'objet : terre.echelle(0.5);
Gestion des textures :
Gestion de la caméra :
- Positionnement de la caméra : cameraCourante().placerEn(x,y,z);
- Indiquer une direction au sport de la caméra : cameraCourante().regarderVers(0.0,0.0,0.0);
Demonstrations:

