The K Desktop Environment


Nächste Vorherige Inhalt

  1. Animation

    6.1 Grundlagen

    K4DE benutzt einfache Shellscripten um zu Animationen zu realisieren. Jedes Objekt kann beliebig viele solcher Scripten enthalten. Um die Scripten eines Objektes unterscheiden zu können, hat jedes einen eigenen Namen, üder den das Script dann aufgerufen wird.

    6.2 Scripte bearbeiten

      Um einem Objekt ein Script zuzuweisen, wird über das Kontextmenu des entsprechenden Objektes der Punkt 'Edit Animscript' angewählt. Es erscheint das Fenster zum Anlegen und Editieren von Animationsscripten.



      Das Fenster besteht aus einer Combobox, die den Namen des aktuellen Scriptes anzeigt, einem Button 'Add', einem Button 'Delete', einem Button 'OK' und dem eigentlichen Editierfeld für das Script.



    6.2.1 Anlegen eines Scripts

        Zum Anlegen eines neuen Scriptes wird der Name des Scriptes in die Combobox eingetragen. Das leere Scripte wird angelegt, wenn der Button 'Add' gedrückt wird.

        6.2.2 Bearbeiten eines Scripts

        Mit der Combobox wird das zubearbeitende Script ausgewählt. Hier im beispiel ist das Script 'test'. Wie in jedem Texteditor kann hier der Text bearbeitet werden. Es können Teile markiert, kopiert (STRG-C), verschoben (STRG-X), eingefügt (STRG-V) und gelöscht (Entf) werden. Es gibt kein Kontextmenu in diesem Fenster. Achtung: wird zum Formatieren des Textes ein Tabulator benutzt, muß dieser Kopiert werden, das die Tabulatortaste in ein anderes Feld schaltet.

        6.2.3 Löschen eines Scripts

        Zum Löschen eines Scriptes wird mit der Name des Scriptes mit der Combobox ausgewählt. Das Script wird gelöscht, wenn der Button 'Delete' gedrückt wird. Diese Funktionalität ist allerdings noch nicht implementiert (Button ist ausgegraut).

        6.2.4 Kopieren eines Scripts

        Mit der Combobox wird das zukopierende Script ausgewählt. Danach wird in die Combobox der neue Name eingetragen und der Button 'add' gedrückt.

      6.3 Scriptsprache

      Das Script wird beim Aufgeruf als eine auszuführende Datei gespeichert und in einem neue Prozeß gestartet. Damit das funktioniert muß in der ersten Zeile der Interpreter des Scripts angegeben werden. Die Zeile sieht bei einem Shellscript gewöhnlich so aus »#!/bin/sh«, der Interpreter ist das Programm /bin/sh. Danach kommt dann der Scriptcode. Kommentarzeilen beginnen immer mit einem '#'. Die Syntax von Shellscripten wird hier nicht weiter erläutert . Wichtiger ist die Erklärung der Kommunikation zwischen K4DE und dem Script. Die beiden Prozesse kommunzieren über Pipes (oder auch Kanäle genannt). Welche Kanäle zur Kommunikation genutzt werden wird dem Shellscript mittels Übergabeparametern mitgeteilt. Der erste Übergabeparameter enthält die Nummer des Lesekanals, der zweite die Nummer des Schreibkanals.


# The readchannel

CRead=$1

# The writechannel

CWrite=$2


Die weiteren Parameter enthalten Daten über die aktuelle Zeit, die Startzeit, die Endzeit und die Schrittweite, um die die aktuelle Zeit mit jedem Bild der Animation (Frame) hochgezählt wird.


# The current time in ms

Time=$3

# The start time in ms

StartTime=$4

# The end time in ms

EndTime=$5

# The stepsize in ms

StepSize=$6


      6.4 Scriptkommunikation

      Damit das Script dem Editor K4DE mitteilen kann, wie es die Objekte manipulieren soll, gibt es ein paar Kommandos. Diese werden einfach über den Schreibkanal an K4DE geleitet. Damit es keine Komplikationen bei der Kummunikation gibt, wurde das Script 'basic.sh' erstellt, in dem die Kommunikation in Funktionen gekapselt wurde.

        6.4.1 Die Funtion: CALL

# CALL(command,parameterstring)

function CALL()

{

echo "CMNDTHIS $1 $2" 1>&$CWrite

read Result 0<&$CRead

echo $Result

}



