E nter.net  


VRML (4)
Udoskonalanie ╢wiat≤w

Kamil D▒bkowski


P oniewa┐ zbli┐amy siΩ do ko±ca naszego kursu, czas na ma│e podsumowanie. W pierwszej czΩ╢ci (ENTER 12/97) zosta│a wyja╢niona budowa wΩz│≤w oraz pokazana metoda na utworzenie najprostszych obiekt≤w VRML. CzΩ╢µ druga kursu po╢wiΩcona by│a wprowadzaniu obiekt≤w w ruch po ╢ci╢le wytyczonej trasie, a w czΩ╢ci trzeciej zosta│y om≤wione wΩz│y czujnikowe wprowadzaj▒ce elementy interakcji w ╢wiecie wirtualnym.
Na zako±czenie przyjrzyjmy siΩ kilku wΩz│om, kt≤re odpowiadaj▒ za udoskonalenie naszego ╢wiata.

Modelowanie panoramy


Najpierw przyjrzyjmy siΩ wΩz│om, kt≤re odpowiadaj▒ za warunki atmosferyczne i topograficzne naszego ╢wiata. Definiuj▒c wΩze│ Background mo┐emy okre╢liµ wygl▒d "ziemi" i "nieba". Dokonujemy tego w dwojaki spos≤b: albo na t│o otaczaj▒ce nasz ╢wiat nak│adamy wybran▒ teksturΩ, albo definiujemy jego kolory. Je┐eli zdecydujemy siΩ na ten pierwszy spos≤b, to t│em stanie siΩ wtedy ogromny sze╢cian, kt≤ry otacza nasz ╢wiat, a na ka┐dy z jego bok≤w zostanie na│o┐ona wybrana przez nas tekstura (gdy dobrze siΩ przyjrzymy, to zauwa┐ymy za│amania tekstury na │▒czeniu bok≤w sze╢cianu), np.:

Background	{
	backURL	"g≤ry.gif"
	bottomURL	"ziemia.gif"
	frontURL	"miasto.gif"
	leftURL	"g≤ry.gif"
	rightURL	"pustynia.gif"
	topURL		"niebo.gif"
				}

Zastosowanie powy┐szego wΩz│a umie╢ci nas w scenerii, gdzie na pierwszym planie bΩdziemy widzieµ zabudowania jakiego╢ miasta, z ty│u i z lewej strony otaczaµ nas bΩd▒ g≤ry, a z prawej pustynia. Pod nogami i nad g│ow▒ bΩdziemy widzieµ to, co przedstawiaj▒ pliki ziemia.gif i niebo.gif. Oczywi╢cie niemo┐liwe jest zbli┐enie siΩ do ┐adnej rzeczy, kt≤ra przedstawiona jest w plikach graficznych - stanowi▒ one tylko t│o - zbli┐aµ mo┐emy siΩ jedynie do zdefiniowanych przez nas tr≤jwymiarowych obiekt≤w.
Je┐eli decydujemy siΩ na definiowanie kolor≤w "ziemi" i "nieba", to sprawa jest bardziej z│o┐ona. Wygl▒d "nieba" okre╢lamy za pomoc▒ dw≤ch p≤l wΩz│a Background: 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, ┐e pierwsza warto╢µ w polu skyColor przyjmowana jest za kolor dla zenitu. Poni┐szy przyk│ad tworzy ╢liczne b│Ωkitne niebo (CD:\vrml\backgrnd.wrl):

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 ]
				}

