|
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.
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.
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).
Ukszta│towanie terenu
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
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
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:
(c) Copyright LUPUS |