Freigeben über


Übersicht über Transformationen

Matrixtransformationen verarbeiten eine Menge der mathematischen 3D-Grafiken auf niedriger Ebene.

Die Geometriepipeline akzeptiert Scheitelpunkte als Eingabe. Das Transformationsmodul wendet die Welt-, Ansichts- und Projektionstransformationen auf die Scheitelpunkte an, klammert das Ergebnis ab und übergibt alles an den Rasterizer.

Transformieren und Raum Beschreibung
Modellkoordinaten im Modellbereich Am Anfang der Pipeline werden die Scheitelpunkte eines Modells relativ zu einem lokalen Koordinatensystem deklariert. Dies ist ein lokaler Ursprung und eine Ausrichtung. Diese Ausrichtung von Koordinaten wird häufig als Modellraum bezeichnet. Einzelne Koordinaten werden als Modellkoordinaten bezeichnet.
Welttransformation in den Weltraum In der ersten Phase der Geometriepipeline werden die Scheitelpunkte eines Modells von ihrem lokalen Koordinatensystem in ein Koordinatensystem umgewandelt, das von allen Objekten in einer Szene verwendet wird. Der Prozess der Neuausrichtung der Scheitelpunkte wird als "Welttransformation" bezeichnet, die von Modellraum in eine neue Ausrichtung umgewandelt wird, die als Weltraum bezeichnet wird. Jeder Scheitelpunkt im Weltraum wird mithilfe von Weltkoordinaten deklariert.
Ansichtstransformation in Ansichtsbereich (Kamerabereich) In der nächsten Phase orientieren sich die Scheitelpunkte, die Ihre 3D-Welt beschreiben, in Bezug auf eine Kamera. Das heißt, Ihre Anwendung wählt einen Blickpunkt für die Szene aus, und Weltraumkoordinaten werden verschoben und um die Kameraansicht gedreht, wodurch der Weltraum in den Ansichtsbereich umgewandelt wird (auch als Kamerabereich bezeichnet). Dies ist die Ansichtstransformation, die vom Weltbereich in den Ansichtsbereich konvertiert wird.
Projektionstransformation in projektionsraum Die nächste Stufe ist die Projektionstransformation, die vom Ansichtsbereich in den Projektionsbereich konvertiert wird. In diesem Teil der Pipeline werden Objekte in der Regel im Verhältnis zu ihrer Entfernung vom Betrachter skaliert, um der Illusion der Tiefe eine Szene zu verleihen; schließende Objekte werden so gestaltet, dass sie größer als entfernte Objekte erscheinen. Aus Gründen der Einfachheit bezieht sich diese Dokumentation auf den Raum, in dem Scheitelpunkte nach der Projektionstransformation als Projektionsraum vorhanden sind. Einige Grafikbücher beziehen sich möglicherweise auf den Projektionsraum als homogenen Raum nach der Perspektive. Nicht alle Projektionstransformationen skalieren die Größe von Objekten in einer Szene. Eine Projektion wie dies wird manchmal als affine oder orthogonale Projektion bezeichnet.
Clipping im Bildschirmbereich Im letzten Teil der Pipeline werden alle Scheitelpunkte, die auf dem Bildschirm nicht sichtbar sind, entfernt, sodass der Rasterizer nicht die Zeit in Anspruch nimmt, um die Farben und Schattierung für etwas zu berechnen, das nie zu sehen ist. Dieser Vorgang wird als Clipping bezeichnet. Nach dem Clipping werden die verbleibenden Scheitelpunkte entsprechend den Viewportparametern skaliert und in Bildschirmkoordinaten konvertiert. Die resultierenden Scheitelpunkte, die beim Rastern der Szene auf dem Bildschirm angezeigt werden, sind im Bildschirmbereich vorhanden.

 

Transformationen werden verwendet, um die Objektgeometrie von einem Koordinatenbereich in einen anderen zu konvertieren. Direct3D verwendet Matrizen zum Ausführen von 3D-Transformationen. Matrizen erstellen 3D-Transformationen. Sie können Matrizen kombinieren, um eine einzelne Matrix zu erzeugen, die mehrere Transformationen umfasst.

