Das wichtigste ist, dass es Ihre Punkte (Scheitelpunkte) vom 3D-Weltraum in den 2D-Bildschirmraum konvertiert.
Das bedeutet, dass nach der Multiplikation des Scheitelpunkts mit dieser Matrix die X- und Y-Koordinaten auf dem Bildschirm positioniert sind (zwischen [-1, 1]) und Z die Tiefe ist. Z wird für den Tiefenpuffer verwendet und gibt an, wie weit der Scheitelpunkt (oder das Fragment) von Ihrer Kamera in der Nähe der Ebene entfernt ist.
Projektion bedeutet, dass Scheitelpunkte, die näher an der nahen Ebene liegen, weiter von der Mitte des Bildschirms entfernt sind. Und dies basiert auf Ihrem Sichtfeld - Sie geben es in eine Funktion createProjectionMatrix oder createFrustum ein. Es funktioniert so, dass es Ihren Kamerastumpf und die Scheitelpunkte darin in einen Einheitswürfel schert und skaliert. Werte, die größer als 1 und kleiner als -1 sind, werden nicht angezeigt.
Hält auch das Pixel-Seitenverhältnis, sodass Pixel quadratisch sein können. Das ist einfach Es schert einfach Kamerakegel wie folgt: breiterer Bildschirm -> mehr vertikale Scherung und umgekehrt.
Einfache Antwort:
Es definiert Ihren Kamerastumpf und ist gut für:
- Objekte, die sich in Ihrer Nähe befinden, wirken größer als Objekte, die sich in Ihrer Nähe befinden.
- Pixel-Seitenverhältnis beibehalten - Jeder mag quadratische Pixel, oder? :)
Diese Antwort ist lange nach der Tatsache, aber da ich dies auf Google gefunden habe, wird dies vielleicht noch jemandem helfen. Ich möchte nur klarstellen, was JasonD und Notabene gesagt haben: Es ist viel einfacher, Beschneidungsberechnungen durchzuführen (finde heraus, was du sehen solltest und was nicht, weil du so aussiehst, wie weit es ist, ect .). Anstatt zu prüfen, ob sich die Ebenen an den Rändern Ihres Betrachtungskegelstumpfs überschneiden, vergleichen Sie einfach die x, y, z von allem mit xMax, xMin, yMax, ect. , da hast du einfach einen würfel. Es ist etwas komplizierter, wenn Sie nur einen Teil von etwas zeigen möchten, aber die Mathematik ist mit einem Einheitswürfel immer noch besser als mit einem Kegelstumpf.
Ein paar Dinge, die ich in anderen Antworten irreführend fand:
- Sie scheren nicht die Seiten des Betrachtungsstumpfs ab, sondern verziehen ihn mit homogenen Matrixtransformationen in einen Würfel.
-Wir konvertieren mit diesem Schritt nicht in einen 2D-Bildschirm. Dieser Schritt ist dazu nicht erforderlich. Theoretisch könnten wir all unsere Arbeit erledigen, ohne den Kegelstumpf zuerst in einen Würfel umzuwandeln. Das wäre intuitiver, aber schwieriger. Bei Grafiken geht es jedoch darum, Berechnungen sehr schnell durchzuführen, da es für ein durchschnittliches Spiel / was auch immer eine Menge Berechnungen pro Sekunde gibt.
Weitere Details: Es ist nicht unbedingt ein Einheitenwürfel, in den wir konvertieren, es muss nur ein rechteckiges Feld sein, damit unsere Max-Min-Berechnungen funktionieren. Tatsächlich haben wir in der Klasse ein Kästchen verwendet, in dem die Kamera auf die z-Achse zeigt, z von 0 nach 1 geht, x von -1 nach 1 geht und y von -1 nach 1. Im Allgemeinen in Mathe 1, 0, und -1 sind gute Zahlen, um Berechnungen zu vereinfachen. Ich nehme daher an, dass wir nicht von -100 auf 100 oder so gehen.
TLDR: Dies erleichtert das Zuschneiden.
Edit: Bobobobo hat das Wesentliche. Alles ist ein Dreieck, im Allgemeinen: D.
Quelle: Teilnahme an einem Grafikkurs der Universität
quelle
Ich glaube, das liegt daran, dass OpenGL keine Annahmen darüber treffen kann, wie das Bild angezeigt werden soll (Seitenverhältnis oder Auflösung, Hardwaredetails usw.). Es rendert und bildet in einer Zwischenform ab, die das Betriebssystem oder der Treiber oder was auch immer auf die richtige Auflösung / Größe skaliert.
quelle
Ich stelle fest, dass eine Antwort bereits akzeptiert wurde, aber es ist im Allgemeinen nützlich, wenn der Ansichtsstumpf in einen Einheitswürfel umgewandelt wird.
quelle
Ich habe mich auch gefragt. Es gibt ein paar Dinge zu beachten.
Erstens, ja, alles auf der Welt wird in diesen Einheitswürfel [-1,1] umgewandelt, der um den Ursprung zentriert ist. Wenn sich etwas nicht in diesem Einheitswürfel befindet, wird es nicht angezeigt.
Das Schöne daran ist jetzt, dass man Dreiecke ziemlich leicht ausmerzen kann. (Wenn alle 3 Eckpunkte eines Dreiecks haben
x > 1
oderx < -1
dann kann dieses Dreieck ausgesondert werden).quelle
Ich würde empfehlen, die Lektion zur perspektivischen Projektionsmatrix auf Scratchapixel zu überprüfen
http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix
Es wird deutlich, dass das Warum darin besteht, den Sichtstumpfraum zu einem Einheitswürfel zu verzerren. Warum? Im Wesentlichen, weil beim Projizieren von 3D-Punkten auf die Leinwand NDC-Raum konvertiert wird. Hierbei handelt es sich um einen Raum, in dem Punkte auf dem Bildschirm im Bereich [-1,1] neu zugeordnet werden (vorausgesetzt, der Bildschirm ist quadratisch). Jetzt ordnen wir auch die Z-Koordinate des Punkts dem Bereich [0,1] (oder manchmal [-1,1]) zu, sodass Sie am Ende einen Würfel erhalten. Tatsache ist, dass Punkte, die in einem Würfel enthalten sind, einfacher zu verarbeiten sind, als wenn sie in der Ansicht frustrum (einem seltsamen Raum, einer Pyramidenstumpf) definiert sind. Ein weiterer Grund ist, dass es alle Arten von projektiven Transformationen, die Sie sich in CG vorstellen können, auf den gleichen Raum bringt (das Einheitswürfel-Ding). Egal, ob Sie zum Beispiel eine Perspektive oder eine orthografische Projektion verwenden,
Obwohl Sie sich vielleicht zu sehr auf das Warum konzentrieren. Der Einheitswürfel ist eigentlich nur das Ergebnis des Prozesses der beteiligten Mathematik oder wird verwendet, um Eckpunkte auf einen Bildschirm zu projizieren und ihre Koordinaten dann dem Rasterraum neu zuzuordnen.
quelle