Definiowanie kolorów i tekstur obiektów (węzeł Appearance)

Tym razem zajmiemy się wyglądem tworzonych przez nas obiektów. Możemy nadać im dowolny kolor, określając jednocześnie wiele opcji dotyczących koloru światła odbitego przez obiekt, stopień przezroczystości, sposób nałożenia tekstury i wiele innych. Charakterystykę wizualną obiektów definiuje się przez użycie węzła Appearance:

Appearance { 
  exposedField SFNode material          NULL
  exposedField SFNode texture           NULL
  exposedField SFNode textureTransform  NULL
}

Jak widzimy węzeł Appearance składa się z trzech węzłów typu SFNode: material, texture, textureTransform. Pole material może zawierać definicję węzła Material.

Material { 
  exposedField SFFloat ambientIntensity  0.2 
  exposedField SFColor diffuseColor      0.8 0.8 0.8 
  exposedField SFColor emissiveColor     0 0 0 
  exposedField SFFloat shininess         0.2
  exposedField SFColor specularColor     0 0 0
  exposedField SFFloat transparency      0
}

Pola węzła Material określają kolor obiektu nie poprzez "pokolorowanie" obiektu, ale przez nadanie odpowiednich wartości refleksom świetlnym, które powstają w wyniku odbicia się od danego obiektu.

Pole ambientIntensity typu SFFloat określa intensywność światła na tej części obiektu, który nie jest bezpośrednio oświetlony, a jej kolor zależy od od wartości jaką umieścimy w polu diffuseColor.

Pole diffuseColor typu SFColor określa kolor obiektu w miejscach gdzie światło pada na niego bezpośrednio.

W polu emissiveColor możemy zdefiniować kolor jaki emituje dany obiekt. Pole to może być przydatne zwłaszcza wtedy gdy chcemy zdefiniować widoczne przedmioty w ciemnym pokoju.

Pola specularColor i shininess odpowiadają za kolor i siłę światła odbitego od danego obiektu.

Pole transparency można zdefiniować stopień przezroczystości obiektu. Wartości w tym polu mogą zawierać się między 0.0 - zupełnie nie prześwitujący, a 1.0 - kompletnie prześwitujący.

Węzeł Material jest trochę złożony, ale nie trzeba jednorazowo definiować wszystkich pól. Przeglądarka załaduje wartości domyślne niezdefiniowanych pól a wyświetli zdefiniowane, np: przezroczystość, czy kolor emitowany przez obiekt.
 

Powróćmy jednak do węzła Appearance. Pole texture tego węzła może zawierać definicję jednego z następujących węzłów: 

ImageTexture - wpisanie w pole url ścieżki dostępu do pliku graficznego  (o formacie: GIF, JPEG, PNG, CGM), spowoduje nałożenie na obiekt rysunku jako tekstury.

MovieTexture -  wpisanie w pole url ścieżki dostępu do pliku filmowego formatu MPEG, oraz określenie innych pól tego węzła dotyczących m.in. czasu wystartowania i zatrzymania filmu, spowoduje nałożenie na obiekt tego filmu jako tekstury.

PixelTexture - węzeł ten zawiera pole image typu SFImage, gdzie definiujemy wygląd pikseli, które pokryją powierzchnię naszego obiektu.
 

Pole textureTransform węzła Appearance może zawierać definicję węzła TextureTransform.

TextureTransform { 
  exposedField SFVec2f center      0 0
  exposedField SFFloat rotation    0   
  exposedField SFVec2f scale       1 1 
  exposedField SFVec2f translation 0 0 
}

Węzeł TextureTransform definiuje dwuwymiarowe przekształcenie tekstury na obiekcie. 

Pole center określa środek dwuwymiarowego układu współrzędnych, względem którego będą odbywać się operacje obrotu, skalowania i przemieszczania tekstury. Operacje te definiujemy odpowiednio w polach rotation, scale i translation, podobnie jak robiliśmy  to gdy opisywaliśmy węzeł Transform. Różnica polega na tym, że tym razem operujemy na dwuwymiarowym układzie współrzędnych, stąd zmiana typu pól centrowania, skalowania i przemieszczania na SFVec2f.
 

Węzeł Appearance stosujemy w polu appearance węzła Shape. Spójrzmy na poniższy przykład Appear.wrl:

#VRML V2.0 utf8 

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

Do przykładu Trans.wrl dodaliśmy definicję wyglądu naszego sześcianu, używając w tym celu węzła Appearance. W polu material umieściliśmy węzeł Material i zdefiniowaliśmy: kolor emitowany przez obiekt - zielony (emissiveColor 0 1 0); 20% stopień przezroczystości (transparency 0.2); kolor światła odbitego od obiektu - czerwony (specularColor 1 0 0). 

Najciekawszym tutaj elementem, jest definicja koloru światła odbitego od obiektu. Korzystając z przeglądarki Cosmo Player 1.0 mamy domyślnie włączoną opcję headlight, czyli reflektor, który oświetla scenę tam gdzie skierujemy nasz wzrok (kaski górników). Zróbmy mały eksperyment: najpierw kliknij tutaj, a potem załaduj świat Appear.wrl.

A teraz jeszcze jeden przykład. Tym razem na nasz sześcian nałożymy teksturę (lekko przesunietą) w postaci  pliku graficznego w formacie GIF przedstawiającego Beavisa & Buttheada w swoich charakterystycznych pozach - Appear2.wrl.
 

#VRML V2.0 utf8 

Transform {
    rotation    1 0 0 0.5
    translation 0 0 -5
    children [
            Shape { 
              appearance Appearance {
                           texture ImageTexture {
                                       url "beavis.gif"
                                   }
                           textureTransform TextureTransform {
                                       translation 0.5 0.5
                                            }
                }
                geometry Box { 
                     size 4 4 4 
                }
            }
    ]
}

Stosowanie w jednym węźle Appearance jednocześnie pola material i pól texture oraz textureTransform jest zazwyczaj bezcelowe. Zresztą zobaczcie sami - Appear3.wrl.