Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
2"""
3@file
4@brief implémentation du modèle d'illumination de Phong
5"""
6from .image_synthese_scene import Scene
7from .image_synthese_base import Couleur
10class ScenePhong (Scene):
11 """définit une scène et utilise le modèle d'illumination de Phong
12 pour construire l'image de synthèse"""
14 def __init__(self, repere, alpha, x, y,
15 ka=0.1,
16 kb=0.8,
17 kc=0.3,
18 reflet=6,
19 fond=Couleur(200, 200, 200)):
20 """définit la position de l'oeil, l'angle d'ouverture,
21 et la taille de l'écran"""
22 Scene.__init__(self, repere, alpha, x, y)
23 self.ka, self.kb, self.kc = ka, kb, kc
24 self.reflet = reflet
25 self.fond = fond
26 self.constante = float(1)
28 def __str__(self):
29 """affichage"""
30 s = Scene.__str__(self)
31 s += "ka = %1.3f kb = %1.3f kc = %1.3f\n" % (
32 self.ka, self.kb, self.kc)
33 s += "reflet " + str(self.reflet) + "\n"
34 s += "couleur du fond " + str(self.fond) + "\n"
35 return s
37 def couleur_fond(self):
38 """retourne la couleur du fond"""
39 return self.fond * self.ka
41 def modele_illumination(self, rayon, p, obj, source):
42 """calcule la couleur pour un rayon donné, un point p, un objet obj,
43 et une source de lumière source"""
44 n = obj.normale(p, rayon).renorme()
45 vr = rayon.direction.renorme()
46 vr *= float(-1)
47 vs = source.origine - p
48 vs = vs.renorme()
49 bi = vs + vr
50 bi = bi.renorme()
52 # premier terme
53 cos = n.scalaire(vs)
54 couleur = source.couleur.produit_terme(
55 obj.couleur_point(p)) * (cos * self.kb)
57 # second terme : reflet
58 cos = n.scalaire(bi) ** self.reflet
59 couleur += source.couleur.produit_terme(
60 source.couleur) * (cos * self.kc)
61 couleur = couleur.produit_terme(rayon.couleur)
63 return couleur