Tworzenie linków (węzeł Anchor)

Pomimo tego, że węzeł Anchor powinien zostać zaliczony do grupy czujników dotykowych to jednak, postanowiłem poświęcić temu węzłowi osobny punkt tej części kursu. Stało się tak dlatego, iż uważam węzeł Anchor za węzeł ważny i szalenie przydatny zwłaszcza dzięki możliwości umieszczenia w nim prostych skryptów napisanych w JavaScript.

Węzeł Anchor generelanie służy do tworzenia linków między światem VRML a innymi miejscami w sieci. Może on również odsyłać do miejsc zdefiniowanych w tym samym świecie za pomocą węzła Viewpoint. Węzeł Anchor posiada następującą budowę:

Anchor {
  eventIn      MFNode   addChildren
  eventIn      MFNode   removeChildren
  exposedField MFNode   children        []
  exposedField SFString description     ""
  exposedField MFString parameter       []
  exposedField MFString url             []
  field        SFVec3f  bboxCenter      0 0 0
  field        SFVec3f  bboxSize        -1 -1 -1
}
 
Jak widzimy (zdarzenia add/remove children oraz pole children) węzeł Anchor jest również węzłem grupującym. Wszystkie obiekty zgrupowane w tym węźle (w polu children)będą poddane jego działaniu.

W polu description (SFString) w cudzysłowiu umieszczamy opis miejsca, do którego się przeniesiemy po kliknięciu na aktywny obiekt. Gdzie ten opis zostanie wyświetlony zależy od przeglądarki (czasem w ogóle nie jest wyświetlany). Nie należy jednak mylić tego opisu z opisem miejsca zdefiniowanego w węźle Viewpoint, są to zupełnie dwa różne niezależne od siebie pola, pomimo identycznej nazwy.

W polu parameter możemy zdecydować, w której ramce (frame) pliku HTML (jeżeli takie są zdefiniowane) ma pojawić się dokument, do którego odsyłamy, np:

#VRML V2.0 utf8

Anchor {
  parameter [ "target=nazwa_ramki" ]
  description "Plik filmowy otworzy się w ramce nazwa_ramki"
  url "http://www.enter.pol.pl/vrml/kurs/test.mpg"
  children [
        Shape { geometry Box {} }
           ]
}

Powyższy przykład wyświetla na ekranie plik VRML z jednym obiektem - sześcianem, który objęty jest działaniem węzła Anchor. Po kliknięciu na ten obiekt w ramce nazwa_ramki dokumentu HTML zostanie załadowany plik filmowy test.mpg (o ile wasza przeglądarka WWW jest zdolna do wyświetlania tego rodzaju plików). Najlepiej przykład ten działalby wtedy gdyby w jednej ramce dokumentu HTML uruchomiony został właśnie ten świat, a druga ramka byłaby pusta i czekała na załadowanie pliku test.mpg.

Jak już zapewne zdążyliście się zorientować, w polu url umieszczamy adres URL pliku, do którego chcemy uzytkownika odesłać. Możemy umieścić w nim ścieżkę dostępu do każdego z plików, które jest w stanie wasza przeglądarka WWW odtworzyć. Możemy również odesłać do innego miejsca Viewpoint tego samego świata, np:

Anchor {
  url "#Pod drzewem"
...
}

Powyższy zapis przeniesie użytkownika obecnego świata do miejsca o nazwie "Pod drzewem" zdefiniowanego w węźle Viewpoint. Możemy także odesłać użytkownika do innego miejsca Viewpoint, innego świata VRML, np:

Anchor {
  url "http://www.enter.pol.pl/vrml/dziura.wrl#Ziemia"
...
}

Ten przykład z kolei załaduje świat dziura.wrl od razu umieszczając nas w miejscu "Ziemia" zdefiniowanym w węźle Viewpoint.

To nie koniec atrakcji związanych z węzłem Anchor. W polu url możemy również umieścić skrypty napisane w JavaScript. Skrypty te mogą mieć identyczną formę jak te występujące w plikach HTML, musimy jedynie zmienić wszystkie znaki " na '. Możemy w ten sposób odwoływać się do metod JavaScriptu uatrakcyjniając w ten sposób wędrówkę po naszym świecie, np:

Anchor {
   url "javascript: alert('Znalazłeś Magiczną Kulę')"
   children [
      Shape { geometry DEF MagicznaKula Sphere {} }
            ]
}

Powyższy przykład powoduje, że po kliknięciu na Kulę pojawia się okno informujące o znalezieniu magicznej kuli. Możemy jednak umieścić tutaj o wiele bardziej złożony przykład:

#VRML V2.0 utf8

Anchor {
   url "javascript:

           var question='Ile jest 2+2';
           var answer='4';
           var correct = 'Brawo. Prawidłowa odpowiedź';
           var incorrect = 'Niestety błąd. Przeładuj świat i spróbuj jeszcze raz';

           var response = prompt(question,'?');
 
           var output = (response == answer) ? correct : incorrect;

           alert(output);"

   children [
      Transform {
         translation 0 0 0
         children [
              Shape {
                 geometry Box {size 2 2 2}
                    }
                  ]
                }
           ]
       }

Po kliknięciu na sześcian pokaże się okno (metoda prompt) z pytaniem ile jest 2+2. Jeżeli podamy błędną odpowiedź lub dobrą odpowiedź poinformuje nas o tym odpowiedni komunikat. W ten sposób można pobierać dane od użytkownika i dowolnie je przetwarzać.

Stosowanie skryptów JavaScript w węźle Anchor ma jedną wadę - działają one tylko w przeglądarkach Netscape i nie ma tutaj znaczenia jakiej przeglądarki VRML obecnie używamy. Skrypty w węźle Anchor, inaczej niż skrypty w węźle Script (patrz część V kursu), kompilowane są bezpośrednio przez przeglądarkę WWW a nie przeglądarkę VRML. A jak powszechnie wiadomo oprogramowanie firmy Microsoft  nie obsługuje języka JavaScript, który jest autorstwa firmy Netscape.

Skrypty w węźle Anchor nie są w stanie również przetwarzać zdarzeń VRML, można tego dokonać poprzez zastosowanie węzła Script. Dokładniejsze informacje na temat pisania skryptów w węźle Script zostaną przedstawione w części V kursu.