Der [-1 ; 1] x [-1 ; 1] x [0 ; 1]
im Tutorial erwähnte Bereich bezieht sich auf das kanonische Ansichtsvolumen . Dies ist der endgültige Koordinatenraum, auf den Scheitelpunktdaten abgebildet werden, bevor alles auf Ihrem Bildschirm gerastert wird. Um zu verstehen, was genau dies bedeutet, ist es hilfreich, einen Blick darauf zu werfen, wie eine Rendering-Pipeline normalerweise aussieht.
Räume koordinieren
Ein Koordinatenraum bezieht sich auf das Koordinatensystem, mit dem Sie die Positionen der Scheitelpunkte darin definieren. Stellen Sie sich als Beispiel aus der Praxis vor, Sie haben einen Schreibtisch mit einer Tastatur darüber und möchten die Position der Tastatur ausdrücken. Sie können die vordere linke Ecke des Schreibtisches als Position definieren (0, 0, 0)
- dies wird als Ursprung bezeichnet -, die X-Achse entlang der Länge des Schreibtisches (von links nach rechts) und die Y-Achse entlang der Tiefe des Schreibtisches Schreibtisch (nah bis fern) und die Z-Achse senkrecht vom Schreibtisch nach oben. Befindet sich Ihre Tastatur 50 Zentimeter rechts von dieser Ecke und 10 Zentimeter von der nächsten Kante entfernt, befindet sie sich an der Position (50, 10, 0)
.
Alternativ können Sie die Ecke Ihres Raums als Position definieren (0, 0, 0)
. Nehmen wir an, Ihr Schreibtisch befindet sich 200 cm von der linken Wand, 300 cm von der Vorderwand entfernt und der Schreibtisch ist 70 cm hoch. In diesem Fall befindet sich die Tischplatte an (200, 300, 70)
Ihrer Position und Ihre Tastatur an (250, 310, 70)
.
Dies sind zwei Beispiele für unterschiedliche Koordinatenräume und wie sie sich auf die Positionskoordinaten der Objekte in ihnen auswirken. In ähnlicher Weise werden Scheitelpunktdaten in einer 3D-Rendering-Pipeline über verschiedene Koordinatenräume hinweg transformiert, bevor sie auf Ihrem Bildschirm angezeigt werden.
Koordinieren Sie Räume in einer 3D-Rendering-Pipeline
Einzelne Objekte werden in 3D-Software wie Autodesk Maya, Blender ... modelliert. Sie werden häufig zentriert um den Ursprung modelliert. Dieser Koordinatenraum wird als Modellraum bezeichnet . Wenn Sie mehrere Objekte im Modellraum zusammen rendern würden, würden sie alle zentriert um den Ursprung gestapelt.
Stattdessen wird ein neuer Koordinatenraum definiert, der als Weltraum bezeichnet wird. Stellen Sie sich dies als Ihre Spielwelt vor, wobei der Ursprung das Zentrum der Welt ist. Bei der Transformation des Modellraums in Weltraumkoordinaten werden Übersetzungen, Rotationen, Skalierungen und andere Operationen ausgeführt. Wenn Sie beispielsweise eine Tastatur an der Position (250, 310, 70)
Ihrer Welt rendern möchten , würden Sie alle ihre Scheitelpunkte um diesen Vektor versetzen. Mathematisch gesehen erfolgt dies unter Verwendung einer Transformationsmatrix . Sie können auf jedes einzelne Objekt eine andere Transformation anwenden, um Objekte in Ihrer Spielwelt zu platzieren.
Sie haben jetzt einen großen Stapel von Eckpunkten, an denen jedes Objekt an der richtigen Position platziert ist. Sie müssen jetzt definieren, welchen Teil der Welt Sie betrachten möchten. Dies erfolgt durch Verschieben aller Scheitelpunktdaten in den Kameraraum . Eine häufig eingesetzte Konvention ist die Kamera in dem Ursprung des positioniert hat Kameraraum , um es in Richtung der positiven Z-Achse sehen zu haben (der Blickvektor ) und den positiven Aufwärts Y-Achsenpunkt zu haben (den Aufwärtsvektor ). Bei der Konvertierung vom Weltraum in den Modellraum möchten wir daher alle Scheitelpunktdaten so verschieben und drehen, dass sich unsere Fokusobjekte in der Nähe des Ursprungs befinden und positive Z-Koordinaten haben.
Wenn Sie Objekte im wirklichen Leben betrachten, werden Sie ein Phänomen bemerken, das als Verkürzung bezeichnet wird . Dies bedeutet, dass Objekte in Ihrer Nähe größer erscheinen (dh mehr von Ihrer Ansicht einnehmen), während Objekte, die weit von Ihnen entfernt sind, kleiner erscheinen (dh weniger von Ihrer Ansicht einnehmen). Wir simulieren dies, indem wir eine perspektivische Transformation anwenden , die die Scheitelpunktkoordinaten unseres Kameraraums in den projizierten Raum verschiebt .
Beachten Sie schließlich, dass wir 3D-Scheitelpunktdaten haben, die auf einem 2D-Bildschirm gerendert werden müssen (z. B. 1920 x 1080 Pixel). Die Scheitelpunktdaten im Kameraraum werden daher in Bildschirmraum umgewandelt . Ihre Grafik-API sorgt dafür, dass die Scheitelpunktdaten des Bildschirmbereichs auf Ihrem Bildschirm gerendert werden. Das Konvertieren von Scheitelpunktdaten in Pixel auf Ihrem Bildschirm wird als Rasterisierung bezeichnet . Aber welche Scheitelpunktkoordinaten landen wo auf Ihrem Bildschirm? Hier kommt das kanonische Ansichtsvolumen ins Spiel.
DirectX gibt an, dass die X-Koordinate des Scheitelpunkts der horizontalen Position auf dem Bildschirm zugeordnet wird. Insbesondere: Der Bereich [-1 ; 1]
wird zugeordnet [0 ; 1920]
(bei einem 1920 x 1080-Bildschirm). Die Y-Koordinate des Scheitelpunkts wird der vertikalen Position auf dem Bildschirm zugeordnet. Insbesondere: Der Bereich [-1 ; 1]
wird zugeordnet [0 ; 1080]
(bei einem 1920 x 1080-Bildschirm). Die Z-Koordinate wird verwendet, um zu bestimmen, welche Eckpunkte vor oder hintereinander gerendert werden müssen. Insbesondere befinden sich Scheitelpunkte in der Nähe von 0 in der Nähe der Kamera und sollten vor gerendert werden. Scheitelpunkte in der Nähe von 1 sind weit von der Canera entfernt und werden hinterher gerendert. Scheitelpunkte mit einer Z-Koordinate kleiner als 0 befinden sich hinter der Kamera und werden daher abgeschnitten - dh nicht gerendert. Scheitelpunkte mit einer Z-Koordinate größer als 1 sind zu weit entfernt und werden ebenfalls abgeschnitten.
Ihre Perspektiventransformation muss daher alle Scheitelpunkte verschieben, die auf Ihrem Bildschirm in diesem kanonischen Ansichtsvolumen sichtbar sein sollen. In dem Tutorial, dem Sie gefolgt sind, werden alle diese Transformationen weggelassen, um das Tutorial einfach zu halten. Sie rendern somit direkt auf das kanonische Ansichtsvolumen. Aus diesem Grund sagt der Autor, dass alles außerhalb des Bereichs [-1 ; 1] x [-1 ; 1] x [0 ; 1]
nicht sichtbar ist.
Verweise
Einen Artikel mit Bildern zur Veranschaulichung dieser verschiedenen Koordinatenräume finden Sie unter Welt-, Ansichts- und Projektionstransformationsmatrizen von CodingLabs .