Die Funktion CALL ruft eine Methode oder ein Script auf, dessen Name als erster Parameter übergeben wird. Der zweite Parameter enthält die Parameter für die Methode oder das Script.

        6.4.2 Die Funktion: OBJECT

# OBJECT(name,command,parameterstring)

function OBJECT()

{

echo "CMND$1 $2 $3" 1>&$CWrite

read Result 0<&$CRead

echo $Result

}


Die Funktion OBJECT ist der Funktion CALL sehr ähnlich. Der einzige Unterschied besteht in dem Bezugsobjekt, dessen Name hier als erster Parameter übergeben wird. Das Bezugsobjekt bei CALL ist das Objekt, von dem das Script aufgerufen wurde und heißt THIS. Gibt man hier einen anderen Namen an, so wird nach einem Kindobjekt mit diesem Namen gesucht, und die entsprechende Methode oder Script des Kindes benutzt.

        6.4.3 Die Funktion: PRINT

        # PRINT(string)

        function PRINT()

        {

        echo "PRNT$1" 1>&$CWrite

        # Wait for "OK"

        read Result 0<&$CRead

        }


Die Funktion PRINT macht nichts anders als den Inhalt des ersten Parameter auf der Konsole von K4DE auszugeben. Diese Funktion ist also nur zu Debuggingzwecken gedacht.

        6.4.4 Die Funktion: ERROR

# ERROR(string)

function ERROR()

{

echo "ERRR$1" 1>&$CWrite

# Wait for "OK"

read Result 0<&$CRead

}


Auch die ERROR-Funktion ist zu Debuggingzwecken gut. Sie unterscheidet sich von PRINT nur durch die Ausgaben über den Standarderrorkanal.

        6.4.5 Die Funktion: EXIT

# EXIT()

function EXIT()

{

# Send EXIT (I leave the shell)

echo "EXIT" >&$CWrite

}


Die EXIT-Funktion zeigt dem Editor, daß das Script jetzt abgearbeitet ist, und der ausführende Prozeß beendet wird. Die EXIT-Funktion muß immer der letzte Befehl in dem Script sein.

        6.4.6 Die Funktion: CALC

# CALC(string)

function CALC()

{

echo "CALC $1" 1>&$CWrite

read Result 0<&$CRead

echo "$Result"

}


Die CALC-Funktion ist eine mächtige Funktion zum Berechnen von arithmetischen Ausdrücken. Der erste Parameter wird als arithmetischer Ausdruck interpretiert und dessen Ergebnis liefert die Funktion CALL zurück. Die Möglichkeiten, die CALC bietet sind abhängig von der Implementation der Funktion 'evaluate', deren Dokumentation sich ebenfalls in diesem Handbuch befindet.

        6.4.7 Die Funktion: LOAD

# LOAD(name)

function LOAD()

{

echo "LOAD$1" 1>&$CWrite

read Result 0<&$CRead

echo "$Result"

}


Um Werte speichern und laden zu können, die über mehrere Frames benötigt werden, existieren die Funktionen LOAD und SAVE. Die Funktion LOAD hat nur einen Parameter, der den Variablennamen angibt, deren Wert geladen werden soll. Diesen Wert gibt die Funktion LOAD dann zurück.

        6.4.8 Die Funktion: SAVE

# SAVE(name,value)

function SAVE()

{

echo "SAVE$1=$2" 1>&$CWrite

read Result 0<&$CRead

}


Die SAVE-Funktion ist das Gegenteil von LOAD. Ihr werden zwei Parameter übergeben. Der erste beinhaltet den Variablennamen, der zweite den Wert der Variablen. Den Wert bekommt man mit der LOAD-Funktion wieder zurück.

        6.4.9 Die Funktion: ARGC

# ARGC()

function ARGC()

{

echo "ARGC" 1>&$CWrite

read Result 0<&$CRead

echo $Result

}


Wenn ein Script von einem anderen Script aufgerufen wird, ist es manchmal Sinnvoll, Parameter mitzuübergeben. Diese Funktion und die beiden folgenden sind für die Parameterübergabe erstellt worden. ARGC werden keine Parameter übergeben, liefert aber die Anzahl der Parameter zurück, die diesem Script übergeben wurden.

        6.4.10 Die Funktion: ARGT

# ARGT(argn)

function ARGT()

{

argn=$1

echo "ARGT$argn" 1>&$CWrite

read Result 0<&$CRead

echo $Result

}