Sie können Koordinaten zwischen Modellraum, Weltraum und Ansichtsraum transformieren.

Matrixtransformationen

In Anwendungen, die mit 3D-Grafiken arbeiten, können Sie geometrische Transformationen verwenden, um folgendes auszuführen:

  • Express the location of an object relative to another object.
  • Drehen und Größe von Objekten.
  • Ändern von Ansichtspositionen, Wegbeschreibungen und Perspektiven

Sie können einen beliebigen Punkt (x,y,z) in einen anderen Punkt (x', y', z') umwandeln, indem Sie eine 4x4-Matrix verwenden, wie in der folgenden Formel dargestellt.

Formel zum Transformieren eines beliebigen Punkts in einen anderen Punkt

Führen Sie die folgenden Formeln für (x, y, z) und die Matrix aus, um den Punkt (x', y', z') zu erzeugen.

Formeln für den neuen Punkt

Die gängigsten Transformationen sind Übersetzung, Drehung und Skalierung. Sie können die Matrizen kombinieren, die diese Effekte in einer einzigen Matrix erzeugen, um mehrere Transformationen gleichzeitig zu berechnen. Sie können beispielsweise eine einzelne Matrix erstellen, um eine Reihe von Punkten zu übersetzen und zu drehen.

Matrizen werden in Zeilenspaltenreihenfolge geschrieben. Eine Matrix, die Scheitelpunkte auf jeder Achse gleichmäßig skaliert, die als einheitliche Skalierung bezeichnet wird, wird mithilfe der mathematischen Schreibweise durch die folgende Matrix dargestellt.

Formel einer Matrix für einheitliche Skalierung

In C++ deklariert Direct3D Matrizen als zweidimensionales Array mit einer Matrixstruktur. Das folgende Beispiel zeigt, wie eine D3DMATRIX Struktur initialisiert wird, um als einheitliche Skalierungsmatrix (Skalierungsfaktor "s") zu fungieren.

D3DMATRIX scale = {
    5.0f,            0.0f,            0.0f,            0.0f,
    0.0f,            5.0f,            0.0f,            0.0f,
    0.0f,            0.0f,            5.0f,            0.0f,
    0.0f,            0.0f,            0.0f,            1.0f
};

Übersetzen

Die folgende Formel übersetzt den Punkt (x, y, z) in einen neuen Punkt (x', y', z').

Formel einer Übersetzungsmatrix für einen neuen Punkt

Sie können manuell eine Übersetzungsmatrix in C++ erstellen. Das folgende Beispiel zeigt den Quellcode für eine Funktion, die eine Matrix zum Übersetzen von Scheitelpunkten erstellt.

D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
    D3DXMATRIX ret;

    D3DXMatrixIdentity(&ret);
    ret(3, 0) = dx;
    ret(3, 1) = dy;
    ret(3, 2) = dz;
    return ret;
}    // End of Translate

Maßstab

Die folgende Formel skaliert den Punkt (x, y, z) um beliebige Werte in der x-, y- und z-Richtung auf einen neuen Punkt (x', y', z').

Formel einer Skalierungsmatrix für einen neuen Punkt

Drehen

Die hier beschriebenen Transformationen gelten für linkshändige Koordinatensysteme und unterscheiden sich daher möglicherweise von Transformationsmatrizen, die Sie an anderer Stelle gesehen haben.

Die folgende Formel dreht den Punkt (x, y, z) um die X-Achse, wodurch ein neuer Punkt (x', y', z') erzeugt wird.

Formel einer x-Drehungsmatrix für einen neuen Punkt

Die folgende Gleichung dreht den Punkt um die Y-Achse.

Formel einer y-Drehungsmatrix für einen neuen Punkt

Die folgende Formel dreht den Punkt um die Z-Achse.

Formel einer Z-Drehungsmatrix für einen neuen Punkt

In diesen Beispielmatrizen steht der griechische Buchstaben theta für den Drehwinkel in Bogenmaß. Winkel werden im Uhrzeigersinn gemessen, wenn sie entlang der Drehachse in Richtung des Ursprungs betrachtet werden.

Der folgende Code zeigt eine Funktion zum Behandeln der Drehung über die X-Achse.

    // Inputs are a pointer to a matrix (pOut) and an angle in radians.
    float sin, cos;
    sincosf(angle, &sin, &cos);  // Determine sin and cos of angle

    pOut->_11 = 1.0f; pOut->_12 =  0.0f;   pOut->_13 = 0.0f; pOut->_14 = 0.0f;
    pOut->_21 = 0.0f; pOut->_22 =  cos;    pOut->_23 = sin;  pOut->_24 = 0.0f;
    pOut->_31 = 0.0f; pOut->_32 = -sin;    pOut->_33 = cos;  pOut->_34 = 0.0f;
    pOut->_41 = 0.0f; pOut->_42 =  0.0f;   pOut->_43 = 0.0f; pOut->_44 = 1.0f;

    return pOut;
}

Verketten von Matrizen

Ein Vorteil der Verwendung von Matrizen besteht darin, dass Sie die Effekte von zwei oder mehr Matrizen kombinieren können, indem Sie sie multiplizieren. Dies bedeutet, dass Sie zwei Matrizen nicht anwenden müssen, um ein Modell zu drehen und es dann an einen bestimmten Ort zu übersetzen. Stattdessen multiplizieren Sie die Rotations- und Übersetzungsmatrizen, um eine zusammengesetzte Matrix zu erzeugen, die alle ihre Effekte enthält. Dieser Prozess, der als Matrixverkettung bezeichnet wird, kann mit der folgenden Formel geschrieben werden.

Formel der Matrixverkettung

In dieser Gleichung ist C die zusammengesetzte Matrix, die erstellt wird, und M₁ durch Mn sind die einzelnen Matrizen. In den meisten Fällen werden nur zwei oder drei Matrizen verkettet, aber es gibt keine Beschränkung.

Die Reihenfolge, in der die Matrixmultiplikation durchgeführt wird, ist entscheidend. Die vorangehende Formel gibt die Links-nach-rechts-Regel der Matrixverkettung wieder. Das heißt, die sichtbaren Effekte der Matrizen, die Sie zum Erstellen einer zusammengesetzten Matrix verwenden, treten in der Reihenfolge von links nach rechts auf. Im folgenden Beispiel wird eine typische Weltmatrix gezeigt. Stellen Sie sich vor, Sie erstellen die Weltmatrix für eine stereotypische fliegende Untertasse. Wahrscheinlich möchten Sie die fliegende Untertasse um die Mitte drehen - die Y-Achse des Modellraums - und übersetzen sie an eine andere Stelle in Ihrer Szene. Um diesen Effekt zu erreichen, erstellen Sie zuerst eine Drehungsmatrix, und multiplizieren Sie sie dann mit einer Übersetzungsmatrix, wie in der folgenden Formel dargestellt.

Gleichung des Drehs basierend auf einer Drehungsmatrix und einer Übersetzungsmatrix

In dieser Formel ist Ry eine Matrix für drehung über die y-Achse, und Tw ist eine Übersetzung zu einer Position in Weltkoordinaten.

Die Reihenfolge, in der Sie die Matrizen multiplizieren, ist wichtig, da im Gegensatz zum Multiplizieren von zwei Skalarwerten die Matrixmultiplikation nicht kommutativ ist. Das Multiplizieren der Matrizen in der entgegengesetzten Reihenfolge hat die visuelle Wirkung, die fliegende Untertasse in ihre Weltraumposition zu übersetzen und dann um den Weltursprung herum zu drehen.

Unabhängig davon, welche Art von Matrix Sie erstellen, denken Sie an die Regel von links nach rechts, um sicherzustellen, dass Sie die erwarteten Effekte erzielen.

Transformationen