Was ist der Zweck des kanonischen Bildbandes?

15

Ich lerne gerade OpenGL und konnte keine Antwort auf diese Frage finden.

Nachdem die Projektionsmatrix auf den Ansichtsraum angewendet wurde, wird der Ansichtsraum "normalisiert", so dass alle Punkte im Bereich [-1, 1] liegen. Dies wird allgemein als "kanonisches Ansichtsvolumen" oder "normalisierte Gerätekoordinaten" bezeichnet.

Obwohl ich viele Ressourcen gefunden habe, die mir erklären, wie dies geschieht, habe ich nichts darüber gesehen, warum es passiert.

Was ist der Zweck dieses Schritts?

breadjesus
quelle

Antworten:

7

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? :)
Notabene
quelle
Ich sehe keinen Teil, in dem er fragt, was die Projektionsmatrix macht. Er scheint sich nur zu fragen, wozu die normalisierten Gerätekoordinaten dienen.
Chris sagt Reinstate Monica
Die Projektionsmatrix definiert den Kamerastumpf. Dies erklärt jedoch nicht den Grund für [-1,1] als kanonisches Betrachtungsvolumen. Warum nicht stattdessen [-100.100]?
Bobobobo
1
weil 1 ist "häufiger" als 100: D (0 ist noch häufiger, aber Würfel 0x0x0 ist nicht sehr interessant ...)
Ivan Kuckir
5

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

Brian
quelle
Obwohl es interessant ist, scheinen Ihre Punkte teilweise wahr zu sein. Sie verwenden keine homogene Matrix. Im Clip-Raum werden Punkte nur im homogenen Raum definiert. 2) true, im Clip-Bereich werden noch keine Ponts auf die Leinwand projiziert. Dies geschieht nach der perspektivischen Teilung. Beachten Sie jedoch, dass dies zwangsläufig geschieht, wenn Sie vom Clip-Raum zurück in den kartesischen Raum wechseln. 3) ja und nein. Das Konvertieren von Punktkoordinaten in den NDC-Raum ist immer noch notwendig. Was nicht erforderlich ist, ist der Clip-Platz, der für die GPU spezifisch ist. ...
user18490
... Es ist die Clip-Space-Bühne, die nicht erforderlich ist, nicht die Neuzuordnung zum Unit-Cube. Ihre letzte Annahme ist auch nicht richtig. Sie ordnen -1 zu 1 neu zu, da es einfacher ist, vom NDC-Raum in den Rasterraum zu wechseln (die Ansichtsfenster-Transformation). Es ist sogar noch einfacher, wenn der NDC-Raum im Bereich [0,1] liegt, was bei einigen Implementierungen der Fall ist. Am Ende ist es aber alles Mathe, so dass andere Konventionen verwendet werden können. Weitere Informationen finden Sie auf der Website von Good Scratchapixel.
user18490
1

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.

Chewy Gumball
quelle
Sie sind nicht korrekt, wenn Sie über Hardwaredetails sprechen. Es gibt keine. Auch wenn Sie einen eigenen Rastarizator auf CPU schreiben (warum? Um zu erfahren, wie dieses Zeug funktioniert :)), verwenden Sie dieselben Matrizen wie auf GPU. Du hast Glück, dass ich noch keine Privilegien habe, um abzustimmen :)
Notabene
Muss das Seitenverhältnis nicht bekannt sein? Soweit ich weiß, werden die Skalierungsfaktoren für X und Y gespeichert, damit das Bild später das richtige Seitenverhältnis aufweist.
Breadjesus
3
Korrigieren Sie mich, wenn ich falsch liege, aber er spricht, nachdem Sie Punkte projiziert haben, und daher sprechen wir 2D. In diesem Fall weiß OpenGL nicht, wo Sie dieses Bild auf dem Bildschirm platzieren und wie es angezeigt wird. Es wird ein Bild erstellt, das sich dann leicht skalieren und korrekt platzieren lässt, aber das erledigt es nicht für Sie. Ich bin damit einverstanden, dass Hardwaredetails ein schlechter Name dafür waren, ich habe einfach das oben Genannte gemeint. Sie können auch eine Projektionsmatrix mit einem Seitenverhältnis angeben, dieses Verhältnis muss jedoch nicht mit dem Ihres Monitors übereinstimmen.
Chewy Gumball
3
Ich muss sagen, dass ich dieses Gespräch wirklich genieße. Sie sind nahe dran, Recht zu haben. Gehen wir tiefer. Es gibt kein Bild nach Multiplikationsscheitelpunkten von projMat. Das Ergebnis ist nur ein 2D-Punkt mit Tiefe. Dann beginnt die Rastarisierung und es entstehen Bilder. (Wenn es auf der CPU Linien zwischen Dreiecken verts zeichnen und diese füllen würde (und sie schattieren würde - was auch immer) ... auf der GPU wird es direkt vor dem Pixel- / Fragment-Shader ausgeführt). Das Seitenverhältnis setzt Punkte, die "wegskaliert" werden sollen, auf Werte größer als 1 oder kleiner als -1 und sie werden nicht angezeigt.
Notabene
2
ÄHHH! Ich sehe das Problem hier. Er sagte: "Dies wird allgemein als" kanonisches Ansichtsvolumen "oder" normalisierte Gerätekoordinaten "bezeichnet." Ich antwortete, als würde er nach normalisierten Gerätekoordinaten fragen, aber er fragte überhaupt nicht danach. Das sind in der Tat zwei völlig verschiedene Dinge, und deshalb sind wir hier uneins. Vielleicht sollte das geklärt werden, damit die Leute nicht den gleichen Fehler machen, den ich gemacht habe.
Chewy Gumball
1

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.

JasonD
quelle
Es stimmt, ich habe meine Antwort ein wenig überarbeitet, um diesbezüglich klarer zu sein.
Notabene
Übrigens ist ein Einheitswürfel ein Würfel der Seite 1. Der Name ist also unangebracht. Es sollte stattdessen als kanonisches Anzeigevolumen bezeichnet werden.
user18490
1

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 > 1oder x < -1dann kann dieses Dreieck ausgesondert werden).

Bobobobo
quelle
0

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.

user18490
quelle