Wygl▒d "ziemi" tworzy siΩ w spos≤b analogiczny, tylko ┐e k▒ty w polu groundAngle liczone s▒ od nadiru. Na ENTER CD umieszczony jest program SkyPaint, kt≤ry pozwala na utworzenie dowolnej scenerii. Warto r≤wnie┐ nadmieniµ, ┐e zdecydowanie najlepiej wΩze│ Background renderuje przegl▒darka Cosmo Player 2.0 (ENTER CD 3'98), kt≤ra rozmywa granicΩ miΩdzy zdefiniowanymi przez nas pasami - do tej pory ┐adna przegl▒darka tego nie robi│a.
VRML pozwala nam r≤wnie┐ na umieszczenie mg│y i decydowanie o jej gΩsto╢ci oraz kolorze. Do powy┐szego kodu ╝r≤d│owego dodajmy nastΩpuj▒c▒ definicjΩ wΩz│a Fog:

Fog {
color 1 1 1
visibilityRange 20
    }

W polu color mo┐emy ustaliµ kolor mg│y, natomiast w polu visibilityRange okre╢lamy odleg│o╢µ od obiektu, po kt≤rej przekroczeniu staje siΩ on zupe│nie niewidoczny z powodu zas│oniΩcia przez mg│Ω (CD:\vrml\fog.wrl).
Zar≤wno wΩze│ Background, jak i Fog s▒ wΩz│ami wi▒┐▒cymi, co oznacza, ┐e mo-┐emy sterowaµ ich ustawieniami. Zmiany te mog▒ byµ wywo│ane zar≤wno jakim╢ zachowaniem u┐ytkownika, jak i up│ywem czasu - zale┐y to od tego, jakiego wΩz│a czujnikowego u┐yjemy (patrz czΩ╢µ trzecia kursu ENTER 2/98 oraz ENTER CD 4/98, plik VRML\bindback.wrl).

Ukszta│towanie terenu


Rys. 1. WΩze│ ElevationGrid (rysunek utworzony w VRML)
Rys. 1. WΩze│ ElevationGrid (rysunek utworzony w VRML)
WΩze│ ElevationGrid wykorzystywany jest do tworzenia pofa│dowa± terenu. Najpierw nale┐y zdefiniowaµ siatkΩ rozci▒gniΩt▒ miΩdzy osi▒ X a Z. W polach xDimension i zDimension dla ka┐dej z osi ustalamy liczbΩ punkt≤w, przez kt≤re przechodziµ bΩdzie nasza siatka, a w polach xSpacing i zSpacing ustalamy odleg│o╢ci miΩdzy tymi punktami, czyli albo zagΩszczamy, albo rozrzedzamy siatkΩ. Teraz wystarczy jedynie zdefiniowaµ pole height, gdzie ka┐demu punktowi przeciΩcia linii siatki podporz▒dkowujemy wysoko╢µ wierzcho│k≤w. Pierwsza warto╢µ w tym polu odnosi siΩ do punktu (0, 0) w uk│adzie (X, Z), nastΩpne warto╢ci odnosz▒ siΩ do kolejnych punkt≤w znajduj▒cych siΩ na osi X (bΩdzie tych warto╢ci tyle, ile okre╢lonych zosta│o w polu xDimension). Kiedy opiszemy wszystkie warto╢ci na osi X dla Z=0, wtedy nastΩpnym punktem, kt≤ry nale┐y opisaµ w polu height, bΩdzie pierwszy punkt znajduj▒cy siΩ na dodatniej stronie osi Z dla X=0. Kolejno opisujemy pozosta│e punkty od X=0 do X=n, a┐ do chwili opisania wszystkich punkt≤w przeciΩcia siatki. Warto╢µ w polu height musi byµ r≤wna dzia│aniu xDimension ╫ zDimension.
Najlepiej zasadΩ dzia│ania wΩz│a ElevationGrid t│umaczy rysunek 1. (CD:\vrml\elevgr.wrl) Wa┐n▒ rolΩ w tym wΩ╝le pe│ni pole creaseAngle, kt≤re odpowiedzialne jest za domy╢ln▒ charakterystykΩ wektor≤w normalnych (wektory prostopad│e do danej powierzchni odpowiadaj▒ce za cieniowanie obiekt≤w). Je┐eli w polu normal nie zdefiniujemy tych wektor≤w (ka┐dego z osobna), to zacznie obowi▒zywaµ warto╢µ w polu creaseAngle (jedna warto╢µ dla wszystkich wektor≤w). Na przy-k│ad, je╢li pole creaseAngle bΩdzie mia│o warto╢µ 0,5 radian≤w, oznacza to, ┐e krawΩdzie miΩdzy dwoma przyleg│ymi wielok▒tami bΩd▒ delikatnie wycieniowane. Pod warunkiem oczywi╢cie, ┐e pole normal dla tych dw≤ch stykaj▒cych siΩ element≤w wielok▒t≤w ma warto╢µ nie wiΩksz▒ ni┐ 0,5 radiana (tj. oko│o 30 stopni). Warto poeksperymentowaµ z tym polem - w pliku elevgr.wrl (p│yta CD katalog vrml) zmie±my warto╢µ tego pola na 3,14 i zobaczmy, jak │adnie zosta│y wycieniowane ostre krawΩdzie wielobok≤w tworz▒cych teren.
Bardzo przydatnym wΩz│em, zw│aszcza je┐eli chodzi o przyspieszenie renderingu ╢wiata VRML, jest wΩze│ LOD (Level of Detail). Odpowiada on za ujawnianie szczeg≤│≤w obiektu w trakcie zbli┐ania siΩ do niego.
W polu level definiujemy wΩz│y, kt≤re reprezentuj▒ ten sam obiekt na r≤┐nych poziomach szczeg≤│owo╢ci (od najwy┐szego do najni┐szego). Pole range okre╢la odleg│o╢ci, na kt≤rych powinno nast▒piµ prze│▒czanie miΩdzy poziomami szczeg≤│owo╢ci. Pole center z kolei okre╢la ╢rodek obiektu poddanego dzia│aniu wΩz│a LOD w celu obliczenia odleg│o╢ci.
Aby wiedzieµ, kt≤ry poziom szczeg≤│owo╢ci ma zostaµ wy╢wietlony, przegl▒darka oblicza odleg│o╢µ miΩdzy obecnym miejscem przebywania u┐ytkownika a punktem wyznaczonym przez pole center. Je╢li wynik tych oblicze± jest mniejszy ni┐ pierwsza liczba w polu range, wtedy wy╢wietlany jest pierwszy stopie± szczeg≤│owo╢ci, je╢li znajduje siΩ miΩdzy pierwsz▒ a drug▒ warto╢ci▒, wtedy wy╢wietlany jest drugi stopie± szczeg≤│owo╢ci itd. (przyk│ad znajduje siΩ w pliku CD:\vrml\lod.wrl)

Dodawanie film≤w i d╝wiΩk≤w


VorldView 2.1
VorldView 2.1 Dobra przegl▒darka, kt≤rej najmocniejsz▒ stron▒ jest szyb-ko╢µ z jak▒ mo┐na poruszaµ siΩ po wirtualnym ╢wiecie. Odczuwalne jest to zw│aszcza w ╢wia-tach o niedu┐ym rozmiarze.
Cosmo Player 2.0
Cosmo Player 2.0 Jedna z najlepszych dostΩpnych na ryn-ku przegl▒darek VRML. Ma udosko-nalon▒ obs│ugΩ wielu wΩz│≤w oraz specjaln▒ konsolΩ pozwalaj▒c▒ wy-kryµ b│Ωdy w kodzie ╝r≤d│owym │ado-wanego ╢wiata
Aby uatrakcyjniµ nasz ╢wiat, mo┐emy w nim umie╢ciµ zar≤wno filmy, jak i d╝wiΩki. W chwili obecnej rzadko umieszcza siΩ w sieci ╢wiaty z pod│▒czonymi plikami filmowymi, gdy┐ czas potrzebny na ich ╢ci▒gniΩcie jest stosunkowo d│ugi. Niemniej jednak warto om≤wiµ wΩze│ MovieTexture, z kt≤rego mo┐na korzystaµ tworz▒c rozbudowane prezentacje VRML off-line.
Plik filmowy (MPEG, AVI - ten format obs│uguje jedynie Cosmo Player 2.0) traktujemy jak zwyk│▒ teksturΩ, do kt≤rej ╢cie┐kΩ dostΩpu wpisujemy w polu url wΩz│a MovieTexture. Jak wszystkie wΩz│y odpowiedzialne za nak│adanie tekstur, r≤wnie┐ ten wΩze│ umieszczamy w polu texture wΩz│a Appearance. WΩze│ MovieTexture jest wΩz│em zale┐nym od up│ywu czasu, w zwi▒zku z czym ma pola loop, startTime i stopTime. Film mo┐e byµ odtworzony na ┐yczenie u┐ytkownika, ale mo┐e r≤wnie┐ wystartowaµ od razu po za│adowaniu - warto╢µ pola loop musi byµ ustawiona na TRUE. Je┐eli chcemy, aby film rozpocz▒│ siΩ na skutek jakiego╢ zachowania u┐ytkownika, to musimy zdefiniowaµ odpowiedni czujnik. Mo┐e byµ to np. wΩze│ ProximitySensor umieszczony w sali kinowej. Gdy u┐ytkownik do niej wejdzie, wΩze│ czujnikowy wy╢le zdarzenie enterTime, a wΩze│ MovieTexture przyjmie zdarzenie set_startTime i zacznie siΩ projekcja. Aby us│yszeµ ╢cie┐kΩ d╝wiΩkow▒ naszego filmu, musimy jeszcze zdefiniowaµ wΩze│ Sound (rys. 2), kt≤ry odpowiedzialny jest za d╝wiΩki wystΩpuj▒ce w naszym ╢wiecie. W polu source tego wΩz│a po raz drugi definiujemy wΩze│ MovieTexture, ale tym razem traktowany jest on tylko jako ╝r≤d│o d╝wiΩku, a nie obrazu (przyk│ad movie.wrl).
W polu source wΩz│a Sound mo┐emy r≤wnie┐ zdefiniowaµ wΩze│ AudioClip. W polu url tego wΩz│a umie╢ciµ mo┐emy pliki d╝wiΩkowe (WAV lub MIDI). WΩze│ AudioClip daje nam r≤wnie┐ mo┐liwo╢µ ustalania prΩdko╢ci z jak▒ dany d╝wiΩk jest odtwarzany, np.:

Sound		{
   source AudioClip		{
       url atest.wav"
 loop TRUE
 pitch 2.0  #d╝wiΩk odtwarzany dwukrotnie szybciej
  							}
   location 0 10 5
   direction 0 5 0
   spatialize TRUE
   maxBack  10
   maxFront 50
   minBack  1
   minFront 5
			}

W wΩ╝le Sound mo┐emy zawrzeµ ponadto wszystkie dane dotycz▒ce w│a╢ciwo╢ci d╝wiΩku. Mo┐emy okre╢liµ jego lokalizacjΩ (pole location), kierunek, w kt≤rym rozchodz▒ siΩ fale d╝wiΩkowe (pole direction), intensywno╢µ (pole intensity) oraz warunki przestrzenno╢ci d╝wiΩku (pole spatialize). W│a╢ciwo╢ci ka┐dego d╝wiΩku s▒ takie, ┐e jego fale rozchodz▒ siΩ elipsoidalnie, w zwi▒zku z tym d╝wiΩk s│ychaµ r≤wnie┐, gdy stoi siΩ niedaleko ╝r≤d│a d╝wiΩku, kt≤re skierowane jest w stronΩ przeciwn▒. Zagadnienie to t│umaczy wystΩpowanie p≤l minBack, maxBack i minFront oraz maxFront. Warto╢µ minBack okre╢la w│a╢nie odleg│o╢µ ╝r≤d│a d╝wiΩku "z ty│u", na kt≤rej s│yszalna jest pe│na jego moc, a pole maxBack okre╢la odleg│o╢µ r≤wnie┐ "z ty│u" ╝r≤d│a, ale tak▒, na kt≤rej d╝wiΩk zupe│nie zanika. Analogicznie wygl▒da sytuacja z polami minFront i maxFront - odnosi siΩ ona jedynie do odleg│o╢ci od ╝r≤d│a d╝wiΩku zgodnej z kierunkiem transmisji. Im wiΩkszy bΩdzie odstΩp miΩdzy warto╢ciami min a max, tym d╝wiΩk bΩdzie narasta│ │agodniej podczas zbli┐ania siΩ do ╝r≤d│a d╝wiΩku.

ªwiat│a


Rys. 2. WΩze│ Sound
Rys. 2. WΩze│ Sound
Do tej pory poznali╢my jeden z trzech wΩz│≤w definiuj▒cych ╢wiat│o na scenie VRML. By│ to wΩze│ DirectionalLight, odpowiadaj▒cy za o╢wietlenie obiekt≤w znajduj▒cych siΩ w wΩ╝le grupuj▒cym. W VRML mo┐emy zdefiniowaµ jeszcze dwa wΩz│y definiuj▒ce ╢wiat│o.
WΩze│ PointLight definiuje ╢wiat│o rozchodz▒ce siΩ z okre╢lonego punktu (pole location) we wszystkich kierunkach, padaj▒c na wszystkie obiekty zdefiniowane na scenie. Pole intensity definiuje si│Ω emitowanego ╢wiat│a, a pole ambientIntensity odpowiada za natΩ┐enie ╢wiat│a rozproszonego. 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 natomiast okre╢la kolor emitowanego ╢wiat│a.
WΩze│ SpotLight definiuje ╢wiat│o, kt≤rego charakterystyka zbli┐ona jest do ╢wiat│a latarki. Mo┐na wiΩc okre╢liµ punkt ╝r≤d│a ╢wiat│a, jego kierunek, szeroko╢µ i d│ugo╢µ snopu ╢wiat│a oraz kolor. ªwiat│o zdefiniowane w tym wΩ╝le o╢wietla wszystkie obiekty sceny, kt≤re stan▒ mu na drodze (patrz plik CD:\vrml\spot.wrl). I w ten spos≤b kurs VRML dobieg│ ko±ca. Wiele zagadnie± z braku miejsca nie zosta│o, niestety, poruszonych, np.: tworzenie prototyp≤w (ka┐dy mo┐e stworzyµ sw≤j w│asny wΩze│), czy te┐ u┐ywanie jΩzyk≤w skryptowych (JavaScript) do programowania zdarze±. Jednak zagadnienia te na pewno zostan▒ poruszone w internetowej edycji tego kursu (www.enter.pol.pl./vrml/kurs/kurs.htm).

Wszystkie pytania i uwagi proszΩ kierowaµ pod adresem:
kamildab@friko2.onet.pl

(c) Copyright LUPUS