Witamy na kursie języka VRML
[Jeżeli
powyżej nie zostanie wywietlony świat VRML to znaczy, że nie masz zainstalowanego
plug-ina VRML]
[Z kursu
możesz korzystać off-line ściągając niniejszy
ZIP]
Modelowanie światów wirtualnych nie jest tak proste jak tworzenie stron
WWW i wymaga pewnej dozy samozaparcia w celu poznania skomplikowanej budowy
węzłów, zasad działania czujników, tras i interpolatorów. Ale powoli. Spróbuję
wam te wszystkie zagadnienia w miarę przystępny sposób przybliżyć, a napewno
sami dojdziecie do tego jak zbudować niejeden rozbudowany świat wirtualny.
Zagadnienia opisywane w niniejszym kursie dotyczą wersji 97 języka VRML
- VRML97.
I. Co musisz mieć żeby móc stworzyć
świat VRML:
-
Zakładamy, że skoro dostaliście się na tę stronę
macie komputer i przeglądarkę WWW. Teraz musicie zaopatrzyć się w przeglądarkę
VRML, która jako plug-in
do twojej przeglądarki WWW będzie odpowiadała za wyświetlanie plików VRML.
-
Następnie musicie wybrać sobie jakiś najprostszy
edytor tekstu (typ windowsowego Notatnika), gdzie będziecie tworzyć
pliki VRML.
-
Gdy otworzycie czysty dokument w swoim edytorze musicie
zacząć od napisania linii, która mówi przeglądarce WWW, że ma załadować
plik *.wrl i uruchomić przeglądarkę VRML. Wygląda ona następująco i jest
absolutnie obowiązkowa:
#VRML V2.0
utf8
-
Ostatnią ważną rzeczą o jakiej powinniście pamiętać
jest to, że język VRML jest tzw. językiem case-sensitive, czyli
istotne są wielkości liter jakimi piszecie wszelkie komendy. Więc jeżeli
coś będzie wam nie wychodzić to najpierw sprawdźcie pisownię a potem się
denerwujcie.
-
Teraz jesteście gotowi, przed rozpoczęciem kursu
przeczytajcie jednak dalsze uwagi.
II. Zasady korzystania z kursu
-
Podczas kursu spotkacie się z wyrażeniami języka
VRML, których nie będziecie rozumieć, np. nazwami typów zdarzeń: eventIn,
eventOut,
exposedField;
nazwami typów pól: SFNode,
MFRotation,
SFVec3f.
Nie przejmuje się tym jednak. Najważniejsze dla danego zagadnienia pojęcia
są wyjaśniane w dolnej ramce. Do pozostałych z pewnością wrócimy w dalszej
części kursu.
-
Każde zagadnienie opisuje właściwości jednego lub
więcej węzłów. W opisie tym zawiera się: zasada działania węzła, zastosowanie,
wypis interfejsu użytkownika danego węzła (patrz punkt IV), oraz przykład.
-
Kurs docelowo składać się będzie z pięciu części,
które stopniowo będą osiągalne na tej stronie.
-
Pamiętajcie, żeby nie przechodzić do kolejnej części
bez dobrego opanowania poprzedniej.
-
Wszelkie uwagi proszę kierować do autora kursu -
Kamila Dąbkowskiego.
III. Węzły, pola, zdarzenia
Podstawowymi elementami składowymi świata VRML
są węzły. Język VRML umożliwia definiowanie kilku rodzajów węzłów. Większość
z nich można podzielić na dwie grupy: węzły grupujące (grouping nodes)
i węzły samodzielne (leaf nodes). Węzły grupujące, jak łatwo się
domyśleć, służą do grupowania innych węzłów, co daje możliwość traktowannia
ich jako pojedynczy obiekt. Węzły grupowane definiowane są w polu węzła
grupującego o nazwie children
(dzieci). Niektóre z węzłów grupujących mają możliwość kontroli nad tym,
które z jego „dzieci" ma być aktualnie ukazane na scenie. Każdy węzeł grupujący
traktuje swoje „dzieci" w inny sposób.
Węzły samodzielne nie mogą mieć „dzieci". Zawierają
one informacje na temat kształtów obiektów, świateł, zdefiniowanych na
stałe punktów patrzenia na wykreowany świat (viewpoints), dźwięków,
skryptów, czujników, interpolatorów i innych węzłów, które przekazują informacje
do przeglądarki.
Opis węzłów składa się z następujących części:
-
Nazwy typu węzła, np.: Cube,
Cone,
DirectionalLight,
Transform
itd.
-
Parametrów, które odróżniają od siebie węzły tego
samego typu, np.: każda kula opisana przez węzeł Sphere
może mieć inny promień, inaczej padające na nią światło, inną intensywność,
kolor czy lokalizację. Te parametry nazywamy polami. W węźle
może być kilka pól lub może ich nie być wcale. Każdy węzeł definiuje typ,
nazwę i wartości domyślne każdego z pól. Wartość domyślna
danego pola jest uaktywniana wtedy, gdy dane pole w ogóle nie jest w danym
węźle wyspecyfikowane. Nie jest istotna również kolejność występowania
pól w węźle, np.:
-
W większości węzłów można definiować zdarzenia,
o których informacja może być przez węzeł wysyłana lub przyjmowana. Zdarzenia
są przyjmowane przez węzeł za pomocą przedrostka set_,
np.: set_position,
set_color.
Natomiast wysyłanie informacji o zdarzeniach realizujemy za pomocą końcówki
_changed,
np.: position_changed,
color_changed.
Zdarzenia, które węzeł może przyjąć mają etykietę eventIn,
natomiast zdarzenia, które mogą zostać przez węzeł wysłane, mają etykietę
eventOut.
Aby ułatwić wyspecyfikowanie zdarzeń przyjmowanych i wysyłanych w węźle,
wprowadzone zostało polecenie exposedField,
które łączy oba pola set_
eventIn i _changed
eventOut, np.:
exposedField zdarzenie
pełni taką samą funkcję co:
eventIn set_zdarzenie
eventOut zdarzenie_changed
Zdarzenia są szalenie ważnym, a przy tym złożonym,
elementem świata VRML. Działanie zdarzeń opiera się na prostej zasadzie,
że jeden węzeł wysyła zdarzenie a inny to zdarzenie przyjmuje zmieniając
tym samym wartość, któregoś ze swoich pól. Za pomocą zdarzeń tworzymy animacje
i wprowadzamy do naszego świata elementy interakcji.
IV. Sposoby zapisu właściwości węzłów
Podczas kursu spotkacie się z dwojakim zapisem
właściwości węzłów. Pierwszy rodzaj zapisu, nazywany interfejsem
użytkownika, zawiera definicję pól, zdarzeń, nazw, typów i wartości domyślnych
danego węzła. Drugi rodzaj zapisu nazywany składnią węzła w pliku źródłowym,
zawiera on nazwę węzła i pola wraz z ich wartościami, które będziemy chcieli
na danej scenie zdefiniować. Łatwo zauważyć, że składnia węzła w pliku
jest mniej pojemna i zawiera się w definicji interfejsu użytkownika. Dlatego
też przy opisie interfejsu użytkownika będziemy drukiem wytłuszczonym zaznaczali
elementy, które mogą się potem znaleźć w pliku VRML.
Spójrzmy teraz na przykład definicji węzła Collision
jako interfejsu użytkownika:
Collision
{
eventIn MFNode addChildren
eventIn MFNode removeChildren
exposedField MFNode children
[]
exposedField SFBool collide
TRUE
field SFVec3f bboxCenter
0 0 0
field SFVec3f bboxSize
-1 -1 -1
field SFNode proxy
NULL
eventOut SFTime collideTime
}
I jako składni węzła, czyli te elementy interfejsu
użytkownika, które znajdą się potem w pliku VRML:
Collision
{
children []
collide TRUE
bboxCenter 0 0 0
bboxSize -1 -1 -1
proxy NULL
}