Visual Studio Projekt herunterladen
Unsere erste Animation ist eine sich drehende, archimedische Spirale. Fixiert man das Zentrum der rotierenden Spirale eine Zeit lang und blickt danach auf ein anderes Objekt, so stellt sich ein Bewegungsnacheffekt ein.
Für die Umsetzung verwendet das Beispiel die Spiralklasse CSpiral, die ihre eigene Rotation verwaltet und sich auch selbständig zeichnen kann.
In der Datei spiral.h finden sich folgende Attribute.
Sie werden wie üblich im Konstruktor
initialisiert. Die Attribute sind als geschützt bzw.
tun dies auch ausgiebig. Geschützte Attribute
können also indirekt über das Aufrufen
öffentlich zugänglicher (
{
m_rotation += degrees;
}
Sie wird in der
Rotation und Zeichnen der Spirale finden in der Funktion
{
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glRotatef(m_rotation, 0.0f, 0.0f, 1.0f);
Wie im letzten Beispiel angedeutet, gibt es mehrere Matrizen in OpenGL. Die Modelview-Matrix enthält geometrische Transformationen, wie Rotation, Skalierung und Verschiebung, die auf jeden zu zeichnenden Vektor angewendet werden. Hier ist also der richtige Ansatzpunkt, um unsere Spirale, also die gesamte Geometrie, rotieren zu lassen.
Mit
glPopMatrix();
}
Wir machen also alle Änderungen an der Matrix rückgängig, die zwischen Push und Pop stattgefunden haben. Diese Änderung ist in unserem Fall die Rotation der Spirale.
Mit Hilfe des
Befehls
Um Geometrien zu skalieren bzw. zu
verschieben kann man die Funktionen
Das eigentliche Zeichnen der archimedischen Spirale
findet in der
glLineWidth(5);
glBegin(GL_LINE_STRIP);
Danach berechnen und setzen wir die Punkte des Linienzugs durch eine for-Schleife.
{
glVertex2f(x, y);
}
Wem renderCircle() aus dem letzten Beispiel noch in Erinnerung ist: Wir zeichnen hier im Grunde Kreisbahnen mit wachsendem Radius.
Zuerst skalieren wir den Wert von
Der
Radius, um den wir unsere Punkte vom Ursprung entfernen, lassen wir
linear von Null bis
Nach Abarbeiten der Schleife, die unsere Punkte setzt,
beenden wir unseren
Linienzug durch
glEnd();
Die Datei main.cpp unterscheidet sich nur wenig von derjenigen des letzten Beispiels. Die Unterschiede sind:
- Es gibt eine globale Variable
spiral , auf die von allen Funtkionen in main.cpp zugegriffen werden kann. - In der
display -Funktion wird die Animation der Spirale über deren Funtkionrotate kontrolliert, unser Daumenkino also um jeweils einen Schritt weiter bewegt. - Die Spirale wird dort durch Aufruf der
Funktion
render gezeichnet. - Am Ende der
display -Funktion wird mit Hilfe des BefehlsglutPostRedisplay() ein erneutes Zeichnen veranlasst. Auf diese Weise springt GLUT bei der nächsten Gelegenheit wieder in unseredisplay -Funktion, um das nächste Bild zu zeichnen.
Selbständige Programmierung
- Was ist der Unterschied zwischen einer Rotation,
gefolgt von einer Verschiebung gegenüber einer Verschiebung,
gefolgt von einer Rotation? Programmiere beide Varianten mit Hilfe
verschiedener Abfolgen von
glRotatef undglTranslatef und interpretiere das Ergebnis. - Wie oben erwähnt findet die Rotation um eine Achse immer um den Ursprung statt. Durch welche Kombination von Verschiebungen und Rotationen kann man das Rotationszentrum an eine beliebige Stelle innerhalb des Objekts verschieben?
- Programmiere eine logarithmische Spirale. Bei der
logarithmischen Spirale wächst der Radius nicht linear,
sondern exponentiell nach der Formel radius = b * ea * fader
mit zwei Konstanten a und b. ex lässt
sich durch die Funktion
exp(x) berechnen. - Eine Frage: Was passiert, wenn mehr als sechzig Bilder pro Sekunde dargestellt werden? Wie könnte man unter diesen Umständen die Geschwindigkeit der Spirale trotzdem konstant halten? Mehr dazu später.