Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.10.2019, 10:37

Perspektivische Projektion mit 4x4 Matrix?

Hi,

ich zeichne aktuell diverse 2D-Grafiken unter Verwendung einer 4x4-Matrix. Die wird hauptsächlich dazu verwendet, um die Grafiken zu skalieren/rotieren/verschieben.

Jetzt benötige ich eine perspektivische Darstellung. Das wäre auch alles immer noch 2D, d.h. meine Darstellung soll nur in die Ebene geklappt werden, wie auf diesem Bild zu sehen:


(Link)


Welche Teile der Matrix muss ich dafür genau wie ändern, um diese räumliche Verzerrung zu erhalten?

Danke!

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

21.10.2019, 14:09

Gar nicht. Die perspektivische Projektion entsteht durch eine Division mit der w-Komponente. Und Divisionen sind per Matrix-Mathematik nicht zu erreichen. Stattdessen macht das die Grafikkarte nach dem VertexShader, und wir als Engine-Entwickler bauen nur eine Projektionsmatrix, die den Tiefenwert in die W-Komponente des Positionsvektors schreibt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

21.10.2019, 14:14

Hm...OK...in dem Fall ist kein OpenGL etc. im Spiel, d.h. das Ganze wird tatsächlich von Hand gezeichnet. Wie würde eine manuelle Berechnung der Perspektive denn aussehen müssen?

4

21.10.2019, 23:41

Such doch einfach nach der Projektionsmatrix, gibt genug Erklärungen im Internet. Z.B. hier: https://www.mathematik.uni-marburg.de/~t…_ger_web.html#1

In deinem Fall musst du dann noch y und z vertauschen (ginge auch mit einer Matrix notfalls), also sodass das, was hinten liegen soll, bei +z liegt (oder -z, je nach Koordinatensystem). Und dann den Vektor nach der Transformation durch w teilen.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

5

22.10.2019, 10:15

Hm...OK...in dem Fall ist kein OpenGL etc. im Spiel, d.h. das Ganze wird tatsächlich von Hand gezeichnet. Wie würde eine manuelle Berechnung der Perspektive denn aussehen müssen?

Du teilst Deine Positionsvektoren durch die Tiefe. Zahlenbereiche musst Du halt zurechtschubsen, bis sie in angenehmen Gegenden liegen. Wenn Du durch die Tiefe teilst, dann ist klar, dass die Tiefe nicht allzu nah an Null kommen und nie negativ werden darf. Aber Du Du ja tatsächlich alles von Hand machst, kannst Du Dir einfach ein Szenario auswählen, in dem alles angenehm von der Hand geht.

Beispiel: ein Zimmer, und Du bist der Maler. Du malst nur Sachen, die mindestens einen Meter von Dir weg sind. Alle Gegenstände und Ecken malst Du relativ zum Zentrum des Zimmers. Der Boden ist bei -1,5m Höhe, die Decke bei +1,5m Höhe. Die linke Wand ist bei -3m Breite, die rechte bei +3m. Die Couch steht an der linken Wand und ist 3m breit, geht also bis 0m Breite. Und so weiter.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Jonathan

Community-Fossil

  • Private Nachricht senden

6

25.10.2019, 22:18

Hm...OK...in dem Fall ist kein OpenGL etc. im Spiel, d.h. das Ganze wird tatsächlich von Hand gezeichnet. Wie würde eine manuelle Berechnung der Perspektive denn aussehen müssen?


Weswegen man teilen muss:

Letztendlich läuft das (vereinfacht gesagt) auf den Strahlensatz hinaus. Die Strahlen laufen im Auge (oder der Kamera) zusammen. Alle Objekte entlang eines Sichtstrahls erscheinen auf dem Kamerabild übereinander. Ist ein Objekt jetzt doppelt so weit weg muss es auch doppelt so groß sein um nach der Projektion auf die Kamera-Ebene gleich groß zu sein.


Im ersten Schritt brauchst du also die Entfernung des Objektes zur Kamera. Die bekommst du als 'Nebenprodukt' (neben den normalisierten Bildschirmkoordinaten) aus der Multiplikation mit der Projektionsmatrix. Danach macht man dann die Division.

Aber schau dir am besten die verlinkten Folien an, die schauen an sich gut aus. Das ganze Thema ist relativ mathematisch da muss man sich durchbeißen. Alternativ kannst du auch von irgendwo fertig Code kopieren, den dann aber im Detail zu verstehen dürfte schwer werden, noch schwerer ist es dann Fehler zu finden, falls er nicht richtig funktioniert. Alternativ benutzt man einfach eine fertige Implementierung und muss sich dann um die Mathematik nicht groß scheren sondern nur die entsprechenden Parameter setzen.

[edit]Homogene Koordinaten im Allgemeinen sind sicherlich auch interessant zu verstehen, darauf baut das ganze schließlich auf. Der Wikipedia-Artikel bietet eine Zusammenfassung, ist aber vermutlich nicht ganz einfach zu verstehen, da sehr mathematisch geschrieben. Aber mit etwas Suchen findest du sicherlich auch eine einsteigerfreundlichere Quelle.[/edit]
Lieber dumm fragen, als dumm bleiben!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Jonathan« (25.10.2019, 23:00)


Werbeanzeige