Aller au menu - Aller au contenu

Icône Eclairage

Avatar
Mise à jour : 23/03/2011
Difficulté : Facile Facile Creative Commons BY-SA
1 621 visites depuis 7 jours, dont 46 sur ce chapitre classé 80/786
L'éclairage est une composante parfois sous-estimée dans la réalisation d'une scène 3D interactive. Elle est pourtant totalement fondamentale dans l'obtention d'un rendu de qualité, d'autant plus si celui-ci vise le réalisme (voir la référence [12-x]).

Dans ce chapitre nous allons aborder les différents types d'éclairages et scene nodes en rapport avec la lumière gérés par Irrlicht.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Lumière ambiante

Commençons par la plus facile. La lumière ambiante est la plus simple qui soit, elle éclaire tout, partout, tout le temps et avec la même intensité. Par définition la lumière ambiante n'a pas de source précise, elle provient de partout à la fois. Ce qui explique qu'elle éclaire tout avec la même intensité et qu'il soit impossible de faire des ombres avec.

Image utilisateur


Le problème avec ce type de lumière est qu'elle ne permet pas à elle seule de faire en sorte qu'on puisse distinguer les détails d'un objet. On ne voit que ses contours (s'il est de couleur unie). L'image de droite en est un exemple. On voit bien (ou plutôt on ne voit rien du tout ^^ ) que la lumière étant la même partout, il est impossible de distinguer les détails d'un objet.


Voyons maintenant le code qui permet de régler la lumière ambiante d'une scène :

Code : C++
1
sceneManager->setAmbientLight (irr::video::SColorf(1.0,1.0,1.0,0.0));

Vous l'aurez deviné, l'unique paramètre représente la nouvelle valeur de la lumière. Le dernier chiffre de la couleur n'est pas important dans ce cas précis. Il s'agit de la composante alpha, et elle ne changera rien à la couleur de la lumière ni à son intensité.

Par défaut, la lumière ambiante est égale à (0,0,0). Ce qui signifie que si vous ne rajoutez aucune source de lumière, vous n'y verrez rien du tout. En réglant la lumière ambiante à (1.0,1.0,1.0), toute la scène sera éclairée au maximum. Quelques images pour mieux se rendre compte :

Image utilisateurImage utilisateurImage utilisateur

Voyons par nous-même

Moins de parlottes, plus d'action. Passons au code et réalisons une petite scène de test pour que vous puissiez admirer vous-même le résultat. Et comme ça devient malheureusement une habitude, je vais vous donner un code dont certaines parties n'ont pas encore été expliquées dans ce tuto et ne le seront pas avant quelques chapitres.

Pour cette scène vous allez avoir besoin de 2 fichiers présents dans le dossier media du SDK : "room.3ds" qui contient un modèle 3D comme l'indique son extension, et "rockwall.bmp" qui est bien évidement une image et qui va nous servir de texture. Et maintenant le code complet :

Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <IRR/irrlicht.h>
 
int main(void)
{
    irr::IrrlichtDevice *device = irr::createDevice (
        irr::video::EDT_OPENGL,
        irr::core::dimension2d<irr::u32>(800,600),
        32,true,true,false,0);
    irr::video::IVideoDriver* driver = device->getVideoDriver ();
    irr::scene::ISceneManager *sceneManager = device->getSceneManager ();
 
    irr::scene::ICameraSceneNode *camera =                        // creation de la camera
        sceneManager->addCameraSceneNodeFPS (0,80.0f,100.0f);
    camera->setPosition(irr::core::vector3df(10.0, 50.0, -50.0)); // positionnement
 
    irr::scene::IAnimatedMesh *room =                             // chargement du modele
        sceneManager->getMesh("room.3ds"); 
    irr::scene::IMeshSceneNode *Nroom =                           // creation du node
        sceneManager->addMeshSceneNode(room->getMesh(0));
    Nroom->setMaterialFlag(irr::video::EMF_LIGHTING, true);            // sensible a la lumiere
 
    sceneManager->getMeshManipulator()->                          // parametrage de la texture
        makePlanarTextureMapping(room->getMesh(0), 0.004f);
    Nroom->setMaterialTexture(0,                                  // application de la texture
        driver->getTexture("rockwall.bmp") );

    sceneManager->setAmbientLight(                                // ajout lumiere
        irr::video::SColorf(1.0, 1.0, 1.0,0.0));
 
    while (device->run ())                                        // la boucle de rendu
    {
        driver->beginScene (true, true,             
            irr::video::SColor (255,255,255,255));
        sceneManager->drawAll ();
        driver->endScene ();
    }
 
    device->drop ();
    return 0;
}


