Share via


Projektionstransformation

Eine Projektionstransformation steuert die Internen der Kamera, z. B. die Auswahl eines Objektivs für eine Kamera. Dies ist der komplizierteste der drei Transformationstypen.

Die Projektionsmatrix ist in der Regel eine Skalierungs- und Perspektivprojektion. Die Projektionstransformation wandelt das Anzeige frustum in eine Quaderform um. Da das nahe Ende des Sicht frustums kleiner ist als das ferne Ende, hat dies den Effekt, dass Objekte, die sich in der Nähe der Kamera befinden, erweitert werden; So wird die Perspektive auf die Szene angewendet.

Im Ansichts frustum wird der Abstand zwischen der Kamera und dem Ursprung des Sichttransformationsraums beliebig als D definiert, sodass die Projektionsmatrix wie die folgende Abbildung aussieht.

Abbildung der Projektionsmatrix

Die Anzeigematrix übersetzt die Kamera in den Ursprung, indem sie in z-Richtung von - D übersetzt. Die Übersetzungsmatrix ähnelt der folgenden Abbildung.

Abbildung der Übersetzungsmatrix

Das Multiplizieren der Übersetzungsmatrix mit der Projektionsmatrix (T*P) ergibt die zusammengesetzte Projektionsmatrix, wie in der folgenden Abbildung dargestellt.

Abbildung der zusammengesetzten Projektionsmatrix

Die Perspektivtransformation wandelt ein Anzeige frustum in einen neuen Koordinatenraum um. Beachten Sie, dass das Frustum zu Quader wird und dass sich der Ursprung von der oberen rechten Ecke der Szene in die Mitte bewegt, wie im folgenden Diagramm dargestellt.

Diagramm, wie die Perspektivtransformation das Anzeige frustum in einen neuen Koordinatenraum ändert

In der Perspektivtransformation sind die Grenzen der x- und y-Richtung -1 und 1. Die Grenzwerte der z-Richtung sind 0 für die vordere Ebene und 1 für die hintere Ebene.

Diese Matrix übersetzt und skaliert Objekte basierend auf einem angegebenen Abstand von der Kamera zur nah geschnittenen Ebene, berücksichtigt jedoch nicht das Sichtfeld (fov), und die z-Werte, die sie für Objekte in der Entfernung erzeugt, können nahezu identisch sein, was Tiefenvergleiche erschwert. Die folgende Matrix behandelt diese Probleme, und sie passt Scheitelpunkte an, um das Seitenverhältnis des Viewports zu berücksichtigen, was ihn zu einer guten Wahl für die perspektivische Projektion macht.

Abbildung einer Matrix für die Perspektivprojektion

In dieser Matrix ist Zn der z-Wert der nah abgeschnittenen Ebene. Die Variablen w, h und Q haben die folgenden Bedeutungen. Beachten Sie, dass fovw und fovk die horizontalen und vertikalen Sichtfelder des Viewports in Bogenmaß darstellen.

Formeln der Variablen-Bedeutungen

Für Ihre Anwendung ist die Verwendung von Sichtfeldwinkeln zum Definieren der x- und y-Skalierungskoeffizienten möglicherweise nicht so bequem wie die verwendung der horizontalen und vertikalen Dimensionen des Viewports (im Kameraraum). Wie die Mathematik funktioniert, verwenden die folgenden beiden Formeln für w und h die Dimensionen des Viewports und entsprechen den vorherigen Formeln.

Formeln der Bedeutung der w- und h-Variablen

In diesen Formeln stellt Zn die Position der nah abgeschnittenen Ebene dar, und die Variablen Vw und Vh stellen die Breite und Höhe des Viewports im Kameraraum dar.

Unabhängig davon, für welche Formel Sie sich entscheiden, stellen Sie sicher, dass Sie Zn auf einen möglichst großen Wert festlegen, da sich die Z-Werte sehr nahe an der Kamera unterscheiden. Dies macht Tiefenvergleiche mit 16-Bit-z-Puffern etwas kompliziert.

Eine w-freundliche Projektionsmatrix

Direct3D kann die w-Komponente eines Scheitelpunkts verwenden, der von der Welt-, Sicht- und Projektionsmatrizen transformiert wurde, um tiefenbasierte Berechnungen in Tiefenpuffer- oder Nebeleffekten durchzuführen. Berechnungen wie diese erfordern, dass Ihre Projektionsmatrix w normalisiert, um dem Weltraum z zu entsprechen. Kurz gesagt, wenn Ihre Projektionsmatrix einen (3,4) Koeffizienten enthält, der nicht 1 ist, müssen Sie alle Koeffizienten um die Inverse des (3,4) Koeffizienten skalieren, um eine richtige Matrix zu erstellen. Wenn Sie keine kompatible Matrix bereitstellen, werden Nebeleffekte und Tiefenpufferung nicht ordnungsgemäß angewendet.

Die folgende Abbildung zeigt eine nicht konforme Projektionsmatrix und dieselbe Matrix skaliert, sodass augenbezogener Nebel aktiviert wird.

Abbildungen einer nicht konformen Projektionsmatrix und einer Matrix mit Augennebel

In den vorherigen Matrizen wird davon ausgegangen, dass alle Variablen nichtzero sind. Informationen zum w-basierten Tiefenpuffer finden Sie unter Tiefenpuffer.

Direct3D verwendet die aktuell festgelegte Projektionsmatrix in seinen w-basierten Tiefenberechnungen. Daher müssen Anwendungen eine konforme Projektionsmatrix festlegen, um die gewünschten w-basierten Features zu erhalten, auch wenn sie Direct3D nicht für Transformationen verwenden.

Transformationen