Advanced Games Physics
2. Kapitel

Was sind dynamische Maßstäbe und wo werden sie eingesetzt?

Arbeiten mit veränderlichen Perspektiven

Spätestens, wenn Du ein Szenarium in kosmischen Dimensionen oder mit veränderlichen Perspektiven entwickeln willst, wirst Du feststellen, dass es immer Probleme mit dem richtigen Maßstab gibt. Einmal, wenn die Entfernungen zwischen den einzelnen Objekten oder die Objekte selbst sehr groß sind, brauchst Du eine Maßstabsänderung hin zu einem kleinen Maßstab, nähern sich aber die Objekte an oder sie haben nur eine geringe Größe (z.B. Erde - Raumschiff) brauchst Du einen größeren Maßstab, um die die Objekte sichtbar zu gestalten. Bei solchen beweglichen Objekten, wie sie Raumschiffe oder Raketen darstellen, kannst Du Dir so helfen, dass diese Objekte immer sichtbar sind - so als würde der Spieler in konstantem Abstand zu dem Objekt als Beobachter mitfliegen. Nähert sich ein kleineres Objekt einem größeren (z.B. ein Meteor der Erde), dann sollte bei großen Entfernungen die Erde als Kugel zu sehen sein. Kommt das Objekt aber näher, dann wird aus der Erdoberfläche eine Ebene, die sogar Details zeigen kann.
Was wir also suchen, ist eine Methode, wie der Maßstab dynamisch an die jeweilige Situation angepasst werden kann. So ein dynamischer Maßstab kann in vielfältigen Spiel-Situationen sinnvoll eingesetzt werden.

Um der gestellten Aufgabe gerecht zu werden, bestimmen wir im einfachsten Fall zwei Maßstabswerte, M1 für die erste Situation, sagen wir für die großen Dimensionen, und M2, für die kleineren Dimensionen. Entscheidend ist nun für die Wahl des geeigneten Maßstabes, wo sich unser bewegliches Objekt, das wir als Beobachter begleiten, befindet. In großer Entfernung sollten wir dann M1 für die Darstellung der Szenerie wählen, bei kleinen Entfernungen M2 (von der Szene abhängig kann es aber auch umgekehrt sein).
Die Einführung weiterer Maßstäbe neben den bereits genannten kann durchaus zweckmäßig sein. So z.B. wäre ein genereller Maßstab M0 sinnvoll, der die statische Situation berücksichtigt. Natürlich kann auch einer der beiden Maßstäbe M1 oder M2 diese Rolle übernehmen. Ein anderer Fall ist im unten angegebenen Beispielprogramm zu sehen: es gibt zwei Paare von dynamischen Maßstäben, weil sowohl links im Bild als auch rechts im Bild Objekte (hier Bäume) zu sehen sind, deren Größe unabhängig voneinander verändert werden sollen.
Nun wirst Du aber feststellen, dass ein solch sprunghaftes Ändern des Maßstabes sehr unschön wirkt. Also müssen wir noch einen Algorithmus finden, der den Übergang gleitend macht. Einen solchen Übergang wollen wir Pfad nennen. In der Computergrafik werden solche Pfade mit Hilfe von BEZIER-Kurven berechnet, wobei eine Anpassung an gewünschte Verläufe sehr einfach möglich ist. Was wir auf diese Weise finden wollen, ist ein Zusammenhang zwischen Maßstab M und Objektort sObjekt :

()
M = f s O b j e k t

Wie im nebenstehenden Geistesblitz ausgeführt: BEZIER-Kurven sind wegen der Unabhängigkeit der Ankerpunkte von den Kontrolpunkten ideal geeignet, um weitestgehend beliebige Kurvenverläufe darzustellen. Der Haken daran ist aber, dass die mathematische Beschreibung der so gewonnenen Kurve nur implizit vorliegt. Eine direkte Umwandlung in eine explizite Form, so wie sie für unsere Zwecke gebraucht wird () ist nicht möglich. So bietet sich die stückweise Approximation der Kurve durch einfache, leicht zu bestimmende Funktionen, wie z.B. Splines an. Voraussetzung hierfür ist, dass die zu approximierende Kurve durch geeignete Stützstellen beschrieben vorliegt. Die Berechnung der Stützstellen (Includes/controls_v1.0.js) zeigt .
Geistesblitz



Abb. Stützstellen-Berechnung eines Pfades

Im gezeigten Programmauszug werden N Stützstellen berechnet. Dabei wird das Intervall 0 ≤ t ≤ 1 des Parameters t in N äquidistante Abschnitte unterteilt. Das hat aber zur Folge, dass die daraus resultierenden Abschnitte der - in unserem Sinne - unabhängigen Variablen xn, nicht äquidistant sind!

Für unsere Zwecke scheint die Approximation der BEZIER-Kurve durch Geradenstücke ausreichend zu sein. Voraussetzung hierfür ist, dass die BEZIER-Kurve eindeutige Funktionswerte liefert. Das ist dann der Fall, wenn der linke Kontrollpunkt stets rechts vom linken Ankerpunkt und der rechte Kontrollpunkt stets links vom rechten Ankerpunkt liegt.
Die Approximationsvorschrift ist sehr einfach und kostet wenige Rechenoperationen ( und ).
()
y x = y n + 1 y n x n + 1 x n · x + y n
Vor Anwendung dieser Gleichung muss getestet werden, welches Stützstellenpaar xn, xn+1 den Ortswert x umgibt, dann kann der Funktionswert berechnet werden ().

