Mandragor


Le calcul des lumières

Tant qu'à faire des maths, autant régler une bonne fois pour toute le problème du calcul des lumières.

En général on considère que l'intensité résultant de la rencontre d'un point avec un faisceau lumineux est calculée en fonction de l'angle que fait la direction du faisceau avec la normale au point.

Je vais aborder ici deux types de lampes : les ambiances et les lampes ponctuelles. Avec ça vous avez déjà largement de quoi vous amuser et en général les moteurs classiques n’utilisent pas autre chose.

La lampe de type ambiance est la plus simple que l’on puisse imaginer : quelle que soit la position de la lampe, quelle que soit la position du point, et quelle que soit la direction entre la lampe et le point, le résultat est toujours le même : on augmente ou on diminue la luminosité du point, c’est tout. Bref cette lampe porte bien son nom, c’est l’ambiance lumineuse de la scene.

On peut faire des ambiances colorées, préciser que l’ambiance est rouge par exemple, ce qui reviendra à augmenter la valeur de rouge de la couleur du point sans toucher ni au vert, ni au bleu.

Un calcul classique c’est:

Rouge=Rouge+AmbianceRouge;
Vert=Vert+AmbianceVert;
Bleu=Bleu+AmbianceBleu;

Et puis on fait des tests pour vérifier que l’on a pas dépassé la valeur maximale (ou minimale, les ambiances négatives ça existe).

La lampe de type ponctuel est un peu plus intéressante. En fait elle aussi possède une couleur, mais la couleur n’est pas rajoutée telle quelle au point, comme pour l’ambiance, on la rajoute, mais multipliée par un facteur k, inférieur à 1 :

Rouge=Rouge+k*LampeRouge;
Vert=Vert+k*LampeVert;
Bleu=Bleu+k*LampeBleu;

Comment calculer k ? C’est simple, il suffit de prendre pour valeur le produit scalaire de la direction de la lampe avec la normale du point, et de changer le signe.

k= -(normalx*dirx+normaly*diry+normalz*dirz) ;

k est calculé en faisant le produit scalaire entre la normale au point (la flèche noire) et la direction de la lumière (la flèche rouge).

Si la normale du point « regarde » la lumière, alors l’intensité sera maximale, alors que si la normale est perpendiculaire à la direction de la lumière, l’intensité sera nulle, ce qui correspond bien à la notion instinctive de la réflexion de la lumière sur une face.

normalx,y et z sont des informations que le point doit connaître, tandis que dirx,y et z doit être calculé en fonction du point et de la position de la lampe. C’est un calcul qu’on peut faire comme suit :

distance=racine((pointx-lampex)²+ (pointy-lampey)²+ (pointz-lampez)²);
dirx=(pointx-lampex)/distance;
diry=(pointy-lampey)/distance;
dirz=(pointz-lampez)/distance;

Vous constaterez que ce calcul est un rien lent, il demande une racine carrée et des tats de calculs souvents en flottants, c’est pourquoi bien souvent on ne considère que des lampes se trouvant à distance infinie. L’avantage ? La direction ne dépend plus de la position du point, il s’agit d’un renseignement intrinsèque à la lampe.

A ces resultats on peut éventuellement rajouter une valeur si le matériau possède une « couleur d’ambiance », et des trucs du genre, à vous de voir comment vous programmez vos matériaux.

Il existe bien sûr des tas de « trucs » pour augmenter la vitesse de ces calculs, et il existe également des tas d’autres type de lampes, à vous de les découvrir =).

Au final, chaque sommet de la face pourra avoir une intensité de couleur différente, ce qui nous permettra d’avoir la possibilité de faire un beau dégradé. Un moteur plus simple, lui, se contentera d’un calcul de normale par face, ce qui rendra la face unie. Une sphère éclairée donnera alors un effet « boule à facettes », alors que dans notre cas le dégradé sera continu.

au lieu de