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.06.2010, 15:48

Die Projektionsmatrix

Hallo zusammen!

Die Beschreibung der Projektionsmatrix in David Scherfgens Buch ist grundsätzlich zu verstehen, ABER: Die Irrlicht Engine bietet 6 verschiedene Methoden an, mit denen man eine Projektionsmatrix erstellen kann:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
CMatrix4<  T > & buildProjectionMatrixOrthoLH  (f32  widthOfViewVolume, f32  heightOfViewVolume, f32  zNear, f32  zFar)  //Builds a  left-handed orthogonal projection matrix.  

CMatrix4<  T > & buildProjectionMatrixOrthoRH  (f32  widthOfViewVolume, f32  heightOfViewVolume, f32  zNear, f32  zFar) // Builds a  right-handed orthogonal projection matrix.  

CMatrix4<  T > & buildProjectionMatrixPerspectiveFovLH  (f32  fieldOfViewRadians, f32  aspectRatio, f32  zNear, f32  zFar) //  Builds a  left-handed perspective projection matrix based on a field of view.  

CMatrix4<  T > & buildProjectionMatrixPerspectiveFovRH  (f32  fieldOfViewRadians, f32  aspectRatio, f32  zNear, f32  zFar) // Builds a  right-handed perspective projection matrix based on a field of view.  

CMatrix4<  T > & buildProjectionMatrixPerspectiveLH  (f32  widthOfViewVolume, f32  heightOfViewVolume, f32  zNear, f32  zFar)//  Builds a  left-handed perspective projection matrix.  

 CMatrix4<  T > & buildProjectionMatrixPerspectiveRH  (f32  widthOfViewVolume, f32  heightOfViewVolume, f32  zNear, f32  zFar)  //Builds a  right-handed perspective projection matrix.



Was ist jetzt der Unterschied zwischen all diesen? Perspective, Left-Handed, Right-Handed, Orthogonal... was ist das alles?



Gruß Paul


Edit: Was genau macht die Projektionsmatrix denn jetzt eigentlich? So ganz habe ich das immer noch nicht verstanden. Ich hab mal blind eine von den oben angegebenen Projektionsmatrizen erstellt und einen Vektor damit transformiert und jetzt hat er eben andere Werte. Aber ich kann mir immer noch nicht wirklich vorstellen, wozu man diese anderen Werte brauchen könnte.


Edit 2: Hab mich grad mal was auf Wikipedia angelesen. Hab ich das jetzt richtig verstanden, dass die Projektionsmatrix einen 3-dimensionalen Vektor in einen 2-dimensionalen Vektor transformiert, der auf dem Bildschirm abgebildet werden kann? Wenn das so ist, dürfte ich ja im resultierenden Vektor die z-Koordinate garnicht verwenden.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »MasterHelmut« (21.06.2010, 16:12)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

21.06.2010, 16:11

Naja die machen dir eben entweder eine orthogonale oder eine perspektivische Projektionsmatrix wobei es eben Varianten für Links bzw. Rechtshändige Koordinatensysteme gibt.
Eine Orthogonale Projektion ist einfach eine Normalprojektion auf die Bildebene, d.h. entspricht im Prinzip dem Weglassen der z-Komponente im Viewspace. Eine Perspektivische Projektion ist in dem Fall einfach eine Zentralprojektion. Bei der Perspektive gibt es dann noch einmal die Variante über einen Field of View Winkel oder eben direkt die Abmessungen des Sichtkegels.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

21.06.2010, 16:20

Edit 2: Hab mich grad mal was auf Wikipedia angelesen. Hab ich das jetzt richtig verstanden, dass die Projektionsmatrix einen 3-dimensionalen Vektor in einen 2-dimensionalen Vektor transformiert, der auf dem Bildschirm abgebildet werden kann? Wenn das so ist, dürfte ich ja im resultierenden Vektor die z-Koordinate garnicht verwenden.