Diese Funktion ermittelt den Typen des Parameters, der an n-ter Stelle steht. Die Funktion ARGT wird mit der Nummer des Parameters aufgerufen. Die Typen sind BOOL,REAL,VECTOR,TEXT.

        6.4.11 Die Funktion: ARGV

# ARGV(argn)

function ARGV()

{

argn=$1

echo "ARGV$argn" 1>&$CWrite

read Result 0<&$CRead

echo $Result

}


ARGV gibt den Wert des n-ten Parameters zurück. Für die einzelnen Typen sind die folgenden Werte möglich:

BOOL: 'TRUE', 'true', 'FALSE', 'false'

REAL: eine beliebige Fließkommazahl

VECTOR: '<REAL,REAL,REAL>'

TEXT: beliebige Zeichenketten

Zu den ARG-Funktionen siehe auch »data/model/arg-anim-test.3dds«.



6.5 Scripte und Methoden

Jedes Objekt hat seine eigenen Funktionen, die Methoden. Methoden für alle skalierbaren Objekte sind zum Beispiel rotate, translate, scale, getrotation, gettranslation, getscalation, getangle, getposition, getsize. Mit diesen Methoden werden Objekte direkt verändert. Allerdings bleiben die Originalwerte der Objekte erhalten, so daß nach Beendigung der Animation alles wie vorher aussieht.

Methoden sind also nicht änderbare Grundfunktionen.

Scripte dagegen können beliebig komplex gestaltet werden, andere Methoden und Scripte aufrufen und Methoden überschreiben. Hier ist jedoch Vorsicht geboten, Methoden die durch Scripte überschrieben wurden, können nicht mehr aufgerufen werden, bis das entsprechende Script umbenannt oder gelöscht wurde (,was zur Zeit nicht möglich ist).

In Zukunft sollen Scripte, so wie manche Methoden, auch Ergebnisse zurück liefern können.

6.6 Der erste Schritt 'main-step'

Damit überhaupt eine Animation zu Stande kommt, muß das Worldobjekt ein Script enthalten, welches 'main' heißt. Diese Script wird dann mit jedem Animationsschritt aufgerufen. Von diesem Script aus können dann alle anderen Scripte aufgerufen werden.

6.7 Die Methoden der Objekte

6.7.1 Skalierbare Objekte

Zunächst haben nur skalierbare Objekte Methoden.

        1. rotate <x,y,z>

          Dreht das Objekt im Winkel um die X-, Y- und Z-Achse, wobei x, y und z den jeweiligen Winkel für die Achsenrotation in Grad angeben. Die Rotation geschieht in des Objekts eigenen Koordinatensystem.

        2. translate <x,y,z>

          Verschiebt das Objekt auf der X-, Y- und Z-Achse, wobei x, y und z den jeweiligen Abstand für die Achsenverschiebung angeben. Die Translation geschieht in des Objekts eigenen Koordinatensystem.

        3. scale <x,y,z>

          Skaliert das Objekt auf der X-, Y- und Z-Achse, wobei x, y und z den jeweiligen Skalierungsfaktor für die Achsenskalierung angeben. Die Skalierung geschieht in des Objekts eigenen Koordinatensystem.

        4. getrotation

          Diese Methode liefert den Vektor <x,y,z> zurück, der die Summe aller <x,y,z> der Aufrufe von rotate bildet.

        5. gettranslation

          Diese Methode liefert den Vektor <x,y,z> zurück, der die Summe aller <x,y,z> der Aufrufe von translate bildet.

        6. getscalation

          Diese Methode liefert den Vektor <x,y,z> zurück, der das Produkt aller <x,y,z> der Aufrufe von scale bildet.

        7. getangle

          Diese Methode liefert den Vektor <x,y,z> zurück, der die Summe aller <x,y,z> der Aufrufe von rotate bildet, plus dem eigentlichen Rotationsvektor des Objektes.

        8. getposition

          Diese Methode liefert den Vektor <x,y,z> zurück, der die Summe aller <x,y,z> der Aufrufe von translate bildet, plus dem eigentlichen Translationsvektor des Objektes.

        9. getsize

          Diese Methode liefert den Vektor <x,y,z> zurück, der das Produkt aller <x,y,z> der Aufrufe von scale bildet, multipliziert mit dem eigentlichen Skalierungsvektor des Objektes.





Dortmund, 10.04.1999

Nächste Vorherige Inhalt