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?
Antworten:
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).
quelle
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).
quelle
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,m
ist 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 mit0 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 Teilungw
so 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.
quelle
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.
quelle