Warum hat der Clip Space in OpenGL 4 Dimensionen?

13

Ich werde dies als allgemeine Referenz verwenden, aber je mehr ich Online-Dokumente und -Bücher suche, desto weniger verstehe ich darüber.

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

In diesem Online-Buch finden Sie ein Beispiel dafür, wie Sie die erste und klassische Hallo-Welt für OpenGL zum Erstellen eines Dreiecks zeichnen.

Die Scheitelpunktstruktur für das Dreieck wird wie im obigen Code angegeben deklariert.

Das Buch betont, wie alle anderen Quellen, dass der Clip Space eine 4D-Struktur ist, mit der im Grunde genommen entschieden wird, was auf dem Bildschirm gerastert und gerendert wird.

Hier habe ich meine Fragen:

  • Ich kann mir nichts in 4D vorstellen. Ich glaube nicht, dass ein Mensch das kann. Was ist eine 4D für diesen Clip-Bereich?
  • Das am besten lesbare Dokument, das ich gelesen habe, spricht über eine Kamera, die nur eine Abstraktion über das Beschneidungskonzept ist, und ich verstehe, das Problem ist, warum man das Konzept einer Kamera nicht an erster Stelle einsetzt, das ein Mehr ist gewohnte 3D-Struktur? Das einzige Problem mit dem Konzept einer Kamera besteht darin, dass Sie den Interessenten auf andere Weise definieren müssen und daher im Grunde genommen eine weitere Aussage darüber machen müssen, welche Art von Kamera Sie haben möchten.
  • Wie soll ich das lesen 0.75f, 0.75f, 0.0f, 1.0f? Alles, was ich bekomme, ist, dass es sich um Float-Werte handelt und ich die Bedeutung der ersten drei Werte erhalte. Was bedeutet das für den letzten?
user827992
quelle
4
In Kapitel 4 wird genau erklärt, was die vierte Komponente tut. Tatsächlich, kratz das; In Kapitel 1 wird die Clip-to-NDC-Transformation im Rasterungsabschnitt auf halber Strecke erläutert .
Nicol Bolas
2
@NicolBolas Der Autor gibt seine Erklärung im ersten Kapitel und gibt keinen Hinweis für die nächsten Kapitel vor. Er gibt auch vor zu erklären, was als nächstes passiert, wenn er C ++ - Code kommentiert, und das Problem ist, dass er nicht alles in vollständig erklärt Das 1. Kapitel macht nicht viel Sinn, das, was ich wissen soll, an erster Stelle in das 4. Kapitel zu setzen, besonders wenn ich diese Konzepte brauche, um zu entschlüsseln, was in dem 1. Kapitel enthalten ist. Ich lese das jetzt und nicht nur ein einziges Mal. Jetzt weiß ich, dass ich weiter nach der Antwort suchen muss. Ich werde die verschiedenen Kapitel durchgehen.
User827992
1
Sie müssen nichts dekodieren. es heißt in Kapitel 1: Die W-Komponente ist in die anderen 3 Komponenten unterteilt. Dies wurde auch in der Einleitung angegeben. Was bis Kapitel 4 verschoben wird, ist, warum OpenGL dies tut. Das wird bis später aufgeschoben, weil es für die anstehende Aufgabe irrelevant ist.
Nicol Bolas
3
Es wären immer noch irrelevante Informationen für das vorliegende Problem (dh: Rendern eines Dreiecks). Sie sind neugierig darüber, aber Sie nicht müssen verstehen, warum es so , wie es zu verstehen ist , dass dies ist , wie es funktioniert. Der erste Schritt, um etwas zu lernen, ist zu verstehen, was es ist. Sobald Sie verstanden haben, was los ist, kann eine Diskussion darüber stattfinden, warum dies so ist.
Nicol Bolas
1
Diese Antwort kann helfen.
iammilind

Antworten:

9

Der magische Begriff lautet "Homogene Koordinaten", die in Systemen verwendet werden, in denen die Perspektive eine Rolle spielt. Eine Übersicht finden Sie im Wiki, aber es ist ein langer Studiengang, um es wirklich zu verstehen (was ich nicht tue).

ddyer
quelle
10

Lesen Sie die Einführung der Bücher, die Sie gelesen haben, Sie werden überrascht sein;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20und%20Rendering.html unter Rasterization Overview

Der "w" -Wert (wobei die ersten 3 Werte x, y und z sind) gibt im Grunde die Abmessungen des Clip-Bereichs an. Da dies 1 Skalarwert ist, sind alle 3 Dimensionen des Clip-Bereichs gleich (und aus diesem Grund ist der Clip-Bereich ein Würfel). Jeder Scheitelpunkt hat einen eigenen Clip-Bereich, in dem er vorhanden ist (und der im Grunde genommen "passen" muss, andernfalls CLIPS: D). Es gibt nicht eine "Welt", die der Clip-Bereich ist (obwohl sich alle Clip-Bereiche im selben befinden). world "Ich denke, auch ich habe Probleme damit; P).

Wenn Ihr Scheitelpunkt zum Beispiel die Koordinate [1,1,1] hat, wenn der Clip-Raum 1 ist, dann befindet sich der Scheitelpunkt in der oberen rechten Ecke des Bildschirms (wenn alles Standard ist, weiß ich nicht, ob die Richtungen kann geändert werden). Wenn der Scheitelpunkt jedoch einen Beschneidungsraum von 2 hat, ist die Koordinate [1,1,1] etwa 3 Viertel über den Bildschirm nach rechts, 3 Viertel über den Bildschirm nach oben und die dritte Dimension nach Ihnen kann dich selbst erraten.

