Freigeben über


Projektionstransformation

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

Die Projektionsmatrix ist in der Regel eine Skalierungs- und perspektivische Projektion. Die Projektionstransformation wandelt das Anzeige-Frustum in eine cuboide Form um. Da das nahe Ende des Seh-Frustums kleiner als das weit entfernte Ende ist, hat dies die Wirkung, Objekte zu erweitern, die nahe an der Kamera liegen; So wird die Perspektive auf die Szene angewendet.

Im Seh-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 um - D übersetzt wird. Die Übersetzungsmatrix ähnelt der folgenden Abbildung.

Abbildung der Übersetzungsmatrix

Wenn Sie die Übersetzungsmatrix mit der Projektionsmatrix (T*P) multiplizieren, wird die zusammengesetzte Projektionsmatrix wie in der folgenden Abbildung dargestellt.

Abbildung der zusammengesetzten Projektionsmatrix

Die perspektivische Transformation wandelt ein Anzeige-Frustum in einen neuen Koordinatenbereich um. Beachten Sie, dass das Frustum kuboid wird und dass der Ursprung von der oberen rechten Ecke der Szene in die Mitte wechselt, wie im folgenden Diagramm dargestellt.

Diagramm, wie die perspektivische Transformation das Anzeige-Frustum in einen neuen Koordinatenbereich ändert

Bei der perspektivische Transformation sind die Grenzen der x- und y-Richtungen -1 und 1. Die Grenzen der Z-Richtung sind 0 für die Vorderebene und 1 für die Hintergrundebene.

Diese Matrix übersetzt und skaliert Objekte basierend auf einem angegebenen Abstand von der Kamera zur nahen Clippingebene, 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 behebt diese Probleme und passt Scheitelpunkte an, um das Seitenverhältnis des Viewports zu berücksichtigen, wodurch sie für die perspektivische Projektion eine gute Wahl ist.

Abbildung einer Matrix für die perspektivische Projektion

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

Formeln der variablen Bedeutungen

Für Ihre Anwendung ist die Verwendung von Ansichtswinkeln zum Definieren der X- und Y-Skalierungskoeffizienten möglicherweise nicht so praktisch wie die Verwendung der horizontalen und vertikalen Abmessungen des Viewports (im Kamerabereich). Wie die Mathematik funktioniert, verwenden die folgenden beiden Formeln für w und h die Abmessungen des Viewports und entsprechen den vorherigen Gleichungen.

Formeln der Variablen

In diesen Formeln stellt Zn die Position der nahe Ausschnittebene dar, und die Variablen Vw und Vh stellen die Breite und Höhe des Viewports im Kamerabereich dar.

Unabhängig davon, welche Formel Sie verwenden möchten, legen Sie Zn so groß wie möglich fest, da Z-Werte sehr nahe an der Kamera nicht sehr unterschiedlich sind. Dies macht Tiefenvergleiche mit 16-Bit-Z-Puffern etwas kompliziert.

Eine w-freundliche Projektionsmatrix

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

Die folgende Abbildung zeigt eine nicht kompatible Projektionsmatrix und die gleiche Matrix, die so skaliert wird, dass der augenrelative Nebel aktiviert wird.

Abbildungen einer nicht kompatiblen Projektionsmatrix und einer Matrix mit augenrelativem Nebel

In den vorangehenden Matrizen werden alle Variablen als nonzero angenommen. Informationen zum w-basierten Tiefenpuffer finden Sie unter Tiefenpuffer.

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

Transformationen