Hinweis: w=0
einen Vektor und w=1
stellen einen Punkt in OpenGL, mich bitte korrigieren, wenn ich falsch bin.
Sie liegen falsch. Mit OpenGL hat das zunächst gar nichts zu tun.Dies ist etwa homogenous coordinates, was ein rein mathematisches Konzept ist. Es arbeitet, indem es einen n-dimensionalen Vektorraum in einen n + 1 dimensionalen Vektorraum einbettet. Im 3D-Fall verwenden wir 4D homogene Koordinaten, mit der Definition, dass der homogene Vektor (x, y, z, w)
den 3D-Punkt (x/w, y/w, z/w)
in kartesischen Koordinaten darstellt.
Als Ergebnis für jeden w != 0
, Sie einen bestimmten endlichen Punkt, und für w = 0
sind hermeneutische Sie einen unendlich Punkt weit weg in eine bestimmte Richtung. Dies bedeutet, dass die homogenen Koordinaten in der Hinsicht leistungsfähiger sind, dass sie tatsächlich unendlich weit entfernte Punkte mit endlichen Koordinaten beschreiben können (was für perspektivische Transformationen sehr nützlich ist, wo unendlich weit entfernte Punkte auf endliche Punkte abgebildet werden und umgekehrt)).
Sie können sich als Abkürzung (x,y,z,0)
als Richtungsvektor vorstellen. Aber für einen Punkt, es ist nicht nur , w
Wert ungleich 0. Konzeptionell bedeutet dies, dass jeder kartesischen 3D-Punkt durch eine Linie im homogenen Raum dargestellt wird (wir gingen eine Dimension hinauf, so dass dies tatsächlich macht Sinn).
Ich nehme an (a, b, c, 1) ist der Vektor von Affine Transformation Definition, warum wir w = 1 haben, aber nicht w = 0?
Ihre Annahme ist falsch. Eine Sache über homogene Koordinaten ist, dass wir keine Übersetzung im 4D-Raum anwenden. Wir erhalten den Effekt der Übersetzung im 3D Raum, indem wir tatsächlich eine Scheroperation im 4D Raum durchführen.
Also, was wir wirklich in homogenen Raum tun möchten, ist
(x + w *a, y + w*b, z+ w*c, w)
da die 3D-Interpretation des resultierenden Vektors dann
(x + w*a)/w == x/w + a
(y + w*b)/w == y/w + b
(z + w*c)/w == z/w + c
sein wird, die die Übersetzung darstellen, die wir nach waren.
So zu versuchen, dies noch deutlicher zu machen:
Was Sie in Ihrer Frage schrieb:
p(1, 2, 3, 1) + v(a, b, c, 0) = p(1 + a, 2 + b, 3 + c, 1)
Ist hiermit ausdrücklich nicht, was wir tun wollen. Was Sie beschreiben, ist eine affine Übersetzung in Bezug auf den 4D-Vektorraum.
Aber was wir eigentlich wollen eine Übersetzung in den 3D-kartesischen Koordinaten, so
(1, 2, 3) + (a, b, c) = (1 + a, 2 + b, 3 + c)
Ihre Formel anwenden tatsächlich eine Übersetzung in dem homogenen Raum tun würde bedeuten, was die Wirkung des Tuns eine Übersetzung hätte die wird durch die w
Koordinate skaliert, während die Formel I gab den Punkt immer um (a,b,c)
, egal was w
wir für den Punkt gewählt haben.
Dies ist natürlich nicht wahr, wenn wir w=0
wählen.Dann werden wir überhaupt keine Änderung erhalten, was auch richtig ist, weil eine Übersetzung niemals die Richtung ändern wird - Ihre Formel würde die Richtung ändern. Ihre Formel ist nur für w=1
korrekt, was nur ein Spezialfall ist. Aber der entscheidende Punkt ist, dass wir schließlich keine Vektoraddition durchführen, sondern eine Matrix * Vektormultiplikation. Und homogene Koordinaten erlauben es uns (neben anderen, mächtigeren Dingen), eine Übersetzung durch Matrixmultiplikation darzustellen. Aber das bedeutet nicht, dass wir die letzte Spalte einfach als einen Übersetzungsvektor interpretieren können, als ob wir eine Vektoraddition durchführen würden.
Ein Punkt multipliziert mit einer Transformationsmatrix sollte Ihnen einen Punkt geben, richtig? – beaker