MAL-Homepage
Inhaltsverzeichnis
MAL Dokumentation: 3d-Graphik
1. EINLEITUNG
Unter den Begriff ´Animationen´ fällt in MAL generell die
dreidimensionale Darstellung von Objekten (Betrachtung
mit Rot/Grünbrille), nicht nur bewegte Objekte. Das bedeutet,
daß auch die Bearbeitung von Schaftformen auf Animationen
beruht. Die Liste aller zu diesem Kapitel gehörenden Worte
kann unter Topic animation
gefunden werden.
Rot/Grünbrille:
Für die Herstellung einer Rot/Grünbrille besorgt man sich
am Besten 3mm Acrylglas (=Pexiglas) und lässt dieses bei
einem Diskont-Brillenanbieter in irgendeine preisgünstige
Brillenfassung einglasen. Das linke Glas muss rot und das
rechte grün sein. Bei richtiger Wahl der Glasfärbungen müssen
die roten Linien im roten Glas verschwinden und umgekehrt
die grünen Linien im grünen Glas unsichtbar werden. Fall man
keinen geeigneten Farbton findet, kann man auch die Farben
der 3d-Darstellung anpassen. Sie sind in der Datei 'screen.cpu'
in der Prozedur 'init_colortable()' definiert. Die Indizes
der verwendeten Farben sind in der Datei '3d.cpu' mit den
Bezeichnungen BLAU und ROT definiert.
Einstieg und Demo:
Für den Test der Rot/Grünbrille und zum Gewöhnen an die
stereoskopische 3d-Darstellung kann das Wort
wuerfel im Folder
'schaft_graphik' verwendet werden. Der Aufruf kann mit
private \ schaft \ graphik \ wuerfel
erfolgen.
3d-Raumspuren:
Speziell für die Bearbeitung von Raumspuren (Trajektorien)
wie sie in der Bewegungsanalyse häufig anfallen, wurde basierend
auf den grundlegenden MAL-Worten eine Menge von Klassen
entwickelt, die die Handhabung von dreidimensionalen Zeitreihen
und Figuren (Strichfiguren) erleichtert.
Das Animationsmenü:
Häufig wird für die Darstellung von 3d-Objekten das Wort
anima_bedienung
verwendet. Es startet ein Menü mit folgendem Aussehen:
MAL-Homepage Inhaltsverzeichnis
2. KLASSEN FÜR DIE 3D-BEARBEITUNG
Trajektorien sind Raumspuren, also Zeitreihen von dreidimensionalen
Vektoren. Die Klassen für die Bearbeitung von Trajektorien sind im
3d-Folder (Public-Pool) definiert. Die entsprechenden Interfaces können
mit
public \ 3d \ interfaces >voc
ins Vokabular geladen werden.
Unter anderem sind folgende Klassen im 3d-Folder zu finden:
MAL-Homepage Inhaltsverzeichnis
2.1. Trajektorien
Die Klasse
trajectory_class
dient zum Beschreiben einer einzelen 3d-Raumspur (=Trajektorie).
Eine Trajektorie besteht aus drei gleich langen Zeitreihen die jeweils
eine Raumkoordinate (x, y und z) enthalten. Die Datenstruktur einer
Instanz von trajectory_class
sieht folgendermaßen aus:
[ class=trajectory_class x=[ ... ] y=[ ... ] z=[ ... ] ]Der Standardkonstruktor für Instanzen der trajectory_class hat folgende Syntax:
x y z -> thiswobei x, y und z jeweils Realverbunde oder Realzahlen mit den Zeitreihen einer Koordinate sind.
[ class=trajectories_class traces=[ ... ] connections=[ ...] ]Die Variable traces ist ein Verbund mit allen Trajektorien (jeweils Instanzen von trajectory_class) und connections ist ein Verbund mit der Verbindungsliste.
MAL-Homepage Inhaltsverzeichnis
2.2. Orientierungen
Orientierungen werden in MAL üblicherweise in der Form
[ R v ]dargestellt, wobei R die Drehmatrix in der Form
[ [ r11 r12 r13 ] [ r21 r22 r23 ] [ r31 r32 r33 ] ]und v der Verschiebungsvektor in der Form
[ x y z ]ist. Bei zeitabhängigen, also bewegten Orientrierungen müssen die einzelnen Variablen jeweils Zeitreihen sein. Damit die Berechnungen mit der daraus resultierenden doch etwas komplizierteren Datenstruktur möglichst einfach sind, kann die Klasse orientation_class verwendet werden, die ihrerseits die Klasse 3d_matrix_class für die Bearbeitung der Drehmatrix und die Klasse trajectory_class für den Verschiebungsvektor verwendet.
MAL-Homepage Inhaltsverzeichnis
2.3. Der 3d-Arbeitsraum
Die Klasse 3d_workspace_class
unterstützt die Darstellung mehrerer 3d-Objekte in einem gemeinsamen
Arbeitsraum. Das ist besonders für den Vergleich von verschiedenen
Figuren nützlich. Mit dem Konstruktor create_3d_workspace
wird ein leerer Arbeitsraum eingerichtet. Diesem können mit insert
ein oder mehrere Objekte (Instanzen der Klasse
trajectories_class) eingefügt
werden, wobei die Objekte mit Namen versehen sein sollten, damit sie
nachher im Arbeitsraum identifiziert werden können.
Beispiel (Vergleich einer großen mit einer kleinen Variante der Figur "figur"):
Interfaces und Daten laden:
public \ 3d \ interfaces >voc
"gangdat.met" meta> >> figur
Workspace einrichten:
create_3d_workspace >> workspace
Figuren eintragen:
workspace
figur 0.15 * "gross" >name insert
figur 0.05 * "klein" >name insert -> workspace
Blättern und animieren:
workspace browse anima
Die Funktion browse zeigt eine Tabelle mit den im Arbeitsraum
eingetragenen Objekten. Sie sieht beim obigen Beispiel folgendemaßen aus:
MAL-Homepage Inhaltsverzeichnis
3. WORTE FÜR DIE DARSTELLUNG VON 3D-OBJEKTEN
Eine Zusammenfassung aller für die Darstellung und
Bearbeitung von 3d-Objekten vorhandenen Worte
findet man unter Topic animation.
Bei der Darstellung dreidimensionaler Objekte wird
folgendermaßen vorgegangen:
Zuerst werden sogenannte ´Animationsobjekte´ erstellt, die dann
unter Verwendung verschiedenster Worte dargestellt, bewegt oder
manipuliert werden können. Ein Animationsobjekt
ist ein Datensatz, der ein dreidimensionales Objekt (und bei
bewegten Objekten sein Zeitverhalten) beschreibt. Es wird als
Variable im Vokabular geführt und wird von den entsprechenden
Worten per Name adressiert. Dementsprechend werden
Animationsobjekte auch genauso wie normale Variablen
automatisch gelöscht, wenn die Doppelpunktdefinition, in
der sie definiert wurden, verlassen wird.
MAL-Homepage Inhaltsverzeichnis
3.1. Einrichten von Animationsobjekten
Das Wort >anima dient
zum Einrichten eines Animationsobjekts, das aus Geraden besteht
(Strichfigur). Es wird mit den Koordinatenwerten der Eckpunkte
und einer Verbindungsliste versorgt. Ein bewegtes Objekt wird
definiert, indem als Koordinatenwerte (gleich lange) Realverbunde
übergeben werden.
Syntax:
[ x1 y1 z1 x2 y2 z2 ... ] [ verb1 .. ] objname ->
[ form schichtd marken bitliste kurven ] objname ->
[ rille1 rille2 ... ]wobei, ´rilleI´ ein Realverbund oder ein komprimierter Realverbund ist, der die Radien einer Längsrille enthält. Die Radien der Längsrillen sind in Meter und in der Reihenfolge von distal nach proximal anzugeben.
[ winkel höhe ]beschrieben, wobei der Winkel in rad und die Höhe in Meter, gemessen von der Stumpfkuppe, angegeben ist.
[ winkel höhen ]wobei ´winkel´ und ´höhen´ jeweils Realverbunde oder komprimierte Realververbunde sind. Die Angaben sind wieder in rad bzw. Meter von der Stumpfkuppe gemessen.
MAL-Homepage Inhaltsverzeichnis
3.2. Lesen von Animationsobjekten
Mit den Wort anima> kann
ein Animationsobjekt in einen normalen Stackeintrag zurückgewandelt
werden. Je nachdem, ob es mit
>anima
oder polar>anima erzeugt wurde,
erhält man die entsprechenden Datensätze von
>anima oder
polar>anima zurück.
Das ist von Wichtigkeit, wenn am Animationsobjekt eine Veränderung
vorgenommen wurden (z.B. Modellierung an einem Schaft).
MAL-Homepage Inhaltsverzeichnis
3.3. Darstellung
Die Darstellung von Animationsobjekten erfolgt stereoskopisch.
Die Bilder müssen mit einer Rot/Grün-Brille (linkes Glas rot,
rechtes Glas grün) betrachtet werden. Zum Bewegen der Objekte
(drehen und verschieben), kann die Maus
(Worte anima_rotate,
anima_shift und
anima_shift_depth)
oder die 3d-Lasermaus (Wort
anima_move_object)
verwendet werden.
Das Drehen eines 3d-Objektes mit der normalen 2d-Maus erfolgt mit dem
Wort anima_rotate.
Dabei stellt man sich am besten eine das Objekt einschließende virtuelle
Kugel vor, die bei gedrückter linker Maustaste an der Vorderseite
mitgenommen wird. Das Verschieben von 3d-Objekten erfolgt mit den
Worten anima_shift
(Links/Rechts und Auf/Ab) oder
anima_shift_depth
(Vor/Rück), jeweils mit gedrückter linker Maustaste. Mit der rechten Maustaste
werden die Worte jeweils beendet.
Werden mehrere Objekte gleichzeitig dargestellt, so kann mit der 2d-Maus
keine Auswahl getroffen werden. Man kann aber mit dem Wort
anima_mark ein Objekt
(oder durch wiederholtes Aufrufen auch mehrere Objekte) markieren.
Es werden dann bei den nachfolgenden Aufrufen von anima_rotate oder
anima_shift nur die markierten Objekte bewegt.
Beim Arbeiten mit der 3d-Maus kann das Wort
anima_move_object
zum Bewegen (sowohl Verdrehen als auch Schieben) der Objekte verwendet werden.
Sind mehrere Objekte dargestellt, so erscheint zusätzlich ein 3d-Cursor
(kleines Kreuz) im Arbeitsraum. Der Cursor kann mit der unteren Maustaste
gehalten werden. Mit der oberen Maustaste kann das ausgewählte Objekt
(jenes, in dessen Nähe der 3d-Cursor steht) bewegt werden. Steht der
3d-Cursor abseits aller Objete, so werden alle Objekte gemeinsam bewegt.
Mit dem Wort anima_move&run
können die Objekte mit der 3d-Maus bewegt werden, während sie laufen.
Die Laufgeschwindigkeit kann dabei durch Auf- und Abschieben der
2d-Maus eingestellt werden.
MAL-Homepage Inhaltsverzeichnis
3.4. Bewegte Objekte
Ein Animationsobjekt, das mit
>anima eingerichtet
wurde und als Koordinatenwerte Verbunde angegeben hat, kann man mit
dem Wort anima_run als
Film laufen lassen. Durch Auf- und Abschieben
der 2d-Maus bei gedrückter linker Maustaste kann die Laufgeschwindigkeit
eingestellt werden. Dabei wird nicht die Bildfrequenz verändert, sondern es werden
entsprechend feine Abstufungen bei der Interpolation von Zwischenbildern gewählt,
das heißt, die Anzahl der Bilder pro Sequenz wird verändert.
Mit anima_jogg kann ein
Standbild erzeugt werden, wobei mit der Maus bei gedrückter linker Maustaste
der Zeitpunkt innerhalb der Sequenz verschoben werden kann (unten = Angang, oben = Ende).
MAL-Homepage Inhaltsverzeichnis
3.5. Orientierungsdaten
Die Orientierungsdaten (Drehmatrix und Verschiebungsvektor)
eines Animationsobjektes können mit dem Wort
anima_set_orient
eingestellt und mit
anima_get_orient
gelesen werden.
Orientierungsdaten haben immer die Form:
[ drehmatrix verschiebungsvektor ]wobei ´drehmatrix´ die Form
[ [ r11 r12 r13 ] [ r21 r22 r23 ] [ r31 r32 r33 ] ]und ´verschiebungsvektor´ die Form
[ v1 v2 v3 ]besitzt.
MAL-Homepage Inhaltsverzeichnis
4. SCHAFTBEARBEITUNG
Da Stumpf- und Schaftformen in MAL in Polarkoordinatenform (streng genommen
´Zylinderkoordinatenform´) gespeichert sind, wird für derartige Objekte auch der
Begriff Polarobjekte verwendet. Ein vollständiger Datensatz für
die Beschreibung eines Polarobjektes besteht aus
MAL-Homepage Inhaltsverzeichnis
4.1. Wählen des Teilbereichs
Mit dem Wort polar_select_part
kann für die Darstellung ein rechteckiger Teilbereich eingestellt werden. Der
Teilbereich wird durch die linke untere und rechte obere Ecke definiert. Die
Eingabe erfolgt, indem man eine Ecke des gewünschten Teilberechs anklickt,
die Maustaste hält und den Curser zur zweiten Ecke zieht. Ein strichliertes
Rechteck zeigt dabei den gerade gewählten Bereich an. Wird das Wort verlassen,
bevor ein Eckpunkt angeklickt wurde, so wird die ganze Form wieder dargestellt.
Das Wort wirkt nur auf die Darstellung und verändert die gespeicherten Formdaten nicht.
MAL-Homepage Inhaltsverzeichnis
4.2. Kurven und Schnitte
Kurven dienen zum Ausschneiden von Teilen aus Stumpf- oder
Schaftformen. Eine fertige Kurve ist ein geschlossener Linienzug.
Es können mehrere Kurven gezeichnet werden, bevor mit dem
Wort polar_cut
die entsprechenden Teile ausgeschnitten werden. Nach der
Anwendung von polar_cut
kann die Form der Kurven nicht mehr verändert werden (außer
durch neu Zeichnen und neu Schneiden). Bei der gleichzeitigen
Verwendung mehrerer Kurven ist die Zeichenrichtung zu beachten.
Will man zum Beispiel zwei ovale Segmente gleichzeitig ausschneiden,
so müssen entweder beide im, oder beide gegen den Uhrzeigersinn
gezeichnet werden, sonst kann das Wort
polar_cut die Teile nicht
richtig zuordnen.
Es empfiehlt sich, zum Zeichnen der Kurven das Polarobjekt
im Flachmodus (Wort
polar_flat_mode)
darzustellen. Eine Kurve kann auch um den Stumpf herum geschlossen werden.
Damit man im Flachmodus wieder zum Anfangspunkt zurück findet, wird ein
kleiner Ring am Gegenüberende der aufgerollten Form eingeblendet. Man muß,
um das zu erreichen, aber in der Nähe des Randes (beim 0-Grad Winkel) mit
der Kurve beginnen.
Zum Zeichnen einer Oberflächenkurve auf einem Polarobjekt dient
das Wort polar_draw_curve.
Die Kurve wird durch Stützpunkte und Tangenten in den Stützpunkten definiert.
Jeder Stützpunkt wird durch Anklicken mit der 3d-Maus definiert.
So lange die obere Maustaste mit gehalten wird (beim 3d-Arm die
mittlere Maustaste), kann die Tangente vom Stützpunkt weg gezogen
werden. Gleichzeitig wird das neue Kurvenstück (vom letzen Stützpunkt
zum aktuellen) strichliert dargestellt. Nach dem Auslassen der Maustaste
wird das neue Kurvenstück durchgehend gezeichnet. Die Länge der Tangente
ist jeweils ein Maß für den Wirkungsbereich des Stützpunktes, also die
Krümmung der Kurve im Stützpunkt (längere Tangente=weniger Krümmung).
Unfertige Kurven (also Kurven, die nicht geschlossen sind) können auch bei
einem weiteren Aufruf von polar_draw_curve
(zum Beispiel, nachdem das Objekt bewegt wurde) weiter gezeichnet werden.
Eine unmittelbare Korrektur ist nicht möglich. Erst nachdem der Kurvenzug
geschlossen wurde, also zum Startpunkt zurückgeführt ist, können mit dem
Wort polar_modi_curve
die Stützpunkte und Tangenten verschoben werden. Dabei ist mit dem 3d-Cursor
jeweils der gewünschte Stützpunkt anzuklicken. Daraufhin erscheint die Tangente
und die beiden angrenzenden Kurvenstücke werden strichliert. Der Stützpunkt oder
die Tangentenspitze können dann direkt mit der 3d-Maus genommen und verschoben
werden. Setzt man den 3d-Cursor fernab von einem Stützpunkt und drückt kurz die
obere (mittlere) Maustaste, so wird der Kurvenzug wieder durchgehend gezeichnet.
Das Zeichnen mit polar_draw_curve
und das Verändern mit ´polar_modi_curve´ greift auf einen internen Datensatz zu, der mit
anima> nicht gelesen werden kann. Die
Kurven werden, so lange sie mit diesen Worten bearbeitbar sein sollen als eine Kette
von Bezierkurven gespeichert. Erst mit dem Wort
polar_save_curves werden
sie in die normalen Koordinatendaten umgewandelt und mit ´anima>´ abfragbar. Auch
polar_cut arbeitet erst nach dem Aufruf
von polar_save_curves korrekt.
Gesicherte Kurven sind allerdings nicht mehr veränderbar. Im Zuge dieser Umwandlung
wird auch festgestellt, ob die Kurven über die 0-Grad Kante gehen. In diesem Falle werden
sie in Teilstücke zerlegt. Daher kann es vorkommen, daß sich in dem mit
anima> erhaltenen Datensatz mehrere Kurven
befinden, obwohl z.B. nur eine gezeichnet wurde.
Die Datensätze der beiden beim Zerschneiden mit polar_cut
erhaltenen Teile unterscheiden sich nur durch die Bitlisten (die eine ist exakt die
Invertierung der anderen). Das heißt, es sind auch stets die nicht dargestellten
Oberflächenpunkte und Marken mit gespeichert. Mit dem Wort
polar_draw_complete
(Gegenteil=polar_draw_incomplete)
kann das ganze Objekt dargestellt werden. Dieses Wort hat aber nur Auswirkung auf die
Darstellung, nich auf den Datensatz.
Zum Zusammenfügen von Teilen oder zum Verschieben der Bezugsachse existiert
das Wort polar_&. Es berechnet ein neues
Objekt, mit einer neuen (wählbaren) Winkelanzahl, Scheibendicke und Bezugsachse. Die
Berechnung ist aber aufwendig und dauert einige Sekunden.
MAL-Homepage Inhaltsverzeichnis
4.3. Anbringen von Modellierungen
Für das Zurechtschieben von Modellierungen existieren die
Worte polar_adapt,
polar_adapt_linear
und polar_adapt_ring,
wobei die ersten beiden für das punktgenaue Zurechtschieben und das dritte
für das grobe Zurechtschieben des Sitzringes dient. Beide haben die gleiche Syntax:
stumpf muster namen ->stumpf und muster sind Namen von Polarobjekten. Die Korrekturen sind in muster anzugeben und werden an die Markierungspunkte von stumpf angepaßt, wobei jene Punkte berücksichtigt werden, deren Namen in der Liste namen angeführt sind. Das Ergebnis wird in das Polarobjekt muster gespeichert.
MAL-Homepage Inhaltsverzeichnis
4.4. Längen- und Umfangmasse
Zum Messen von Umfangmaßen dient das Wort
polar_get_circum.
Es ist mit einer Liste von Höhenangaben zu versorgen und übergibt die in
diesen Höhen gemessenen Umfangmaße. Mit
polar_rel_circum oder
polar_abs_circum können
die Umfangmaße an bestimmten Höhen relativ beziehungsweise absolut eingestellt
werden. In den nicht angegebenen Bereichen werden sinusförmige
Interpolationskurven verwendet, um Zwischenwerte zu berechnen.
Eine Längenveränderung kann mit dem Wort
polar_set_length
durchgeführt werden. Es ist mit Paaren von alten und neuen Höhenangaben zu
versorgen und dehnt oder staucht die Bereiche zwischen den alten Höhen so,
daß an den neuen Positionen die gleichen Querschnittformen zu liegen kommen,
wie vorher an den alten Positionen. Die Berechnung der Zwischenwerte
erfolgt durch lineare Interpolation.
MAL-Homepage Inhaltsverzeichnis
4.5. Marken und Positionen
Die interaktive Zuordnung von Namen zu Markierungspunkten
kann mit dem Wort
polar_marker_sequence
erfolgen. Dem Wort ist eine Liste von Markennamen zu übergeben.
Der Benutzer wird aufgefordert, die zu den Namen gehörenden
Markierungspunkte der Reihenfolge nach anzuklicken. Voraussetzung ist,
daß sich zumindest gleich viele Markierungspunkte am Polarobjekt befinden,
wie in der Namensliste Einträge sind.
Mit dem Wort polar_locations
können Positionen auf der Schaftoberfläche bestimmt werden, was für die interaktive
Veränderung von Umfangs- oder Längenmaßen erforderlich ist. Die Positionen
werden mit der 3d-Maus oder dem 3d-Arm eingegeben und nach Abschluß des
Wortes (mit beliebiger Tastatur-Taste) in Form von Winkel- und Höhenmaßen
am Stack übergeben.
MAL-Homepage Inhaltsverzeichnis