Et voilà. Vous remarquerez qu'on a modifié un material sur le mesh de la pièce : EMF_LIGHTING. Un petit tour dans la doc nous apprend que celui-ci permet de choisir si un mesh est sensible à la lumière ou pas. Par défaut il est à "true", ce qui signifie qu'il est sensible à la lumière. Si vous ne rajoutez pas d'éclairage, il restera noir comme du charbon. En le mettant à false, le mesh n'aura que faire de l'éclairage de la scène sera visible comme en plein jour.

Dans le code ci-dessus, le mettre à true n'a pas grand intérêt puisque c'est sa valeur par défaut. Vous pouvez néanmoins le mettre à false pour tester le changement. En jouant sur le paramètre de la fonction modifiant la lumière ambiante vous pouvez régler l'éclairage comme on vient de le voir. :)

Maintenant qu'on dispose d'une scène sympa pour faire des tests, on est prêt pour passer à la suite.

Lumière diffuse

Image utilisateur

Les lumières diffuses sont bien plus intéressantes que la lumière ambiante et par conséquent... bien plus complexes. ^^ Il s'agit en fait d'une source de lumière au sens classique du terme, comme une lampe de bureau ou un spot. En pure théorie une lumière est dite diffuse quand elle est réfléchie par les objets qu'elle éclaire.

Pour reprendre l'exemple de tout à l'heure avec une lumière diffuse, regardez l'image à droite. On peut nettement voir que la lumière se réfléchit sur toutes les surfaces de l'objet, là où avec une lumière ambiante on ne voyait... rien.


La fonction de base pour ajouter une lumière diffuse sous Irrlicht est :

Code : C++
1
2
sceneManager->addLightSceneNode (0, irr::core::vector3df(0,0,0),
                               irr::video::SColorf(0.4f,0.4f,0.6f,0.0f), 100.0f);

Nous pouvons voir qu'il s'agit d'un noeud particulier qu'on ajoute (comme tous les noeuds) en passant par le scene manager. Pour connaître l'utilité de chaque paramètre, c'est par ici. Le paramètre radius notamment, sert à déterminer le rayon d'éclairage du noeud. Voici deux screens montrant le même point de vue mais avec un radius différent :

Image utilisateurImage utilisateur

On peut déjà rajouter cette ligne de code dans la scène de test que l'on vient de faire pour se rendre compte des changements. Et par exemple combiner la lumière ambiante avec celle-ci ou modifier la couleur passée en paramètre pour voir la différence.



Voyons voir maintenant ce qu'on peut faire pour personnaliser l'éclairage. La première chose à faire est de récupérer le noeud qu'on ajoute. Pour cela il faut modifier quelque peu le code précédent :

Code : C++
1
2
3
4
5
irr::scene::ILightSceneNode* lumiere = sceneManager->addLightSceneNode(
    Nroom,
    irr::core::vector3df(100,100,200),
    irr::video::SColorf(0.4f, 0.4f, 0.6f, 0.0f),
    100.0f);

Nous pouvons maintenant accéder directement au noeud créé. Il est temps maintenant d'aller mettre les mains dans le cambouis et de retourner faire un tour dans les méandres de la doc. Voici la page qui nous intéresse : ILightSceneNode. Comme vous pouvez le voir, cette classe possède 2 méthodes :
  • Le constructeur (que nous avons déjà vu)
  • getLightData

Vous vous en doutez, c'est cette deuxième méthode que nous allons regarder de plus près. Observez un peu ce qu'elle retourne : une structure de type video::SLight. Et là, sous nos yeux ébahis... des tas, que dis-je ? Des montagnes de variables paramétrables ! :waw: La méthode "classique" pour modifier l'une des composantes de cette structure est la suivante :

Code : C++
1
lumiere->getLightData().DiffuseColor = irr::video::SColorf(0.6, 1.0, 1.0, 1);

A priori même pas avoir besoin d'explications, si ? On appelle la fonction qui nous renvoie l'instance de la structure SLight associée au noeud, et on peut directement modifier l'une de ses composantes. Je vous laisse le soin d'explorer les possibilités offertes par ces paramètres, mais on va quand même s'attarder sur quelques-uns d'entre eux :



Type


