Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Tutorijal za Script čvora


Send me bugs and suggestions, please

Tutorijal za Script čvora


Uvod i sintaksa

Već ste upoznati kako se kreiraju osnovne animacije i sa jednostavnim radom sa događajima predefinisanim za nekoliko čvorova u VRML. Iako ovi čvorovi mogu da izvedu čuda u vašem VRML svetu su oni ograničeni vrstom akcija koju možete da izvedete.

Script čvora obezbeđuje nedostajuću fleksibilnost do skoro neograničenih zahteva za načinom rada. Script čvora vam omogućava da način rada definišete upotrebom programskih jezika kao što su JAVA, JavaScript ili VRMLScript koji je skoro predložio Silicon Graphics.

Script može da specificira neku radnju svaki put kada primi neki događaj (koristite ROUTE da pošaljete događaj na Script kao i na bilo koji drugi čvor). Šta više, možete da definišete procedure za inicijalizaciju i gašenje. U svakoj akciji skripta može da generiše i više događaja.

Za razliku od drugih čvorova, u Script čvoru možete da definišete događaje koje čvor prima i šalje. Script čvora takođe može da ima polja. Polja se ponašaju kao trajne lokalne promenljive u Script-u i mogu da se koriste za definisanje unutrašnjeg statusa.

Script može da primi neograničen broj događaja, vrednosti gde su ovi događaji smešteni su eventIn tip promenljivih. Ime promenljivih određuje ime događaja koje Script može da primi. Ove promenljive su read-only, odnosno ne možete da podesite vrednost jedne od ovih varijabli, možete samo da pročitate njenu trenutnu vrednost. Takođe, ne postoji ograničenje u broju događaja koje Script može da generiše. Vrednosti u vezi sa ovim događajima se čuvaju u eventOut tipu promenljive. Ove promenljive, kao i polja, su trajna.

Napomena : ne može da definišete exposedField u Script-u. U cilju definisanja ekvivalenta za exposedField moraćete da definišete polje, jedan eventIn i jedan eventOut. Na primer, sledeće deklaracije su identične definiciji izloženog polja:

Primer:
field myField
eventIn set_myField
eventOut myField_changed




Sintaksa:
Script {
url []
directOutput FALSE
mustEvaluate FALSE
#and any number of :
eventIn type eventName
eventOut type eventName
field type fieldName initialValue
}


Tip može da bude bilo koji standardni VRML tip podataka.

Url određuje programsku skriptu koja treba da se izvrši. Trenutno podržani jezici su JAVA, JavaScript iVRMLScript. Obratite pažnju da mnogi, ako ne i svi, pregledači ne podržavaju ova tri jezika. Skripta može biti unutar ili u nekom drugom fajlu.

U ovom tutorijalu je za primere izabran JavaScript. Ovaj jezik je implementiran u par pregledača, npr. Cosmo Player, programski dodatak za VRML koji je napravio Silicon Graphics.

Postoje dva načina da promenite vaš svet koristeći Script: upotrebom promenljive eventOut a zatim slanjem događaja ka narednom čvoru ili direktnim pristupom u polja narednog čvora. Prethodni metod zahteva rutiranje događaja koji je Script poslao drugim čvorovima, gde je kasnije zahtevan samo jedan atribut. Polje directOutput u Sript-u određuje da li je poslednji metod dozvoljen odnosno ako je vrednost directOutput polja FALSE možete da utičete na ostatak vašeg sveta samo slanjem događaja iz Script-a, a zatim njihovim rutiranjem ka željenim čvorovima.

Obzirom da je crtanje VRML sveta vrlo zahtevan zadatak može se desiti da istovremeno crtanje i procesiranje događaja bude problematično za pregledače. Ukoliko je u vašem svetu prisutan veliki broj Script-ova preporučljivo je prioritet dati crtanju pre nego procesiranju događaja. U Script čvoru postoji polje koje kontroliše kada se događaji obrađuju. Čak možete da odredite koje događaje treba obraditi čim stignu, a koje samo onda kada je pregledač sposoban da to uradi bez smanjenja performansi za crtanje. Polje mustEvaluate se koristi za zadavanje modela izvršavanja, postavljanjem na FALSE dozvoljavate pregledaču da odredi odgovarajuće vreme za procesiranje događaja dok postavljanje polja na TRUE govori pregledaču da događaje procesira čim stignu. Ovo poslednje podešavanje, TRUE, treba koristiti samo u kritičnim situacijama.


