Koordinationtransformationen usw. mit pygame und Numpy

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

Die Zeiten von Geometrie, Matrizenmultiplikation und Bildgenerierung sind bei mir schon lange her. Vielleicht würde ich noch die alten Unterlagen finden, aber erst mal hier zu fragen liefert hoffnungsweise aktuellere Ergebnisse:
Gibt es irgendwo Webseiten die den Kram noch mal rekapitulieren (mit dem Hintergrund Computergraphik) und vorzugsweise gleich in Verbindung mit Numpy?
Ich bin jetzt mit pygame wohl noch so ‘low level’ unterwegs, dass ich mich darum selbst kümmern muss. Höhere Bibliotheken haben die Berechnungen vermutlich schon mit an Bord...

Zum Beispiel wie ändern sich die Koordinaten bei einer Drehung vom/im Koordinatenursprung und wie programmiert man das in Numpy?

Einfach so runter programmiert für eine Drehung um 90 Grad:

Code: Alles auswählen

import math
phi = math.pi*0.5 
punkteliste= [[3,5], [-2,1], [-3,-3]]
neue_liste = []
for einzelpunkt in punkteliste:
    x, y = einzelpunkt
    neue_liste.append([x*math.cos(phi) + y*math.sin(phi), -x*math.sin(phi) + y*math.cos(phi)])
punkteliste = neue_liste
Aber will ich das in pygame wirklich so? Im Zweifel ist die Punkteliste eigentlich eine Liste von pygame.rect-Objecten und mittels Schleife da durch zu iterieren...? Da nimmt man doch eigentlich numpy?

Oder wenn man an ein 3D-Drahtgittermodell (z.b. eines Würfels) mit der Kamera näher ran fährt, ändern sich ja auch die Bildkoordinaten.

Kennt wer dafür empfehlenswerte Tutorials?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@grubenfox: Es gibt 2D- und 3D-Vector Datentypen in PyGame. Wobei 3D-Modell nicht nach PyGame klingt. PyGame ist 2D-Framebuffer-Style Pixelgrafik.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

Auf die Datentypen habe ich jetzt noch mal einen genaueren Blick geworfen und werde damit so langsam warm.
Damit reduziert sich meine obige Schleife entweder auf:

Code: Alles auswählen

import math
from pygame.math import Vector2
phi = math.pi*0.5 
punkteliste= [Vector2(3,5), Vector2(-2,1), Vector2(-3,-3)]
print('alt', punkteliste)
for einzelpunkt in punkteliste:
    einzelpunkt.rotate_rad_ip(-phi)
print('gedreht',punkteliste)
oder die ganz kurze Schreibweise:

Code: Alles auswählen

import math
from pygame.math import Vector2
phi = math.pi*0.5 
punkteliste= [Vector2(3,5), Vector2(-2,1), Vector2(-3,-3)]
print('alt', punkteliste)
[einzelpunkt.rotate_rad_ip(-phi) for einzelpunkt in punkteliste]
print('gedreht',punkteliste)
Wobei so eine einsam rumstehende list comprehension (mit Inplace-Rotation) für mich irgendwie merkwürdig oder jedenfalls ungewohnt aussieht. Aber sie macht ihre Arbeit...

Aber es fehlte noch der Umgang mit numpy bei der ganzen Geschichte... in der Nacht war ich dann erfolgreich und habe was passendes gefunden:
https://www.petercollingridge.co.uk/tut ... ormations/

So etwas suchte ich...
Aber das Tutorial ist schon 11 Jahre alt und der hier verlinkte Code ist für Python 2.7 und damit auch für eine völlig tote alte Pygame-Version....
Daher weiterhin die Frage: kennt wer eine aktuelle Seite zum Thema?
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

__blackjack__ hat geschrieben: Samstag 25. März 2023, 22:15 @grubenfox: Es gibt 2D- und 3D-Vector Datentypen in PyGame. Wobei 3D-Modell nicht nach PyGame klingt. PyGame ist 2D-Framebuffer-Style Pixelgrafik.
Was das 3D betrifft: wenn ich da eine 2D-Linie ziehen kann, dann mache ich da nicht nur 3D, sondern auch gleich noch 4D! ;)
und aus dem im vorherigen Posting verlinktem Tutorial noch dieser Link: https://www.youtube.com/watch?v=Bj4wmWqxP5w

Leider habe ich keinen Link zu dem Arcade-Automaten gefunden an den ich bei der Erwähnung vom 3D-Würfel dachte. Aber das war damals genau die Grafik, nur waren die nicht sichtbaren Linien auch nicht sichtbar... da müsste man für Pygame noch einen Hiden-Line-Algorithmus implementieren. Aber davon werde ich wohl lieber die Finger lassen.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@grubenfox: Die „list comprehension“ macht mehr als ihre Arbeit — die verwirrt den Leser und erstellt eine unnötige Liste mit lauter `None`-Werten die dann unbenutzt wieder verworfen wird. Und es ist noch nicht mal wirklich kürzer als eine ``for``-Schleife wo man, die Konventionen missachtend, einen Einzeiligen Schleifenkörper ja auch mit in der gleichen Zeile schreiben könnte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

... und gestern abend war die „list comprehension“ außerdem auch etwas langsamer als die explizite Schleife mit den Vector2-Daten! Wenn man nachrechnen würde, dann war das vermutlich irgendwo zwischen 10%-20% mehr Laufzeit bei der „list comprehension“.

Die Numpy-Version war erwartungsgemäß die schnellste Variante und man merkte auch dass dort mehr Gehirnschmalz reingeflossen ist als bei meinen simplen Schleifen. Während die Schleifen schön linear mit der Anzahl der zu berechnenden Punkte skalierten (was anderes hätte mich auch verwundert) war das bei numpy ein nichtlinearer Verlauf.
Antworten