Type représente le type de la lumière (sans blagues). Cette composante peut prendre 2 valeurs qui correspondent aux 2 types de lumières possibles dans Irrlicht:
  • ELT_POINT : désigne une lumière qui éclaire dans toutes les directions.
  • ELT_DIRECTIONAL : désigne une lumière qui n'éclaire que dans une direction précise. (comme un spot)
Par défaut le type est ELT_POINT. Donc la lumière éclairera dans toutes les directions.



SpecularColor


SpecularColor correspond à la couleur des spéculaires. Pour faire très simple, il s'agit des reflets de la lumière. Pour bien voir ce que cela représente regardez plutôt cette page d'un tutoriel pour Blender. Si on se contente de modifier la couleur des spéculaires de cette manière par exemple :

Code : C++
1
lumiere->getLightData().SpecularColor = irr::video::SColorf(0.6, 0.0, 0.0, 1);

Image utilisateur

On risque d'avoir des surprises, comme sur l'image de droite. La solution se trouve dans un des material du mesh. Et plus précisément dans Shininess qui permet justement de régler la taille des spéculaires.

Comme vous pouvez le voir, un code est gracieusement donné sur la page de la doc pour montrer la manière de s'en servir. Alors ne nous en privons pas.

Code : C++
1
Nroom->getMaterial(0).Shininess = 20.0f;

Image utilisateur

Et voilà. Comme vous l'aurez deviné, 20.0f représente la nouvelle taille des spéculaires.

En cherchant un peu on finit forcément par trouver le réglage qui nous convient. Voilà ce que j'arrive à faire avec ce qu'on vient de voir (image de droite). Bon évidemment des reflets sur de la pierre, ce n'est pas très réaliste. Mais ce qui compte c'est d'avoir compris. :)

Lumière émissive

Pour finir nous allons revenir à un type de lumière moins compliqué à gérer. Une lumière émissive correspond à la lumière émise par un objet. Un peu comme les autocollants fluorescents qu'on trouve... heu... je ne sais pas où d'ailleurs. Bref... toujours est-il qu'ils brillent dans le noir. ;)

Chaque mesh peut avoir sa propre lumière émissive. Il s'agit donc d'un material : EmissiveColor. Pour y accéder on va utiliser la même technique que pour changer la taille des spéculaires :

Code : C++
1
Nroom->getMaterial(0).EmissiveColor = irr::video::SColor(255,0,255,255);

Image utilisateur

On peut voir sur l'image de droite ce que donne le code au dessus. Et... c'est tout ce qu'il y a à savoir sur les lumières émissives. Je vous avais dit qu'elles seraient simples. ^^
Chapitre précédent Sommaire Chapitre suivant

Partager

10 commentaires pour "Eclairage"
Note moyenne : 3.60 / 4 (122 votes)
Pseudo Commentaire
Hors ligne Zoloom # Posté le 03/06/2007 à 15:07:34
Avatar
Flux RSS

Études : BTS IG Lyon

Que dire de plus que : Merci

Ton tuto m'a vraiment envie de continuer dans le domaine de la 3D

Merci encore et encore (vivement la partie 2!)

PS : 20/20 bien entendu ^^

"Le bonheur est un rêve d'enfant réalisé dans l'âge adulte" - Sigmund Freud
 
Hors ligne wacant # Posté le 03/01/2008 à 12:14:53
Kamehameha !
Avatar

Ville : Crepy en valois
Pays : France métropolitaine

Moi j'ai un petit probleme avec setAmbientLight.
Il me dit qu'il n'et pas un membre de ISceneManager.

Sinon 19/20

Wacant, Wacant, ça me dit quelque chose... Mais oui, c'est un pseudo que j'ai déjà vue sur la toile !
 
Hors ligne total chaos # Posté le 25/03/2008 à 20:48:36
le C++, j'en mange!
Avatar
Groupe : Bannis

"std::cout << "probleme de chargement de la texture "rockwall.bmp"" << std::endl;"
je mettrais plutot:
Code : C++ - Afficher / masquer les numéros de ligne
  1. std::cout << "probleme de chargement de la texture \"rockwall.bmp\"" << std::endl;
 
Hors ligne rolus # Posté le 07/09/2008 à 09:21:53
Avatar

que je change ou non les valeurs de setAmbietLight la luminositée ne change pas
Hors ligne kami-sama # Posté le 18/01/2009 à 04:05:23
真実はたった一つ
Avatar

très bon tuto .
 

Voir tous les commentaires