Frage

Ich arbeite an einem Computer Vision Problem, das ein 3D-Modell mit einer kalibrierten Kamera erfordert Rendering. Ich schreibe eine Funktion, dass bricht die kalibrierte Kameramatrix in eine Model-View-Matrix und eine Projektionsmatrix, aber ich habe in ein interessantes Phänomen in opengl führt, dass trotzt Erklärung (zumindest von mir).

Die Kurzbeschreibung ist, dass die Projektionsmatrix führt zu nichts zu negieren gemacht zu werden (zumindest in meiner Erfahrung). Ich würde erwarten, dass die Projektionsmatrix durch eine skalare Multiplikation hätte keine Auswirkung haben, weil sie homogene Koordinaten transformiert, die durch Skalierung nicht beeinflusst werden.

Im Folgenden finden Sie meine Argumentation, warum ich das finden sein unerwartet; vielleicht kann jemand zeigen, wo meine Argumentation fehlerhaft ist.

Stellen Sie sich die folgende Perspektive Projektionsmatrix, die korrekten Ergebnisse liefert:

    [ a b c 0 ]
P = [ 0 d e 0 ]
    [ 0 0 f g ]
    [ 0 0 h 0 ]

Diese Multiplikation mit Kamerakoordinaten gibt homogene Schneidekoordinaten:

[x_c]   [ a b c 0 ]   [X_e]
[y_c] = [ 0 d e 0 ] * [Y_e]
[z_c]   [ 0 0 f g ]   [Z_e]
[w_c]   [ 0 0 h 0 ]   [W_e]

Schließlich normalisierte Gerätekoordinaten zu erhalten, teilen wir X_c, Y_c und z_c von w_c:

[x_n]   [x_c/w_c]
[y_n] = [y_c/w_c]
[z_n]   [z_c/w_c]

Wenn wir nun P negieren, sollten die resultierenden Clip Koordinaten negiert werden, aber da sie homogenen Koordinaten sind in jeder Beziehung skalare Multiplikation (z -1) sollte nicht auf die resultierenden normalisierten Gerätekoordinaten beeinflussen. Doch in OPENGL, negiert P Ergebnisse in nichts gemacht zu werden. Ich kann mehrfach P von jedem nicht-negativen Skalar und exakt die gleichen Ergebnisse erbracht, aber sobald ich mehrfach mit einem negativen Skalar, nichts macht. Was ist hier los ??

Danke!

War es hilfreich?

Lösung

Nun, der Kern von ihm ist, dass Clipping-Prüfung erfolgt durch:

-w_c < x_c < w_c
-w_c < y_c < w_c
-w_c < z_c < w_c

Multiplying durch einen negativen Wert bricht diesen Test.

Andere Tipps

Ich habe gerade diese tidbit, die Fortschritte in Richtung auf eine Antwort macht:

Vom Roten Buch, Anhang G:

  

Vermeiden Sie die Verwendung negativ w Vertex-Koordinaten und negative q-Texturkoordinaten. OpenGL könnten solche Koordinaten nicht richtig befestigen und könnte Interpolationsfehler, wenn Primitiven definiert durch solche Koordinaten schattieren.

, um die Projektionsmatrix Invertierung wird in negativem W Clipping führen koordinieren und scheinbar opengl nicht so. Aber kann jemand erklären, warum opengl nicht diesen Fall behandeln?

Referenz: http://glprogramming.com/red/appendixg.html

Gründe ich mir vorstellen kann:

  • durch die Projektionsmatrix invertieren, werden die Koordinaten nicht mehr innerhalb Ihrer zNear und zFar Ebenen des Sichtstumpfs (notwendigerweise größer als 0).
  • Fensterkoordinaten zu erstellen, werden die normalisierten Gerätekoordinaten übersetzt / vom Ansichtsfenster skaliert. Also, wenn Sie einen negativen Skalar für den Clip Koordinaten verwendet haben, die normalisierten Gerätekoordinaten (jetzt invertiert) übersetzen das Ansichtsfenster Fensterkoordinaten, die ... sind aus dem Fenster (links und unten, wenn man so will)

Auch da Sie mit einer Kamera Matrix erwähnt und dass Sie die Projektionsmatrix invertiert haben, muss ich fragen ..., auf die Matrizen bewerben Sie sich, was von der Kamera Matrix? auf der Projektionsmatrix speichern in der Nähe von Betriebs- / far / fovy / Aspekt alle möglichen Probleme in der Tiefe verursacht Puffer einschließlich irgendetwas, dass Anwendungen z (gründlichere Prüfung, Face Culling, etc).

Der Abschnitt OpenGL FAQ auf Transformationen hat einige mehr Details.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top