Spieleprogrammierung mit Delphi und GLScene: Bewegungen

Aus Wikibooks

Bewegungen[Bearbeiten]

Grundsätzlich gibt es drei Typen von Bewegungen:

  • Transformation. Das Objekt wird entlang einer oder mehrerer der drei Achsen X, Y und Z bewegt.
  • Rotation. Das Objekt wird um eine oder mehrere der drei Achsen gedreht.
  • Skalierung. Das Objekt wird in seiner Größe verändert.

Mehr dazu in den drei Unterkapiteln.

Transformation[Bearbeiten]

Dazu müssen wir erst einmal wissen, wie das GLScene-Koordinatensystem aussieht, das identisch mit dem OpenGL-Koordinatensystem ist:

Nun hat jedes Objekt, zum Beispiel ein GLCube, eine Eigenschaft Position:

  • Position.X - die Position auf der X-Achse
  • Position.Y - die Position auf der Y-Achse
  • Position.Z - die Position auf der Z-Achse

Dabei handelt es sich um Single-Werte! Aus der Abbildung geht hervor:

  • Die X-Achse wächst nach rechts. Positive Werte liegen also rechts vom Koordinatenursprung, negative Werte links.
  • Die Y-Achse wächst nach oben. Je größer der Y-Wert, desto höher liegt das Objekt.
  • Die Z-Achse wächst zum Betrachter hin. Je größer der Z-Wert, desto näher ist Sie am Betrachter.

Durch verändern der X, Y und Z Werte wird ein Objekt verschoben.

Rotation[Bearbeiten]

Man kann nun ein Objekt um jede Achse drehen. Jedes Objekt hat folgende Eigenschaften:

  • PitchAngle - Rotation um die X-Achse
  • TurnAngle - Rotation um die Y-Achse
  • RollAngle - Rotation um die Z-Achse

Dabei werden Angaben im Gradmaß (nicht wie vielleicht erwartet im Bogenmaß) verlangt! Vorsicht ist geboten, denn die sin()- und cos()-Funktionen erwarten Angaben im Bogenmaß. Hier muss man gegebenenfalls umrechnen. Im Prinzip Dreisatz. Allerdings teilen wir nicht durch (360 / (2 * Pi)) sondern gleich durch 57.29 und holen so bessere Rechenzeiten heraus. Ein Beispiel dafür:

  GLDummyCube1.X := GLDummyCube1.X -
    sin(GLDummyCube1.TurnAngle / 57.29) * _speed;
  GLDummyCube1.Z := GLDummyCube1.Z -
    cos(GLDummyCube1.TurnAngle / 57.29) * _speed;

Gegebenenfalls sollte man sich noch einmal ansehen, was Sinus und Cosinus bedeuten, zum Beispiel in der Wikipedia.

Skalierung[Bearbeiten]

Dafür gibt es die Eigenschaften Scale.X, Scale.Y und Scale.Z. Zu beachten ist, dass Position-Werte immer den Mittelpunkt des Objektes beschreiben!