Pourquoi une face éclairée est plus claire
L’ombrage diffus donne à une surface une clarté qui dépend de l’angle entre la surface et la lumière. Une face qui regarde la lampe est claire, une face de biais est plus sombre, une face tournée de l’autre côté est noire.
C’est ce qui donne du relief à une sphère dessinée sur un écran plat.
À la fin de cette leçon
Remarque
Je peux calculer la luminosité diffuse d’un point à partir de sa normale et de la direction de la lumière.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Normale | une flèche perpendiculaire à la surface |
| Vecteur unitaire | une flèche de longueur 1 |
| Normaliser | diviser un vecteur par sa longueur |
| Produit scalaire | un nombre qui mesure l’accord de deux flèches |
| Ombrage diffus | une clarté qui dépend de l’angle avec la lumière |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La normale dit où regarde la surface
En chaque point d’une surface, la normale est une flèche perpendiculaire à elle. Sur le dessus d’une table, elle pointe vers le plafond. Sur une sphère, elle part du centre vers le point.
On donne aussi la direction de la lumière : une flèche qui va du point vers la lampe.
On normalise les deux flèches
Pour comparer deux directions, seule compte la direction, pas la longueur. On divise donc chaque flèche par sa longueur : elle devient un vecteur unitaire.
La longueur de (x, y, z) est la racine de x au carré, plus y au carré, plus z au carré. Pour (0, 3, 4), elle vaut 5 : la flèche normalisée est (0 ; 0,6 ; 0,8).
La clarté est le produit scalaire
Avec deux vecteurs unitaires, le produit scalaire vaut 1 s’ils pointent au même endroit. Il vaut 0 s’ils sont perpendiculaires, et il est négatif s’ils s’opposent.
La luminosité diffuse est ce produit, ramené à 0 s’il est négatif : une face tournée de l’autre côté de la lumière reste noire.
Exemple travaillé : de l’angle au niveau de gris
| Angle avec la lumière | Luminosité | Niveau de gris (255 fois) |
|---|---|---|
| 0 degré | 1 | 255 |
| 30 degrés | 0,866 | 221 |
| 60 degrés | 0,5 | 128 (environ) |
| 90 degrés | 0 | 0 |
| 120 degrés | 0 (négatif, ramené à 0) | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Calculer une luminosité diffuse
# Luminosité diffuse : le produit scalaire de la normale et de la lumière.
normale = [0, 1, 0]
lumiere = [1, 1, 0]
produit = normale[0] * lumiere[0] + normale[1] * lumiere[1] + normale[2] * lumiere[2]
longueur = (lumiere[0] ** 2 + lumiere[1] ** 2 + lumiere[2] ** 2) ** 0.5
print(round(produit / longueur, 3))
# Changez la lumière en [0, 1, 0], puis en [0, -1, 0] : que devient la valeur ?
Calculer la luminosité à 45 degrés
docker exec jupyter python3 -c "import math; n=(0,1,0); l=(1,1,0); k=math.sqrt(2); lum=(n[0]*l[0]+n[1]*l[1]+n[2]*l[2])/k; print(round(lum,3), round(255*lum))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire le résultat 0.707 et 180
La commande affiche 0.707 180. La lumière (1, 1, 0) est à 45 degrés de la normale (0, 1, 0). Sa longueur est la racine de 2, soit environ 1,414, d’où 1 divisé par 1,414, qui vaut 0,707.
Le gris vaut 255 fois 0,707, soit 180 une fois arrondi : une face de biais, plutôt claire.
Une erreur fréquente
Attention
Beaucoup pensent que le produit scalaire donne la clarté sans autre précaution. Ce n’est pas juste : avec une lumière de longueur 2, on obtiendrait une clarté double. Normalisez toujours les deux flèches avant de calculer le produit.
Calculer la clarté pour cinq angles
docker exec jupyter python3 -c "import math; print([(a, max(0.0, round(math.cos(math.radians(a)), 3))) for a in (0, 30, 60, 90, 120)])"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
La clarté décroît avec l’angle
La commande affiche [(0, 1.0), (30, 0.866), (60, 0.5), (90, 0.0), (120, 0.0)]. Pour deux vecteurs unitaires, le produit scalaire est le cosinus de l’angle entre eux.
La clarté tombe donc de 1 à 0 quand l’angle va de 0 à 90 degrés, et reste à 0 au-delà.