Tworzymy animację 
Poznaliście już wszystkie elementy, które są niezbędne do utworzenia nimacji. Teraz możemy zająć się połączeniem tych elementów a tym samym stworzeniem animacji. Jak czytaliście w poprzednich punktach do utworzenia animacji potrzebne jest zdefiniowanie węzła TimeSensor, któregoś z węzłów interpolacji oraz połączenie zdarzeń między tymi elementami komendą ROUTE.

Na samym początku musimy jednak zdefiniować sam obiekt, który będziemy poddawać animacji. Proponuję abyśmy zdefiniowali dwa obiekty - jeden będzie stał w miejscu i służył jako punkt odniesienia dla drugiego - ruchomego obiektu.

#VRML V2.0 utf8

DEF Nieruchomy Transform {
                    translation 0 0 0
                    children [
                        Shape {
                            appearance Appearance {
                                          material Material {
                                            diffuseColor 0 1 0
                                                            }
                                                  }
                            geometry Box {}
                             }
                            ]
                        }

DEF Ruchomy Transform {
                 translation 5 0 0
                 children [
                     Shape {
                         appearance Appearance {
                                       material Material {
                                         diffuseColor 1 0 0
                                                         }
                                               }
                            geometry Cone {}
                           }
                          ]
                     }
 
Zobaczmy jak to wygląda - anim1.wrl.

Teraz zdefiniujmy węzeł TimeSensor. Aby nasza animacja zadziałała musimy zdefiniować tylko dwa pola tego węzła (reszta wartości może pozostać domyślna). W polu loop wstawiamy wartość TRUE, aby animacja rozpoczęła się wraz z załadowaniem świata, a w polu cycleInterval zmniejszamy dziesięciokrotnie czas trwania animacji wpisując wartość 10:

DEF Czas TimeSensor {
                  loop TRUE
                  cycleInterval 10
                    }

Następnie musimy ustalić trasę jaką nasz stożek ma wykonać. W tym celu definiujemy węzeł PositionInterpolator w polu key wpisując równe odstępy między "punktami zwrotnymi animacji". Jeżeli chcemy aby obiekt przesuwał się wolniej lub szybciej między konkretymi "punktami zwrotnymi" to musimy odpowiednio zmniejszać lub zwiększać różnicę między tymi wartościami. Ważne jest również to aby w polu key wartości przybierały liczby między 0 a 1. W polu keyValue określamy punkty w przestrzeni trójwymiarowej, do których nasz obiekt ma zmierzać:

DEF Interpolacja PositionInterpolator {
             key      [ 0, 0.25, 0.5, 0.75, 1 ]
             keyValue [ 5 0 0, 0 5 0, -5 0 0, 0 -5 0, 5 0 0 ]
                                      }

Teraz musimy jedynie powiązać zdarzenia wysyłane przez zdefiniowane węzły. Najpierw musimy powiązać węzeł TimeSensor z węzłem PositionInterpolator. Węzeł TimeSensor jest domyślnie aktywny w momencie załadowania świata (enabled TRUE), powinniśmy więc pobudzić teraz węzeł PositionInterpolator, który jak pamiętamy zostanie zaktywowany w momencie przyjęcia zdarzenia set_fraction. Definicja komendy ROUTE dla połączenia tych dwóch zdarzeń będzie wyglądała następująco:

ROUTE Czas.fraction_changed TO Interpolacja.set_fraction

W tej chwili powinniśmy tylko przypisać przesunięcie, które oferuje węzeł PositionInterpolator, naszemu stożkowi. W tym celu łączymy zdarzenie value_changed węzła PositionInterpolator ze zdarzeniem set_translation węzła Transform, w którym zdefiniowany jest nasz obiekt.

ROUTE Interpolacja.value_changed TO Ruchomy.set_translation

Gotowe! Po połączeniu wszystkich elementów nasz kod źródłowy wygląda następująco:
 

#VRML V2.0 utf8

DEF Nieruchomy Transform {
                    translation 0 0 0
                    children [
                        Shape {
                            appearance Appearance {
                                          material Material {
                                            diffuseColor 0 1 0
                                                            }
                                                  }
                            geometry Box {}
                             }
                            ]
                        }

DEF Ruchomy Transform {
                 translation 0 0 0
                 children [
                     Shape {
                         appearance Appearance {
                                       material Material {
                                         diffuseColor 1 0 0
                                                         }
                                               }
                            geometry Cone {}
                           }
                          ]
                     }

DEF Czas TimeSensor {
                  loop TRUE
                  cycleInterval 10
                    }

DEF Interpolacja PositionInterpolator {
             key [ 0, 0.25, 0.5, 0.75, 1  ]
             keyValue [ 5 0 0, 0 5 0, -5 0 0, 0 -5 0, 5 0 0 ]
                                      }

ROUTE Czas.fraction_changed TO Interpolacja.set_fraction
ROUTE Interpolacja.value_changed TO Ruchomy.set_translation

Zobaczmy teraz nasz przykład - anim2.wrl

Jeżeli chcemy, możemy nasz świat rozbudować wprowadzając jeszcze jeden iterpolator, który będzie naszym obiektem obracał. Po połączeniu efektu obu interpolatorów nasz obiekt będzie się jednocześnie przesuwał i obracał. Dodajmy następujące linie:

DEF Obrot OrientationInterpolator {
                key [ 0, 0.25, 0.5, 0.75, 1 ]
                keyValue [ 1 0 0 0, 1 0 0 1.57,
                           1 0 0 3.14, 1 0 0 4.71, 1 0 0 6.28 ]
                                  }

Jak widać zdefiniowalimy tutaj węzeł interpolujący odpowiadający za obrót obiektu. Teraz, aby go uaktywnić należy go jedynie powiązać zdarzeniami z węzłem TimeSensor oraz żeby obiekt się obracał z węzłem Transform:

ROUTE Czas.fraction_changed TO Obrot.set_fraction
ROUTE Obrot.value_changed TO Ruchomy.set_rotation

Teraz nasz przykład wygląda następująco - anim3.wrl


To wszystko! Prawda, że ładnie wygląda. Myślę, że korzystając z do tej pory zdobytych informacji będziecie potrafili zbudować o wiele bardziej złożone światy VRML niż te tutaj przedstawione. Życzę powodzenia.