Angenommen, ein Clip-Abstand von 5 würde bedeuten, dass die Positionen in diesem Clip-Abstand in jeder Dimension zwischen -5 und 5 liegen, anstatt dass der Würfel 5x5x5 ist. Aber das liegt wahrscheinlich einfach daran, dass alle xy- und z-Koordinaten durch die Abmessung des Clip-Raums geteilt werden.

x = x / w

y = y / w

z = z / w

Und genau das macht es möglich. Ich denke, der Grund dafür sind einfache Vergleiche. Wenn die Koordinaten durch die Abmessung des Clip-Bereichs geteilt wurden, befindet sich die Koordinate mit mindestens einer Komponente mit einem Wert über 1 außerhalb des Clip-Bereichs. Wenn Ihr Clip-Bereich beispielsweise 1024 ist, die Koordinate jedoch [2000,3, -100] ist, befindet sich die x (2000) -Komponente außerhalb des Clip-Bereichs (der nur zwischen -1024 und 1024 liegt).

Im Computer ist es einfach zu erkennen, ob sich etwas im Clipspace befindet, wenn Sie nur (sehr grob gesagt) Folgendes tun müssen: (x / w) <1 && (x / w)> - 1 dann rendern. Außerdem nehme ich an, dass alle Clip-Räume aller Scheitelpunkte die gleiche Größe haben (sodass jeder Clip-Raum-Würfel in jeder Dimension von -1 bis 1 reicht), was auch immer nach dem Normalisierungsprozess kommt, da ab diesem Moment alle Koordinaten gleich sind schwimmt im Bereich von 0 bis 1 (ohne Berücksichtigung der abgeschnittenen).

Dammkewl
quelle
Die Frage war, warum Clip-Space so ist, wie er ist, und nicht, was Clip-Space bedeutet. Das heißt, worum geht es bei der Division durch W?
Nicol Bolas
2
Es beantwortet die 3. Frage der 3 Aufzählungspunkte obwohl =)
Dammkewl
8

TL; DR ist kein 4D-Raum, sondern 3D plus eine Skalierungszahl, die praktisch immer 1 ist. Wenn sie 1 ist, können Sie sie ignorieren und die ersten drei Zahlen sind x, y, z. Wenn nicht, wird es komplizierter.

Hier ist eine einfache Erklärung. Scheitelpunkte in 3D sollten nur drei Komponenten haben

⌈x⌉ v = |y| ⌊z⌋

Wenn wir sie manipulieren wollen (zB Rotation, Skalierung etc.), verwenden wir eine Matrix. Das bekannteste Beispiel ist natürlich die MVP-Matrix (Model-View-Projection), die Weltkoordinaten in Clip-Räume umwandelt. So was:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

Dies hat jedoch einen großen Fehler: Sie können keine Übersetzung machen. Wenn [x,y,z]Null ist, mist das Ergebnis unabhängig davon immer Null, sodass wir kein MVP mit Übersetzung haben können. Das würde uns natürlich gefallen. Die Lösung besteht darin, am Ende unserer Vektoren eine 1 hinzuzufügen und die Matrix auf 4x4 zu erweitern:

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

(Wenn Sie sich eine orthogonale MVP-Matrix ansehen - z. B. von glOrtho()-, finden Sie die vierte Zeile mit 0 0 0 1. Manchmal wird sie sogar implizit belassen.) Wenn Sie die Mathematik durcharbeiten, werden Sie feststellen , dass dies dasselbe ist wie

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

Die vierte Komponente wird aufgerufen w, und während sie nicht haben 1 zu sein, ist es fast immer ( vor einer Transformation sowieso, danach wird es in der Regel wieder homogenisiert , indem der die ganze Vektor Teilung wso ist es 1 wieder). Es ist eine Art Hack, zuzulassen, dass Transformationsmatrizen Übersetzungen enthalten.

Bearbeiten

Ich glaube, die ursprüngliche Motivation waren perspektivische Projektionen , die mit 3D-Koordinaten unmöglich sind. Es gibt andere Transformationen, die Sie nur mit 4D Vektoren durchführen können, aber die Übersetzung ist am einfachsten zu verstehen.

Timmmm
quelle
2
Erklären Sie Ihre Abstimmungen.
Timmmm
+1, vorausgesetzt die Informationen sind korrekt, das war eine gute Erklärung und war hilfreich für mich. Danke
Luke
1

Es gibt noch einen weiteren Grund, den ich sehe und der in den vorherigen Antworten nicht erwähnt wurde.

Die Übersetzungsmatrizen sind 4x4, so dass Sie das Objekt auch "um die Welt" übersetzen können. Denn mit einer 3x3-Matrix können Sie eine 3D-Koordinate drehen und skalieren, aber Sie können eine 3D-Koordinate nur mit einer 4x4-Matrix verschieben, da hier die 3D-Koordinaten in einem 4d-Vektor ausgedrückt werden müssen.

Marco
quelle
Sie "brauchen" unter solchen Definitionen nur einen 4d-Vektor. Eine 4x4-Matrix ist nicht nur zum Hinzufügen gedacht, wie es jeder gerne annimmt und gegenüber anderen behauptet. Wenn Sie nur die Übersetzung nach der Drehung (zu einem 3D-Punkt) hinzufügen möchten, definieren Sie einfach eine 4x3-Matrix. Es ist viel effizienter, wenn Sie nur danach suchen. Sie müssen sich nicht auf Regeln beschränken, die aus einem ganzen Bündel anderer Gründe erstellt wurden, nur weil sie ordentlicher aussehen. lol
Pfütze