VRMLed - uDner Cnossstrucion


Wstęp*
Koncepcja*
FCAF*
Teksty*
Światła*
Dźwięki*
*Three Dots

* Koncepcja programowania w VRML97
*Język VRML97 nie przypomina 'zwyczajnych' języków programowania takich jak C++, Pascal, Perl itd. Nie jest też podobny do HTML czy XML, jak sugerowałaby nazwa. Tworzenie świata VRML97 polega na definiowaniu węzłów, definiujących kształty obiektów, oświetlenie, dźwięki oraz na określeniu tras przesyłania zdarzeń będących czymś w rodzaju komunikatów. Węzeł jest czymś pomiędzy funkcją a obiektem. Podobieństwo węzłów do funkcji przejawia się tym iż definiując węzeł umieszczamy w jego polach wartości, co przypomina wywoływanie funkcji z parametrami. Ponadto do zdefiniowanego węzła można się odwołać, zmieniając jego właściwości 'w biegu', czyli w trakcie działania świata co upodabnia go do obiektu.
Wspomniane wcześniej pola można porównać do zmiennych. Tak jak zwykła zmienna pole posiada identyfikującą je unikalną w obrębie węzła nazwę, typ oraz wartość domyślną. Dodatkowo każde pole ma zdefiniowany swój rodzaj, który określa możliwości obsługi komunikatów. Poniżej przedstawiona jest definicja węzła Collision wraz z opisem:

Collision {
  eventInMFNodeAddChildren 
  eventInMFNodeRemoveChildren 
  exposeFieldMFNodeChildren[]
  exposeFieldSFBoolCollideTRUE
  fieldSFVect3fBboxCenter0 0 0
  fieldSFVect3fBboxSize-1 -1 -1
  fieldSFNodeProxyNULL
  eventOutSFTimeCollideTime 
}
rodzaj polatyp wartościnazwa polawartość domyślna



* Pierwszy przykład
*Ponieważ specyfikę tworzenia światów w VRML najlepiej przedstawić na przykładzie poniżej przedstawiony jest kod VRML który tworzy na scenie czerwony stożek. Korzystając z mechanizmów udostępnionych przez przeglądarkę VRML można spróbować obejrzeć go ze wszystkich stron. Oto kod przykładu:

#VRML V2.0 utf8

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

Pierwsza linijka #VRML V2.0 utf8 informuje iż jest to program napisany w języku VRML97. Zdefiniowana scena zawiera jeden węzeł: Shape w którym określiliśmy wartości dla dwóch pól: appearance oraz geometry. Zawartością pola geometry jest węzeł Cone definiujący stożek, natomiast zawartością pola appearance jest węzeł Appearance. W węźle Appearance zdefiniowane jest jedno pole: material. Zawartością tego pola jest węzeł Material, w którym określiliśmy wartość pola diffuseColor, które określa kolor figury. Ufff...
*Pomimo że wygląda to wszystko bardzo skomplikowanie po pewnym czasie łatwo już zorientować się w konstrukcji sceny. Dodatkowo VRML udostępnia mechanizmy pozwalające rozbić 'piętrowe' konstrukcje na kilka mniejszych fragmentów i używać ich tak jak np. funkcji w języku C++ albo Pascal.

* Zdarzenia
*Jak wspomniano wcześniej zdarzenia w VRML są czymś w rodzaju komunikatów. Prawie każdy węzeł może generować i odbierać zdarzenia, co wpływa na jego zachowanie. W kolejnym przykładzie umieszczenie wskaźnika myszki nad białą kulą spowoduje oświetlenie jej zielonym światłem:

#VRML V2.0 utf8

Shape {
  appearance Appearance {
    material Material {
      diffuseColor 1 1 1
    }
  }
  geometry Sphere {}
}

DEF l1 DirectionalLight {
  color 0 1 0
  on FALSE
}

DEF s1 TouchSensor {}

ROUTE s1.isOver TO l1.on

Jak widać oprócz tego, że zmieniliśmy w węźle Shape wartość pola geometry z Cone na Sphere, dodaliśmy i nazwaliśmy dwa nowe węzły oraz utworzyliśmy jedną ścieżkę przesyłania zdarzeń. Za pomocą słowa kluczowego DEF zdefiniowaliśmy węzeł DirectionalLight jako l1 a węzeł TouchSensor jako s1. Zdefiniowane przez nas w węźle l1 światło ma kolor zielony (pole color) i jest wyłączone (pole on ma wartość FALSE). Po najechaniu myszką na kulę węzeł s1 reaguje na to generując zdarzenie isOver o wartości TRUE. Za pomocą słowa kluczowego ROUTE przesyłamy to zdarzenie (wartość) do pola on węzła l1. W tym momencie pole on przyjmuje wartość TRUE, co powoduje zapalenie światła (uaktywnienie węzła)...

