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 :

Les pré-requis sont :

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

Affichage d'un point :
glVertex3f(1.0,1.0,1.0); // ( x , y , z )

Affichage d'une surface :
glBegin(GL_POINTS); // GL_LINE ou GL_POLYGONE
    glVertex3f(1.0,1.0,1.0);
    ...
glEnd();

Gestion de la couleur des objets :
glColor3f(float r, float v, float b);

Gestion du placement des objets :
glTranslatef(x, y, z); // translation
glRotatef(Angle, x, y, z); // rotation
glScalef(x, y, z); // mise à échelle

Description de la caméra :

Perspective de la caméra :
gluPerspective(45.,1.,near,far);
    - angle d’ouverture
    - ratio largeur/hauteur
    - domaine validité de la profondeur z

Orientation de la caméra vers une position cible :
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 :

Mise en œuvre de l’éclairage :
glEnable(GL_LIGHTING);

Activation de la source de lumière 0 :
glEnable(GL_LIGHT0);

La position de la caméra, sa direction, l'ouverture du spot ainsi que le coefficient d'atténuation avec la distance peuvent être modifiés.

Description de la texture :

Activation du placage de texture :
glEnable(GL_TEXTURE_2D);

Indication de la texture à appliquer :
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 :

    - Création un acteur lumière : CLumiere lum = new CLumiere();
    - Positionnement : placerEn(x,y,z);
    - Ajout au final à l'espace : ajouteLumiere(lum);

Gestion des objets :

    - Création d'un objet solide sphérique : CSolide terre = new CSolideSphere(d);
    - 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 :

    - Appliquer une texture à un objet : terre.texturerAvec("textures/terre.jpg");

Gestion de la caméra :

    - Renvoi l'instance de la caméra courante : cameraCourante();
    - 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:

Durant la présentation ont eu lieu deux démonstrations du mini moteur 3D. Une montrant la gestion de plusieurs objets dans l'espace par l'affichage de plusieurs objets sphériques, des effets de lumières et l'application de textures sans déplacement de caméra. Dans la seconde présentation la caméra effectuait des déplacements, ainsi que les autres acteurs de la scène (translations et rotations).
Pour obtenir les sources de mon mini moteur 3D, vous pouvez me contacter par mail : alidroid292@gmail.com.