Definisanje polja i događaja, zadavanje početnih vrednosti

Jedino polja mogu da imaju početne vrednosti prema specifikaciji. Svi ostali tipovi promenljivih, eventIn i eventOut, ne mogu da imaju definisane početne vrednosti.

Kako bi definisali polje morate prvo da definišete tip podatka za njega, pa pogledajte listu tipova podataka za važeće tipove podataka u VRML-u.

U nastavku su važeće definicije polja:

Primer:
field SFRotation myRot 0 0 1 0
field MFVec3f myPos [0 0 0, 1 1 1]
field MFString myURLs ["clock2.wrl","land.wrl"]


Za polja eventIn i eventOut fields ne zadajete početne vrednosti. Ovo su validne eventIn i eventOut definicije:

Primer:
eventIn SFRotation rot_changed
eventOut SFBool set_start



Pristupanje i setovanje polja i događaja koji su definisani u skripti

  • polja: mogu da se zadaju i pročitaju.
  • eventIn: može da se pročita
  • eventOut: može da se zada i pročita
  • U svim slučajevima vrednosti su trajne, odnosno njihove vrednosti se čuvaju između poziva funkcije.

    Čitanje i zadavanje vrednosti polju ili događaju se vrši na isti način kao i sa drugim standardnim promenljivima u većini programskih jezika.

    Pretpostavimo skriptu SFRotation polja koje se zove myField. Zadavanje vrednosti za myField za rotaciju od 1.57 (u radijanima) oko Z ose možete uraditi na sledeći način:

    Primer:
    myField[0] = 0; // x value
    myField[1] = 0; // y value
    myField[2] = 1; // z value
    myField[3] = 1.57; // angle value


    Ako je myField definisan kao eventOut onda će skripta generisati događaj čim se funkcija izvrši. Onda događaj može biti RUTIRAN ka bilo kom čvoru koji ima SFRotation exposedField ili eventIn-ove. Na primer: ROUTE myScript.myField TO myTransform.set_rotation gde je myScript ime kojim ste definisali (DEF) vašu skriptu, a myTransform je ime kojim ste definisali (DEF) Transform čvor.


    Kada se skripte izvršavaju

    Funkcije koje su definisane unutar Script-a mogu da posluže u tri svrhe:
  • inicijalizacija procedura
  • procesiranje događaja
  • isključivanje procedura
  • Funkcija initialize će se izvršiti posle učitavanja fajla u kome je sadržana a pre nego što se kreira bilo koji drugi događaj i to je prva funkcija koja će se izvršiti u vašoj skripti. Ova funkcija može da se koristi za inicijalizaciju polja u vašoj skripti ili da pošalje događaje pre nego što to uradi bilo koji drugi čvor. Funkcija initialize nema parametre.

    Sledeći primer definiše obrazac za funkciju initialize:

    Primer:
    function initialize() {
      ...
    }


    Funkcija shutdown takođe nema parametara, u nastavku je dat obrazac:

    Primer:
    function shutdown() {
    ...
    }


    Za svaki eventIn u Script čvoru morate da definišete funkciju (handler). Handler je funkcija sa dva parametra koja ima isto ime kao eventIn. Ta dva parametra su: vrednost događaja i vremenska oznaka. Funkcija će biti izvršena kada skripta primi odgovarajući događaj.

    Obrazac za eventIn handlere je

    Primer:
    function myEventIn(value,time) {
    ...
    }


    Primer skripte

    Isticanje
    Postoje tri načina za isticanje oblika kada kursor pređe preko njega. Skripta pokazuje kako da prelazite između oblika, kako da se menja materijal polja nekog oblika i kako poljima da pristupite direktno iz skripte.




    Published (Last edited): 08-02-2013 , source: http://lighthouse3d.com/vrml/tutorial/script.shtml