Es ist noch ein wenig komplizierter. Deine Projektionsmatrix bildet einen 4D Vektor auf einen 4D Vektor ab, die eigentliche Projektion passiert dann erst wenn man diesen 4D Vektor durch Division durch seine letzte Koordinate ("homogenisieren") zurück nach 3D projiziert. Die x und y Koordinaten dieses Vektors entsprechenden dann den Positionen auf dem Bildschirm (alledings noch nicht in Pixeln), die z-Koordinate wird z.B. fürs DepthBuffering und noch einige andere Dinge Verwendet...

Genaueres hier: http://de.wikipedia.org/wiki/Homogene_Koordinaten

4

21.06.2010, 16:23

Okay, also die LH-Variante hab ich überhaupt noch nie gesehn :D und die RH Variante ist daher so in meinen Augen das "normale 3D-Koordinatensystem". Die orthogonale Projektion lässt also einfach die z-Koordinate weg? Ich kann mir garnicht vorstellen, dass man so überhaupt ein 3D-Objekt projezieren kann. Sinnvoller erscheint mir dann schon die Zentralprojektion.

Nun zur Praxis: Kann ich mich für eine Projektionsvariante entscheiden und die durchgehend in einem Spiel verwenden oder werde ich alle einmal brauchen?


Gruß Paul

Tobiking

1x Rätselkönig

  • Private Nachricht senden

5

21.06.2010, 16:48

Die orthogonale Projektion lässt also einfach die z-Koordinate weg? Ich kann mir garnicht vorstellen, dass man so überhaupt ein 3D-Objekt projezieren kann. Sinnvoller erscheint mir dann schon die Zentralprojektion.

Du musst natürlich bedenken das Verdeckungen trotzdem stattfinden. Im CAD Bereich wird oft die orthogonale Projektion genutzt, da so parallele Seiten parallel bleiben etc. Wenn man ein Bild sieht erkennt man das Prinzip eigentlich direkt. Wenn man einen Würfel zeichnet zieht man halt an jeder Ecke dir gleiche Linie für die Tiefe, statt auf einen Fluchtpunkt zu. Für 2D wird es auch eingesetzt.

Nun zur Praxis: Kann ich mich für eine Projektionsvariante entscheiden und die durchgehend in einem Spiel verwenden oder werde ich alle einmal brauchen?

Ist die Frage was du mit "alle" meinst. Wenn du dich auf rechts- oder linkshändig festlegst bleiben da eigentlich nur noch die perspektivische(fov verändert nur die Stärke der Perspektive) und die orthogonale übrig. Perspektivisch setzt man in der Regel für alles 3 dimensionale ein, und die orthogonale dann für alles was 2 dimensional ist. In einem 3D Ego Shooter mit Hud wird man in der Regel also beides nutzen.

6

21.06.2010, 18:25

Okay jetzt ist mir der Unterschied zwischen Orthogonal und Perspektive klar. Und vor allem der Sinn vom Orthogonalen.



Was ich aber noch nicht verstanden habe is das hier:
Es ist noch ein wenig komplizierter. Deine Projektionsmatrix bildet einen 4D Vektor auf einen 4D Vektor ab, die eigentliche Projektion passiert dann erst wenn man diesen 4D Vektor durch Division durch seine letzte Koordinate ("homogenisieren") zurück nach 3D projiziert.
Muss ich jetzt, nachdem ich die Transformation mit der Projektionsmatrix durchgeführt habe noch irgendwas dividieren??


Paul

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

21.06.2010, 18:31

Hängt davon ab was du tun willst^^

8

21.06.2010, 20:24

Ich will 3D-SPiele programmieren. Also muss ich bewegte 3D-Szenen rendern, und die Bewegungen programmieren. Außerdem brauche ich die Oberfläche, für die ja dann wie gesagt die Orthogonale Projektion angewandt wird.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

21.06.2010, 20:32

Ja aber ich denke kaum dass du vorhast all deine Vertices per Hand zu transformieren oder?

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

10

21.06.2010, 21:31

Wird nicht, wenn man ein HUD o.Ä. rendern will, sowohl die Kamera- als auch die Projektionsmatrix auf die Einheitsmatrix gesetzt?

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Werbeanzeige