OpenGL ES Bildschirmprojektionsmatrix und Kamera Projektionsmatrix

8

Ich habe eine Projektionsmatrix, die von der Kamerakalibrierung in einer Augmented-Reality-App abgeleitet wurde, und solange das Bildschirm-Seitenverhältnis dem Bildseitenverhältnis der Kamera entspricht, ist alles in Ordnung. Wenn das Kamerabild nicht mit dem Bildschirm Kante für Rand übereinstimmt, werden Verzerrungen im Tracking verursacht.

Die Problemszenarien:

  • 1280x720 Video auf einem iPad
  • 640x480 Video auf einem iPhone 5S.

Die Arbeitsszenarien:

  • 640x480 Video auf einem iPad
  • 1280x720 Video auf einem iPhone 5S.

Ziel: Ich möchte dieses Bild / Kamera-Seitenverhältnis auf eine allgemeine Art und Weise behandeln.

Dieses Problem besteht, weil die Ansicht die Gerätekoordinaten im Seitenverhältnis des Bildschirms (4: 3 für iPad) normalisiert hat, während die Projektionsmatrix ein Seitenverhältnis des Kamerabilds hat (16: 9 für 720p). Das Hintergrundbild muss mit der Projektionsmatrix übereinstimmen oder die Illusion von Augmented Reality schlägt fehl. Wenn ich also zwischen 'Anpassen' und 'Füllen' wechseln möchte, muss ich die Projektionsmatrix ändern, um sie an die Bildgröße anzupassen.

Hinweis: Ich möchte dieses Problem ohne OpenGL-spezifische Lösung lösen. Ich suche also nach einer allgemeineren mathematischen Antwort, bei der die Projektionsmatrix manipuliert wird.

    
Cameron Lowell Palmer 11.02.2015, 10:18
quelle

2 Antworten

1
  

Aber mir ist klar, dass ich die Projektionsmatrix der Kamera auf die Karte abbilden muss   Bildschirm Projektionsmatrix oder vielleicht skalieren Sie es.

Das Bildseitenverhältnis bestimmt wirklich nur, was auf dem Bildschirm angezeigt wird (d. h. die Menge des peripheren Sehens) - es sollte die Projektion nicht grundlegend ändern (vorausgesetzt, Sie halten die nahen und fernen Clips gleich).

Als erstes ist zu beachten, dass es nicht wirklich eine sichere Zuordnung gibt (d. h. nicht jede Koordinate in der Bildschirmansicht hat ein Äquivalent in der Kameraansicht und umgekehrt).

Um Verzerrungen zu vermeiden, haben Sie zwei Optionen: Sie können entweder auf die schmalere der beiden Optionen (Informationen verwerfen) oder mit dem Letter-Kasten verkleinern und das ursprüngliche Seitenverhältnis beibehalten (Bildschirmbereich verwerfen).

Beide Dinge scheinen mit einem einfachen Skalierungsfaktor möglich zu sein, der auf die endgültige Clip-Space-Transformation angewendet wird (vorausgesetzt, Sie schneiden gleichmäßig auf beiden Seiten des Kegelstumpfes ab), sollten Sie die Clip-Space-Koordinate der Achse einfach multiplizieren Sie möchten einen Clip (skalieren & gt; 1), oder mehrere runter (skalieren & lt; 1), wenn Sie Letterbox möchten). Um Letterboxing funktionieren zu lassen, müssen Sie glViewport oder glScissor verwenden, um Primitive außerhalb des Letterboxes zu stoppen.

    
solidpixel 07.03.2015, 00:39
quelle
0

Vermeiden Sie den Umgang mit der Projektionsmatrix

Der einfache Weg, obwohl nicht so intellektuell befriedigend wie eine mathematische Lösung, besteht darin, Ihre Szene in einer Ansicht von der Größe des Kamerabildes zu platzieren. Dann platzieren Sie diese Ansicht in einer enthaltenden Ansicht. Dann ändern Sie die Größe der gesamten Ansicht, um sie an den Bildschirm anzupassen oder die Bildschirmgröße zu füllen.

    
Cameron Lowell Palmer 18.03.2015 07:24
quelle