Discussion:
bsp5: diffuse illumination
(zu alt für eine Antwort)
Martin Grödl
2003-12-07 19:09:19 UTC
Permalink
habe probleme beim berechnen der illuminatedColor... meine objekte
schaun im vergleich zu den muster-screenshiots ziemlich blass aus.

so hab ichs gemacht:
zuerst wird das cosinus(phi) als dot-product von normalVector und
lightVector berechnet.

ist das cos(phi) > 0 dann berechnen sich die neuen farbwerte mit
farbwert_neu = ambientIntensity*farbwert_alt +
diffuseIntensity*farbwert_lichtquelle*cos(phi)

(jeweils für die komponenen r, g, b; wobei die lichtquelle ja weiß sein
soll, also farbwert_lichtquelle = 1)

sonst
farbwert_neu = ambientIntensity*farbwert_alt
-----------------------------------------------------
die farbkomponenten r,g,b sind bei mir im bereich [0,1].

natürlich bekomm ich exceptions wenn ich die materialeigenschaften
verstelle weil es dann vorkommt, dass farbkomponenten größer als 1 werden.
ich weiß aber nicht wie ich das anders machen soll...?

danke schonmal für hilfe,
martin
Henning Scharsach
2003-12-08 01:34:14 UTC
Permalink
Post by Martin Grödl
zuerst wird das cosinus(phi) als dot-product von normalVector und
lightVector berechnet.
dot-product stimmt - was meinst du mit cosinus?
Post by Martin Grödl
ist das cos(phi) > 0 dann berechnen sich die neuen farbwerte mit
farbwert_neu = ambientIntensity*farbwert_alt +
diffuseIntensity*farbwert_lichtquelle*cos(phi)
(jeweils für die komponenen r, g, b; wobei die lichtquelle ja weiß sein
soll, also farbwert_lichtquelle = 1)
sonst
farbwert_neu = ambientIntensity*farbwert_alt
-----------------------------------------------------
die farbkomponenten r,g,b sind bei mir im bereich [0,1].
du musst an sich in BEIDEN fällen die Intensity multiplizieren mit dem
material (also der alten farbe) UND der light color (in dem fall
weiss). Du musst die farbe also für den diffusen anteil auch
berücksichtigen, machst du das nicht, schaut dein ergebnis natürlich
blass aus ;-)

also

farbwert_neu = farbwert_alt*ambientIntensity*ambientLightColor +
farbwert_alt*diffuseIntensity*diffuseLightColor*N*L
Post by Martin Grödl
natürlich bekomm ich exceptions wenn ich die materialeigenschaften
verstelle weil es dann vorkommt, dass farbkomponenten größer als 1 werden.
ich weiß aber nicht wie ich das anders machen soll...?
naja, am ende musst du natürlich die farben gegen das intervall (0,1)
clampen, das sollte ja nicht allzu schwer sein ;-)

lg,
Henning Scharsach
2003-12-08 01:41:13 UTC
Permalink
hmmm. ... newsreader ist während dem senden der antwort gerade
abgestürzt, offensichtlich ist die nachricht jetzt im nirvana
Post by Martin Grödl
zuerst wird das cosinus(phi) als dot-product von normalVector und
lightVector berechnet.
dot product stimmt, was willst du mit einem cosinus?
Post by Martin Grödl
ist das cos(phi) > 0 dann berechnen sich die neuen farbwerte mit
farbwert_neu = ambientIntensity*farbwert_alt +
diffuseIntensity*farbwert_lichtquelle*cos(phi)
du brauchst bei beidem an sich die farbe der lichtquelle und den alten
farbwert (also den farbwert des materials). nachdem du den beim
diffusen anteil offensichtlich ignoriert hast, ist es klar, dass dein
ergebnis blass aussieht ;-)

also:

farbwert_neu = ambientIntensity*farbwert_alt*ambientLightColor +
diffuseIntensity*farbwert_alt*diffuseLightColor*N*L
Post by Martin Grödl
natürlich bekomm ich exceptions wenn ich die materialeigenschaften
verstelle weil es dann vorkommt, dass farbkomponenten größer als 1 werden.
ich weiß aber nicht wie ich das anders machen soll...?
einfach am ende gegen (0,1) clampen, das der wert aus diesem bereich
gehen kann, ist schon in ordnung.

lg,
Chris Chiu
2003-12-08 13:28:42 UTC
Permalink
Post by Martin Grödl
natürlich bekomm ich exceptions wenn ich die materialeigenschaften
verstelle weil es dann vorkommt, dass farbkomponenten größer als 1 werden.
ich weiß aber nicht wie ich das anders machen soll...?
Mach ein einfaches Clamping, d.h. wenn red größer als 1 wird, dann setz es
auf 1, wenn es kleiner als 0 ist, setz es auf 0.

Ob das dein Problem mit dem "zu blaß" behebt, weiß ich nicht, aber
prinzipiell scheint dein Lösungsansatz richtig zu sein.

Ciao,
Christoph
***@cg.tuwien.ac.at

Loading...