Oświetlanie obiektów (węzły <typ_oświetlenia>Light)

Wszystkie obiekty umieszczone na scenie trójwymiarowej są oświetlane przez sumę świateł zdefiniowanych w pliku VRML. Węzły definiujące światła zawierają m.in. informacje na temat kierunku i zakresu padającego światła. Zakres światła, które ostatecznie oświetli scenę, jest zależny od rozproszenia i odbić od innych obiektów. Są trzy węzły, które definiują światło padające na scenie: DirectionalLight, PointLight, SpotLight

Węzeł DirectionalLight oświetla obiekty zdefiniowane w węźle grupującym.

DirectionalLight { 
  exposedField SFFloat ambientIntensity  0     
  exposedField SFColor color             1 1 1 
  exposedField SFVec3f direction         0 0 -1 
  exposedField SFFloat intensity         1    
  exposedField SFBool  on                TRUE 
}

Pole ambientIntensity typu SFFloat definiuje intensywność światła, które nie pada bezpośrednio na żadną powierzchnię (intensywność cienia), natomiast pole intensity definiuje siłę emitowanego światła. Intensywność światła może przybierać wartości od 0.0 (światło nie świeci) do 1.0 (pełna siła oświetlenia). Pole color typu SFColor okeśla kolor emitowanego światła. Kolor ten definiowany jest w standardzie RGB przybierając wartości od 0.0 do 1.0. Pole direction określa kierunek padania światła. Natomiast pole on typu SFBool odpowiada za włączanie i wyłączanie światła zdefiniowanego w tym węźle.
 

Węzeł PointLight może występować w dowolnym miejscu pliku VRML. W polu location, które określa miejsce położenia źródła światła, tworzy swój własny układ współrzędnych. Światło zdefiniowane w tym węźle oświetla wszystkie obiekty na scenie snopem światła, którego szerokość określana jest w polu radius.

PointLight { 
  exposedField SFFloat ambientIntensity  0  
  exposedField SFVec3f attenuation       1 0 0 
  exposedField SFColor color             1 1 1  
  exposedField SFFloat intensity         1      
  exposedField SFVec3f location          0 0 0 
  exposedField SFBool  on                TRUE 
  exposedField SFFloat radius            100 
}

Większość pól tego węzła jest analogiczna do pól w węźle DirectionalLight. Oprócz pola radius, polem dodatkowym jest attenuation typu SFVec3f, które odpowiada za słabnięcie snopu światła w zależności od oddalania się od jego źródła.

Węzeł SpotLight definiuje źródło światła padającego z określonego punktu, w określonym kierunku. Węzeł SpotLight definiuje snop światła na podstawie danych o promieniu (radius), szerokości snopu światła (beamWidth) oraz kącie, po przekroczeniu którego snop  światła zanika (cutOffAngle).

SpotLight { 
  exposedField SFFloat ambientIntensity  0 
  exposedField SFVec3f attenuation       1 0 0 
  exposedField SFFloat beamWidth         1.570796 
  exposedField SFColor color             1 1 1 
  exposedField SFFloat cutOffAngle       0.785398 
  exposedField SFVec3f direction         0 0 -1 
  exposedField SFFloat intensity         1 
  exposedField SFVec3f location          0 0 0 
  exposedField SFBool  on                TRUE
  exposedField SFFloat radius            100 
}

Działanie węzła SpotLight bardzo ładnie przedstawia poniższy rysunek:
 

SpotLight
Rys. 1.1: Węzeł SpotLight
 

Podsumowanie:

DirectionalLight - definiuje światło, które oświetla jedynie obiekty umieszczone w węźle grupującym. Można określić kierunek, w którym będzie padać światło, ale lokalizacja źródła jest uzależniona od lokalizacji węzła grupującego, np: Transform.

PointLight - oświetla wszystkie obiekty zdefinowane na scenie. Możemy określić lokalizację źródła światła, ale nie określimy już kierunku, gdyż światło tego typu roznosi się we wszystkich kierunkach.

SpotLight - efekt działania tego węzła przypomina działanie latarki. Z jednego małego punktu światło rozchodzi się, coraz bardziej się rozszerzając. Określamy pozycję źródła światła, kierunek padania promieni, szerokość snopu światła itd.
 

Przykład:

Węzły definiujące światło są najsłabiej "rozumiane" przez przeglądarki VRML. Praktycznie ciężko jest dopatrzeć się różnic i subtelności w ich działaniu. Z tego też powodu nie ma sensu przytaczać przykładów dla wszystkich rodzajów węzłów definiuących światło. Stworzyliśmy dla was w miarę ciekawy przykład z węzłem SpotLight w roli głównej. 

#VRML V2.0 utf8 

SpotLight {
     ambientIntensity  0  
     attenuation       1 0 0  
     beamWidth         1.570796  
     color             1 0 0      #Kolor czerwony
     cutOffAngle       0.785398  
     direction         -1 0 0  
     intensity         1  
     location          10 0 0  
     on                TRUE 
     radius            100 

Transform {
    rotation    1 0 0 0.5
    translation 0 0 -5
   
    children [
            Shape { 
                appearance Appearance {
    material Material {
          emissiveColor 0 1 0
          transparency  0
          specularColor 0 0.25 0.5    # Kolor granatowy
      }
      }
                geometry Box {        
                     size 4 4 4 
                }
            }
    ]
}

Do przykładu z poprzedniego punktu naszego kursu dodaliśmy węzeł SpotLight, dzięki któremu tworzymy źródło światła w punkcie (10,0 ,0). Snop światła w kolorze czerwonym, skierowany jest w kierunku ujemnej części osi X. Dzięki temu będzie oświetlał nasz sześcian z prawej strony (naszej prawej). Załadujmy świat i zobaczmy co się wydarzy przy włączonym dodatkowo świetle headlight. Po instrukcję kliknij tutaj.