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

12.10.2018, 14:53

Matrix-Transformation für perspektivische Darstellung

Hi,

ich kämpfe mich gerade durch OpenGL 3 (es geht voran!) und bin an dem Punkt angelangt, dass ich meine 4x4 Objektmatrizen mit einer perspektivischen Projektion versehen muss, damit ein räumlicher Eindruck entsteht, bei dem weiter entfernte Objekte kleiner erscheinen als Objekte im Vordergrund.

Ich weiß, dass GLM entsprechende Funktionen zur Berechnung einer solchen Matrix bietet, allerdings verwende ich die aus zwei Gründen nicht:

- ich habe bereits eine andere Bibliothek mit Matrixfunktionen im Einsatz

- die GLM-perspective()-Funktion ist mir zu komplex und hat zu viel Querabhängigkeiten als dass ich mir die einfaxch rausnehmen könnte.

Deswegen meine Frage: kennt jemand eine vernünftige, möglichst schön gekapselte Implementierung oder Beschreibung so einer Funktion, die ich verwenden könnte, um eine brauchbare räumliche Perspektive hinubekommen? Parallelprojektion sieht einfach zu übel aus...

Danke!

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

12.10.2018, 20:49

Ich bin ziemlich sicher, dass jedes beliebige LowLevel-3D-API-Tutorial die Formeln hat, die Du suchst. Außerdem solltest Du ein Auge auf die Matrix&Quaternion-FAQ haben - schon etwas älter, aber jede Menge guter Ideen und Tricks.

Aus meinem Code fix rauskopiert:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/** Erzeugt eine perspektivische Projektionsmatrix.
 * Diese Matrix sorgt dafür, daß alle Koordinaten auf einen standardisierten Raum zusammengestaucht
 * werden. Vorderkante, Hinterkante und Öffnungswinkel bilden zusammen einen Pyramidenstumpf,
 * der den sichtbaren Bereich darstellt. 
 * @param hoeheZuBreite Höhe des Sichtbereichs durch Breite desselben.
 * @param vorderkante Geringster Z-Wert, bei dem Geometrie noch sichtbar ist.
 * @param hinterkante Größter Z-Wert, bis zu dem Geometrie noch sichtbar ist.
 * @param sichtwinkel Öffnungswinkel der Kamera in Radian. Üblich sind 90 Grad, als Pi/2.
 */
template <typename Skalar> 
BMatrix4x4<Skalar> PerspektivProjektion( Skalar hoeheZuBreite, Skalar vorderkante, Skalar hinterkante, Skalar sichtwinkel)
{
  BMatrix4x4<Skalar> ziel;
  // X-Achse
  ziel.a1 = 1 / tan( sichtwinkel/2); 
  ziel.a2 = 0; ziel.a3 = 0; ziel.a4 = 0;

  // Y-Achse
  ziel.b2 = 1 / tan( sichtwinkel/2) / hoeheZuBreite;   
  ziel.b1 = 0; ziel.b3 = 0; ziel.b4 = 0;
  
  // Z-Achse
  ziel.c3 = hinterkante / (hinterkante - vorderkante); 
  ziel.c4 = -hinterkante * vorderkante / (hinterkante - vorderkante);
  ziel.c1 = 0; ziel.c2 = 0;   

  // W-Achse
  ziel.d3 = 1;   
  ziel.d1 = 0; ziel.d2 = 0; ziel.d4 = 0;

  return ziel;
}


Matrix-Layout ist bei mir genauso wie bei OpenGL, wenn ich mich recht erinnere:

Quellcode

1
2
3
4
a1 a2 a3 a4
b1 b2 b3 b4
c1 c2 c3 c4
d1 d2 d3 d4


Der Verschiebungsvektor erscheint darin in der rechtesten Spalte (a4, b4, c4) und nur die Perspektivprojektion benutzt jemals die vierte Zeile. Wenn das bei Dir anders ist, dann musst Du evtl. die Matrix noch transponieren.
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

15.10.2018, 13:15

Danke!

Wen's interessiert: ich habe inzwischen auch festgestellt, dass die Manpage die komplette Berechnugn enthält: http://www.manpagez.com/man/3/glFrustum/

Werbeanzeige