Horyzont, panorama i mgła (węzły Background i Fog)

W VRML możemy dokładnie określić kolor "nieba" oraz "ziemi", możemy również stworzyć panoramę przedstawiającą góry czy też odległą łunę nad miastem. Za tego typu efekty odpowiada węzeł Background. Składnia tego węzła wygląda następująco:

Background {
  eventIn      SFBool   set_bind
  exposedField MFFloat  groundAngle  []
  exposedField MFColor  groundColor  []
  exposedField MFString backUrl      []
  exposedField MFString bottomUrl    []
  exposedField MFString frontUrl     []
  exposedField MFString leftUrl      []
  exposedField MFString rightUrl     []
  exposedField MFString topUrl       []
  exposedField MFFloat  skyAngle     []
  exposedField MFColor  skyColor     0 0 0
  eventOut     SFBool   isBound
}

1.
Jeżeli chcemy określić jedynie kolor "nieba" i "ziemi" to korzystamy z pól groundAngle (typu MFFloat), groundColor (typu MFColor) oraz skyAngle i skyColor.

W polu skyAngle wyznaczamy kąt tworzący koncentryczny pas wokół zenitu, a w polu skyColor określamy barwę, jaka ma się w tym pasie znaleźć (barwę określamy w standardzie RGB). Takich pasów możemy utworzyć bardzo wiele, ale zawsze w polu skyColor musi znajdować się jedna definicja koloru więcej, niż jest zdefiniowanych kątów. Dzieje się tak dlatego, iż pierwsza wartość w polu skyColor przyjmowana jest za kolor dla zenitu.

Wygląd „ziemi" tworzy się w sposób analogiczny, tylko że kąty w polu groundAngle liczone są od nadiru. Poniższy przykład definiuje tajemniczy i niepokojący wieczór z księżycem stojącym w zenicie :-)

#VRML V2.0 utf8

Background {
    skyColor [
        1 1 1,
        0 0.25 0.5,
        0.5 0.25 0.5 ]
    skyAngle [ 0.1,  1.57]

    groundColor [
        0 0 0
        0 0 0
        0.5 0.25 0.5 ]
    groundAngle [ 1.5, 1.57]
}

Kolejny przykład umieszcza nasz świat w atmosferze słonecznego, majowego dnia:

#VRML V2.0 utf8

Background {
    skyColor [
        0.0 0.2 0.7,
        0.0 0.5 1.0,
        1.0 1.0 1.0 ]
    skyAngle [ 1.3, 1.57 ]
    groundColor [
        0 0.5 0.25
        0 0.7 0.25
        1 1 1 ]
    groundAngle [ 1.5, 1.57]
}

2.
Za pomocą węzła Background możemy tworzyć również panoramę otaczającą nasz świat. W skład takiej panoramy wchodzą pliki graficzne (JPG, PNG, GIF), które jako teksturę nakładamy na wielki sześcian otaczający cały nasz świat (sześcian ten jest domyślnie tworzony przez węzeł Background). Stąd w składni węzła Background pola: backUrl, bottomUrl, frontUrl, leftUrl, rightUrl, topUrl (wszystkie typu MFString). W każdym z tych pól umieszczamy ścieżkę dostępu do plików graficznych, które mają tworzyć naszą panoramę.

Przykład, który zostanie tutaj pokazany został utworzony w programie SkyPaint autorstwa Gavina Bella i Ricka Careya (Wasabisoft)

#VRML V2.0 utf8

#Generated by SkyPaint
Background {
   frontUrl "hand1_FT.jpg"
   backUrl "hand1_BK.jpg"
   leftUrl "hand1_LF.jpg"
   rightUrl "hand1_RT.jpg"
   topUrl "hand1_UP.jpg"
   bottomUrl "hand1_DN.jpg"
}
 
Jeżeli we wszystkich z tych pól umieścilibyśmy tą samą teksturę (np. białe kropeczki na czarwynm tle) to po załadowaniu świata uzyskalibyśmy efekt zawieszenia w przestrzeni kosmicznej.

Używanie tekstur do utworzenia panoramy jest jednak bardzo kosztowne - po pierwsze czas ściągania wszystkich tekstur jest długi (dlatego należy się starać umieszczać tekstury jak najmniejsze) po drugie bardzo ucierpi na tym szybkość poruszania się w świecie VRML, dlatego proponuję nie używać tekstur na utworzenie panoramy w dużych światach VRML, tam gdzie jest niewiele obiektów, a zależy nam na mocniejszym efekcie możemy ostatecznie pokusić się o dołączenie kilku teksktur.


Kolejnym węzłem, o którym chciałbym powiedzieć jest węzeł Fog odpowiadający za zdefiniowanie mgły w naszym świecie. Składnia tego węzła wygląda następująco:

Fog {
  exposedField SFColor  color            1 1 1
  exposedField SFString fogType          "LINEAR"
  exposedField SFFloat  visibilityRange  0
  eventIn      SFBool   set_bind
  eventOut     SFBool   isBound
}

Pole color określa kolor mgły, tzn: obiekty, które zostaną przez mgłę zakryte przyjmą właśnie ten kolor. Wartość LINEAR w polu fogType powoduje, że mgła rozpościera się linearnie we wszystkich kierunkach, natomiast gdy w  umieścimy tam wartość EXPONENTIAL uzyskamy efekt bardziej naturalny, zbliżony do rzeczywistości. W polu visibilityRange określamy najmniejszą odległość między użytkownikiem a obiektem, przy której obiekt zostaje zupełnie przez mgłę przesłonięty.

Poniższy przykład definiuje efekt mgły oraz żółty sześcian, który zalega we mgle gdy oddalimy się od niego na 10 metrów - fog.wrl.
 
#VRML V2.0 utf8

Background {
    skyColor [
        0.0 0.2 0.7,
        0.0 0.5 1.0,
        1.0 1.0 1.0
    ]
    skyAngle [ 1.309, 1.571 ]
}

Fog { color 1 1 1
      visibilityRange 10
      fogType "LINEAR" }

Shape {
   appearance Appearance { material Material {
                              diffuseColor 1 1 0 }
                         }
   geometry Box {}
}