Węzeł TimeSensor należy do grupy węzłów czujnikowych odpowiedzialnych za interakcję między użytkownikiem a światem wirtualnym, zajmując się kontrolowaniem czasu w jakim te wszystkie operacje mają się odbywać. Węzeł TimeSensor używany jest między innymi do tworzenia animacji, definiowania zachowań następujących po sobie w określonych odstępach czasu, definiowania pojedynczych zachowań, np. wybicie godziny dwunastej. Węzeł TimeSensor składa się z następujących pól i zdarzeń:
TimeSensor {
exposedField SFTime
cycleInterval 1
exposedField SFBool
enabled TRUE
exposedField SFBool
loop FALSE
exposedField SFTime
startTime 0
exposedField SFTime
stopTime 0
eventOut SFTime
cycleTime
eventOut SFFloat
fraction_changed
eventOut SFBool
isActive
eventOut SFTime
time
}
Pole cycleInterval typu SFTime stanowi o szybkości animacji. Im większa wartość w tym polu, tym animacja będzie przebiegała wolniej. Pole enabled odpowiada za to czy węzeł TimeSensor jest aktywny czy nie. Ponieważ jest to pole typu SFBool wartości mogą przybierać postać TRUE lub FALSE. Podobnie sytuacja wygląda z polem loop, w którym określamy czy pętla animacji ma następować jedna po drugiej (wartość TRUE), czy też ma zostać wykonana tylko jedna (wartość FALSE). Jeśli na końcu cyklu okaże się, że wartość w polu loop wynosi FALSE wtedy wykonywanie zadania zostaje przerwane. Jeśli natomiast pole loop ma wartość TRUE węzeł zaczyna wykonywać następny cykl.
Węzeł TimeSensor należy do grupy węzłów "zależnych od czasu". Do tej grupy należą również takie węzły jak AudioClip i MovieTexture. Wszystkie te węzły mają zbliżoną budowę - wszystkie mianowicie zawierają pola loop, startTime i stopTime. Dlatego niżej przedstawione zasady działania węzła TimeSensor odnoszą się również do węzłów AudioClip i MovieTexture.
Kiedy węzeł TimeSesor w polu loop ma wartość TRUE i wartość pola startTime jest większa bądź równa wartości w polu stopTime wtedy węzeł będzie wykonywał swoje zadanie w nieskończoność lub do momentu gdy wartość w polu stopTime będzie większa od wartości w polu startTime.
W momencie gdy węzeł TimeSensor zostaje uaktywniony generuje zdarzenie isActive o wartości TRUE, natomiast gdy węzeł zostaje zatrzymany genruje zdarzenie isActive o wartości FALSE. Są to jedyne przypadki, w których zdarzenie isActive jest generowane.
Węzeł TimeSensor jest nieaktywny dopóki wartość pola startTime nie zostanie odczytana. Kiedy czas rzeczywisty równy jest wartości pola startTime zdarzenie isActive zostaje wygenerowane, przybiera wartość TRUE i węzeł się uaktywnia. Kiedy węzeł TimeSensor jest powiązany z innym węzłem trasą ROUTE, powinien sprawdzić czy jest aktywny, a jeśli tak to powinien wysłać zdarzenie isActive o wartości TRUE oraz wszystkie inne potrzebne zdarzenia. Jednakże jeśli węzeł będzie nieaktywny przed przeczytaniem pliku wtedy żadne ze zdarzeń nie zostanie wygenerowane do czasu kompletnego ukończenia czytania pliku.
Oprócz wyżej wspomnianych metod na zatrzymanie i uaktywnienie działalności węzła istnieją jeszcze inne. Mianowicie kiedy węzeł TimeSensor otrzyma zdarzenie set_loop o wartości FALSE, wtedy wykonywanie pracy węzła zostaje kontynuowane do końca cyklu i węzeł się dezaktywuje. Jeśli natomiast wartość pola loop wynosi FALSE nie koniecznie musi to oznaczać dezaktywację węzła na końcu cyklu, gdyż wcześniej może nastąpić zastąpienie tej wartości, przez nadchodzące zdarzenie, wartością TRUE.
Kiedy aktywny węzeł TimeSensor przyjmie zdarzenie set_startTime zostaje ono zignorowane. Dzieje się tak również w przypadku gdy zostanie przyjęte zdarzenie set_stopTime i jego wartość jest mniejsza bądź równa wartości pola startTime. W momencie gdy aktywny węzeł TimeSensor przyjmie zdarzenie set_stopTime którego wartość jest większa od wartości pola startTime a jednocześnie mniejsza bądź równa chwili obecnej to w efekcie otrzymamy pole stopTime którego wartość jest równa chwili obecnej. Oznacza to, wygenerowanie ostatnich zdarzeń (isActive = FALSE) i zdezaktywowanie węzła. Zdarzenie stopTime_changed przyjmuje wartość zdarzenie set_stopTime.
Węzeł TimeSensor może zostać zrestartowany podczas swojej aktywności poprzez wysłanie zdarzenia set_stopTime o wartości równej chwili obecnej (co spowoduje, że węzeł się unieaktywni) oraz wysłać zdarzenie set_startTime o wartości chwili obecnej lub jakiegokolwiek innej chwili w przyszłości. Ważne jest by zachować odpowiednią kolejność wysyłania zdarzeń (najpierw set_stopTime a potem set_startTime) w celu zapewnienia powstania właściwych zachowań.
Wartości domyślne dla każdego pola węzła TimeSensor
zostały tak ustawione, że jeśli nie podamy żadnych nowych wartości to po
załadowaniu węzeł będzie nieaktywny i żadne ze zdarzeń nie zostanie wysłane.
Węzeł TimeSensor
możemy uaktywnić od razu po załadowaniu wpisując w pole loop
wartość TRUE.
Pomimo złożonej konstrukcji węzeł TimeSensor należy dobrze poznać, gdyż jest on wszelką podstawą do "poruszenia" naszego świata. Bez niego nie mogłyby działać żadne czujniki, animacje czy ruchome węzły Viewpoint. Nie można by było również dołączyć do świata żadnego dźwięku czy też pliku filmowego. Jednym słowem świat byłby nieciekawy i mało atrakcyjny - a takich przecież budować nie chcemy.
Po przyklad odsylam do punktu "Tworzymy animację" gdzie opisane są zasady
łączenia wszystkich elementów potrzebnych do utworzenia animacji.