Ermittlung des aktuellen Funktionswertes

Abb. Ermittlung des aktuellen Funktionswertes

Der Methode usePath(xObject) wird der aktuelle Ort des Objektes (hier nur parallel zur x-Achse) übergeben und diese gibt dann den zutreffenden Maßstabswert zurück:


Abb. Berechnung eines Funktionswertes

Die Anzahl der erforderlichen Stützstellen findest Du am einfachsten durch Probieren. Ziel sollte es sein, den approximierten Kurvenverlauf ohne größere Knicke darzustellen. Optimale Ergebnisse - Genauigkeit versus Rechenaufwand - findest Du bei N ≈ 20 Stützstellen.

Wie solltest Du vorgehen, um einen optimalen Pfad für die dynamische Maßstabsanpassung zu finden? Im wesentlichen sind hierfür drei Schritte erforderlich:
  1. Ermittle aus den konkreten geometrischen Verhältnissen den Startmaßstab M1 und den Zielmaßstab M2. Der Wert M0 für den generellen Maßstab, der die gesamte Szenerie beschreibt, sollte auch bekannt sein. Mit den Ortskoordinaten der Ankerpunkte aPX1, M1 und aPX2, M2 werden der Start- bzw. Endpunkt der dynamischen Berechnung des Maßstabs M angegeben. Die Werte cPX1 und cPX2 der Kontrollpunkte werden relativ zu den entsprechenden Ankerpunkten angegeben. Hingegen beschreiben cPY1 und cPY2 die y-Koordinaten der Kontrollpunkte. Sie werden zunächst willkürlich gewählt. Geeignete Werte sind: cPY1 = M1 und cPY2 = M2.
    Weiterhin wird die Anzahl N der Stützstellen benötigt. Gebe diese Werte in den Constructor des Pfades bei der Instantiierung ein. Außerdem solltest Du für eine geeignete Darstellung der BEZIER-Kurve einen offset- und einen zoom-Wert sowie einen Farbwert c für die Kurve eingeben. Der Parameter visible ist auf true zu setzen. Damit wird die BEZIER-Kurve mit ihren Anker- und Kontrollpunkten sowie den dazu gehörigen Werten sichtbar.
    Geistesblitz

    z.B.:   p = new path(aPX1, M1, cPX1, cPY1, cPX2, cPY2, aPX2, M2, N, true, offset, norm, c);


  2. Starte das Programm und optimiere durch Drag'n Drop die Parameter der BEZIER-Kurve. Notiere Dir die gefundenen Werte für die Start- bzw. Endkoordinaten der Kontrollpunkte (x1 und x2) und für die Kontrollpunkte (x1, y1 sowie x2 und y2).

  3. Überschreibe mit den gefundenen Werte die alten Werte im Constructor des Pfades und schalte den Parameter visible auf false. Damit ist der Pfad für die dynamische Maßstabsanpassung aktiv!

  4. Natürlich bist Du nicht darauf festgelegt, den variablen Maßstab nur auf der Grundlage der x-Koordinate zu berechnen. Im allgemeinen Fall wird die Distanz zwischen zwei Positionen zur aktuellen Maßstabsberechnung herangezogen. Dann ist es egal, welche Koordinate oder gar welches Koordinatenpaar zu Grunde gelegt wird. Eine entsprechende Anwendung findest Du im Kapitel Bemannte Raumfahrt und künstliche Himmelskörper.

zu 2.) Absolute Werte haben immer den Nachteil, dass sie nur für eine spezielle Situation zutreffend sind. Das steht im Widerspruch zu den Anforderungen responsibler Anwendungsszenarien. Deshalb sollten die gefundenen Werte für die Anker- und Kontrollpunkte immer auf die Maßstäbe M1 bzw. M2 bezogen werden. Für die Ankerpunkte gilt dies automatisch, für die Kontrollpunkte könnten z.B. cPY1 = λ1·M1 bzw. cPY2 = λ2·M2 gewählt werden, wobei 0 ≤ λ1, 2 ≤ 1.

Das Beispielprogramm zeigt eine einfache Konstellation: Ein Motorradfahrer legt eine Strecke von 500 m zurück. Dabei passiert er verschiedene Baumgruppen, deren Größe mit zunehmender Entfernung des Motorradfahrers von dieser Baumgruppe abnimmt. Dies erledigt die dynamische Anpassung der Maßstäbe (hier sind es drei: M0 unveränderlich für den Motoradfahrer, gegenläufig M_links (orange) und M_rechts (violett) für die Baumgruppen).
Die beiden Grafen im oberen Bildabschnitt stellen die Pfade (Bezierkurve) für die dynamische Anpassung der beiden dynamischen Maßstäbe dar. Sowohl die Ankerpunkte, als auch die Kontrolpunkte konnen per Maus verändert werden. Während die Ankerpunkte in horizontaler Richtung verschieblich sind - sie sind gleichzeitig die Orte, bei denen die dynamische Maßstabsanpassung beginnt bzw. endet - können sie in vertikaler Richtung nicht verändert werden. In dieser Richtung sind sie durch die Startmaßstäbe, die im Vorfeld ermittelt worden sind, bestimmt. Mit Hilfe der Kontrolpunkte (türkis bzw. orange) kann der Kurvenverlauf beeinflusst werden.
Mit dem Auswahlschalter timeScale kannst Du zwischen dynamischer Anpassung oder statischer Zuweisung der Zeitmanipulation wählen.

download processing
download p5.js
run program