Koordinaten
Jeder Ort in der Spielwelt ist ein Punkt (x | y | z). Fast alles, was ein Spiel mit seiner Welt tut, ist Rechnen mit solchen Zahlentripeln.
x zeigt nach rechts, y nach oben, z in die Tiefe. In Python ist ein Punkt einfach eine Liste mit drei Zahlen:
p = [2, 1, 2] # x, y, z
Die Szene lässt sich mit der Maus drehen. Der Regler α dreht den Punkt um die y-Achse.
Drei Grundoperationen
Verschieben
Eine Bewegung ist eine Addition, Koordinate für Koordinate.
def verschiebe(p, v):
return [p[0] + v[0], p[1] + v[1], p[2] + v[2]]
Abstand
Der Abstand zweier Punkte folgt aus dem Satz des Pythagoras, zweimal angewendet: erst in der Bodenebene, dann mit der Höhe.
def abstand(p, q):
dx, dy, dz = q[0] - p[0], q[1] - p[1], q[2] - p[2]
return (dx*dx + dy*dy + dz*dz) ** 0.5
Drehen um die y-Achse
Bei einer Drehung um die y-Achse bleibt y gleich. x und z bewegen sich auf einem Kreis, beschrieben durch Sinus und Kosinus:
from math import sin, cos
def drehe_y(p, alpha): # alpha im Bogenmaß
x, y, z = p
return [x * cos(alpha) + z * sin(alpha),
y,
-x * sin(alpha) + z * cos(alpha)]
Aufwand
Jede dieser Operationen kostet eine feste, kleine Zahl von Rechenschritten. Eine Figur besteht aber aus vielen Punkten. Dreht sich eine Figur mit 50 000 Punkten, wird drehe_y in jedem Bild 50 000-mal aufgerufen. Der Aufwand wächst linear mit der Zahl der Punkte n, man schreibt O(n).
- 3
- 5
- 9
- (0 | 0 | −1)
- (0 | 1 | 0)
- (−1 | 0 | 0)
Aufgabe: Schreibe eine Funktion skaliere(p, k), die einen Punkt vom Ursprung aus um den Faktor k streckt. Was passiert mit dem Abstand zum Ursprung?
Lösung anzeigen
return [p[0]*k, p[1]*k, p[2]*k]. Der Abstand zum Ursprung wird ebenfalls mit k multipliziert.