* Typy wartości
*Pola VRML mogą mieć 20 typów wartości. Rozróżniamy pola które przyjmują wartość pojedynczą oraz pola które przyjmują zbiór wartości. Pola o pojedynczej wartości posiadają przedrostek SF, natomiast wielowartościowe MF. W polach wielowartościowych dane powinny być umieszczone w nawiasach kwadratowych, chyba że posiadają one tylko jedną wartość - nawiasy wtedy można pominąć. Oto przykłady kilku pól wraz z danymi:
SFBool przełącznik TRUE - jednowartościowemu polu typu SFBool 'przełącznik' przypisano wartość TRUE
MFInt32 dane [ 1 2 3 4 5 5 ] - wielowartościowe typu pole MFInt32 zawiera 6 danych
MFVec3f wektor 1 1 1 - wielowartościowe pole typu MFVec3f zawiera 1 daną
MFVec2f wektor2 [] - wielowartościowe pole typu MFVec2f zawiara 0 danych
MFVec3f wektor3 [ 1 1 1 2 2 -1 3 0.5 7 ] - wielowartościowe pole typu MFVec3f zawiera 3 dane

*Poniżej przedstawiony jest opis wszystkich pól występujących w VRML97.
SFBool Pole to jest polem logicznym i przyjmuje wartość TRUE (prawda) lub FALSE (fałsz)
SFBool prawda TRUE
SFBool fałsz FALSE
SFColorMFColorPola te służą do definiowania koloru. Wartością pola SFColor powiny być trzy liczby zmiennoprzecinkowe z zakresu od <0,1> opisujące czerwoną, zieloną i niebieską skłądową koloru. Przykład:
SFColor czerwony 1 0 0
MFColor czerwony_zielony_biały [ 1 0 0 0 1 0 1 1 1 ]
SFFloatMFFloatPola te przechowują wartości zmiennoprzecinkowe. Separatorem jest kropka
SFFloat pól 0.5
MFFloat pi_i_półpi [ 3.1415 1.5707 ]
SFImage Pole to zawiera pojedynczy, nieskompresowany, dwuwymiarowy obraz (kto wymyśli jeszcze jakiś przymiotnik może go do mnie wysłać :). Format pola SFImage jest następujący: szerokość wysokość typ wartości_pikseli, gdzie:
szerokość jest szerokością obrazka w pikselach
wysokość jest wysokością obrazka w pikselach
typ określa typ obrazka i jednocześnie format danych opisujących jego piksele. Obraz powinien zawierać szerokość*wysokość wartości pikseli. Typy obrazów:
1 - wartość piksela jest jednobajtową liczbą określającą jego jasność
2 - wartość piksela jest dwubajtową liczbą określającą jego jasność (bajt starszy) i nieprzezroczystość (bajt młodszy, 0x00 - przezroczysty, 0xff - nieprzezroczysty)
3 - wartość piksela jest trzybajtową liczbą określającą jego kolor w formacie RGB
4 - wartość piksela jest czterobajtową liczbą, której trzy starsze bajty określają kolor w formacie RGB, natomiast bajt najmłodszy określa nieprzezroczystość.
Piksele są określone w kolejności od lewej do prawej, z dołu do góry. Przykład:
SFImage szachownica 2 2 1 0x00 0xff 0x00 0xff - definiuje szachownicę 2x2 z lewym dolnym i prawym górnym białym polem
SFImage czerwonapoziomalinia 4 1 3 0xff0000 0xff0000 0xff0000 0xff0000 - definiuje obrazek 4x1 składający się z czerwonych pikseli
SFInt32MFInt32Pola te przechowują liczby całkowite z zakresu <-2147483648,2147483647>
SFInt32 jeden 1
MFInt32 odminustrzydodwa [ -3 -2 -1 0 1 2 ]
SFNodeMFNodePola te przechowują węzły. Dodatkowo wartością pola SFNode może być NULL, informujące że pole nie posiada żadnej wartości.
SFNode nic NULL
MFNode trzyświatła [ DirectionalLight {} SpotLight {} PointLight {} ]
SFRotationMFRotationWartością tego pola są cztery liczby zmiennoprzecinkowe. Pierwsze trzy z nich definiują wektor dookoła którego ma się wykonać obrót, czwarta jest wartością obrotu w radianach. Obrót wykonywany jest zgodnie z ruchem wskazówek zegara (Anglikom wystarczy napisać clockwise :), patrząc zgodnie ze zwrotem wektora.
SFRotation piłeczkiwlogo 0 0 1 6.28318
SFRotation napiswlogo 1 0 0 6.28318
SFStringMFStringPola te przechowują "ciągi znakowe" lub "łańcuchy znakowe", a mówiąc po prostu napisy.
SFString napis "Adam Mickiewicz napisał \"Pana Tadeusza\""
MFString napis2 [ "pierwszy napis" "drugi napis" "jak umieścić w napisie znak \" (cudzysłowu)?" "a jak znak \\ (lewego ukośnika)?" ]
SFTimeMFTimePole to reprezentuje wartość czasu, w sekundach. Czas aktualny podawany jest jako liczba sekund która upłynęła od 1.I.1970 roku czasu Greenwich.
SFtime czasjaktopisałem 961848000.5
MFTime kolejne_sekundy [ 0 1 2 ]
SFVec2fMFVec2fPola te podają wartość dwuwymiarowych wektorów.
SFVec2f wektor 1 1
MFVec2f trzywektory [ 0 0 1 7 -5.5 3.2 ]
SFVec3fMFVec3fPola te podają wartość trójwymiarowych wektorów.
SFVec3f wektor 0 1 1
MFVec3f dwawektory [ 0 0 1 7 -5.5 3.2 ]
E-mail to: coding@poczta.onet.pl