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++ | 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 :

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++ | 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 !

La méthode "classique" pour modifier l'une des composantes de cette structure est la suivante :
Code : C++ | 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++ | lumiere->getLightData().SpecularColor = irr::video::SColorf(0.6, 0.0, 0.0, 1);
|
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++ | Nroom->getMaterial(0).Shininess = 20.0f;
|
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.