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.