Visual Studio Projekt herunterladen
In diesem schon recht anspruchsvollen, interaktiven Beispiel verwenden wir ein erweitertes physikalisches Bewegungsmodell, das die Beschleunigung eines Punktes explizit modelliert. Für die Massepunkte arbeiten wir wieder mit einem Feld von Partikeln bzw. Knoten, deren Anzahl konstant bleibt.
Die 3D-Vektorenklasse in vertex.h und vertex.cpp ist eine stark erweiterte Version der 2D-Vektoren aus der vorherigen Lektion. Sie macht ausgiebig Gebrauch von überladenen Operatoren. Alle Methoden sind aus Geschwindigkeitsgründen inline ausgeführt. Aus demselben Grund sind die Attribute x, y und z auch öffentlich.
Die "Partikel" bzw. Kettenglieder in particle.h und particle.cpp besitzen verschiedene Methoden zur Manipulation von Position, Geschwindigkeit und Beschleunigung. Ich möchte hier nur auf zwei Funtkionen eingehen.
Damit schießt er aufgrund seiner Trägkeit zwangsläufig über das Ziel hinaus und es entstehen die Verwirblungen, die im Kopf des Wurms zu sehen sind.
Die Beschleunigung wird in jedem Frame durch Addition
verschiedener Kräfte neu bestimmt, deshalb wird sie am Ende
der
In der Funktion
Für eine direkte Interaktion greifen wir in der
Funktion
Da die y-Koordinate des Fenster-Koordinatensystems nach unten zeigt, und die unseres OpenGL 3D-Koordinatensystems aber nach oben, invertieren wir den y-Wert der Maus.
Um die korrekte Position und den korrekten Öffnungswinkel für unsere Kamera zu erhalten, nehmen wir denselben Öffnungswinkel, wie im Schnee-Beispiel. Wir positionieren die Kamera allerdings auf den Punkt (0,0,1), so dass wir die y-Achse genau von -0.5 bis 0.5 (unseren Mauskoordinaten) sehen.
Bewegen wir den Kopf auf die so berechneten Mauskoordinaten der (x,y)-Ebene zu, stimmt sein Ziel genau mit der Mausposition überein.
- Erzeuge Header- und C++-Dateien für eine eigene Simulationsklasse CWorm und verschiebe alle Parameter der Simulation dort hinein. Verwende dann die Simulation in der Datei main.cpp.
- Überlege dir eine eigene Simulation und breche dazu ggf. die Verkettung der Partikel zu einem Wurm auf. Gäbe es eine Möglichkeit, häufiger verwendete Funktionen oder Parameter der Simulationen in einer Oberklasse CParticleSimulation zu vereinen?
- Wie wäre es z.B., wenn man der Oberklasse in einer Methode die Anzahl der Partikel übergeben würde und diese dynamisch Speicher belegt? Das Freigeben des alten Feldes nicht vergessen...