2015-11-14 19 views
12

In den letzten Wochen habe ich versucht, die Bibliothek libGDX zu lernen. Ich finde es schwierig, vor allem für mein erstes Bestreben, Spiele zu entwickeln, das System der Kamera/Ansichtsfenster-Beziehungen zu verstehen. Eine Codezeile, die ich habe gesagt, zu verwenden, und die API erwähnt, ist:Die libGDX Projection Matrix verstehen

batch.setProjectionMatrix(camera.combined); 

Trotz gut 4 Stunden der Forschung, ich bin immer noch ein vollständigeres Verständnis der Funktionalität dieses Codes fehlt. Es ist zu meinem grundlegenden Verständnis, dass es den Stapel "erzählt", wo die Kamera schaut. Mein Mangel an Verständnis ist deprimierend und verärgernd, und ich würde schätzen, wenn jemand mir helfen könnte. Ein weiteres Problem mit dem Code-Snippet ist, dass ich nicht sicher bin, wann es notwendig ist, es zu implementieren (in der Rendermethode, der Erstellungsmethode usw.).

Antwort

14

Betrachten Sie ein Foto mit einer Kamera. Z.B. Verwenden Sie Ihre Smartphone-Kamera, die ein Foto von einer Bank im Park macht. Wenn Sie das tun, sehen Sie die Bank im Park auf dem Bildschirm Ihres Smartphones. Das mag sehr offensichtlich erscheinen, aber schauen wir uns an, was damit verbunden ist.

Die Position der Bank auf dem Bild ist relativ zu dem, wo Sie standen, als Sie das Foto gemacht haben. Mit anderen Worten, es ist relativ zur Kamera. In einem typischen Spiel platzieren Sie kein Objekt relativ zum Objekt. Stattdessen platzierst du sie in deine Spielwelt. Das Übersetzen zwischen deiner Spielwelt und deiner Kamera erfolgt mithilfe einer Matrix (die einfach eine mathematische Methode ist, um Koordinaten zu transformieren). Z.B. Wenn Sie die Kamera nach rechts bewegen, bewegt sich die Bank auf dem Foto nach links. Dies wird als View-Matrix bezeichnet.

Die genaue Position der Bank auf dem Bild hängt auch vom Abstand zwischen Bank und Kamera ab. Zumindest ist es in 3D (2D ist sehr ähnlich, also lesen Sie weiter). Wenn es weiter weg ist, ist es kleiner, wenn es in der Nähe der Kamera ist, ist es größer. Dies wird als perspektivische Projektion bezeichnet. Sie könnten auch eine orthographische Projektion haben, in diesem Fall ändert sich die Größe des Objekts nicht entsprechend der Entfernung zur Kamera. Wie auch immer, der Standort und die Größe der Bank im Park werden in den Ort und die Größe in Pixeln auf dem Bildschirm übersetzt. Z.B. die Bank ist zwei Meter breit im Park, während es auf dem Foto 380 Pixel ist. Dies wird als Projektionsmatrix bezeichnet.

camera.combined repräsentiert die kombinierte Ansicht und Projektionsmatrix. Mit anderen Worten: Es beschreibt, wo Dinge in Ihrer Spielwelt auf den Bildschirm gerendert werden sollen.

Aufrufen batch.setProjectionMatrix(cam.combined); Anweisen der Stapel, diese kombinierte Matrix zu verwenden. Sie sollten das immer aufrufen, wenn sich der Wert ändert. Dies ist in der Regel, wenn resize aufgerufen wird und auch wenn Sie die Kamera bewegen oder auf andere Weise ändern.

Wenn Sie unsicher sind, können Sie das am Anfang Ihrer render Methode aufrufen.

+0

Große Erklärung. –

7

Die andere Antwort ist ausgezeichnet, aber ich denke, eine andere Art der Beschreibung könnte helfen, es zu klicken.

In "world space", einem der realen Welt analogen Koordinatensystem, geht es im Allgemeinen um Ihr Spiel. In der linearen Algebra können Sie Punkte im Raum von einem Koordinatensystem in ein anderes konvertieren, indem Sie die Koordinaten des Punkts mit einer Matrix multiplizieren, die die Beziehung zwischen zwei Koordinatensystemen darstellt.

Die Ansichtsmatrix wird mit einem Punkt multipliziert, um sie vom Welt- in den Kameraraum zu konvertieren (Blickwinkel der Kamera). Mit der Projektionsmatrix wird ein Punkt vom Kameraraum in den Bildschirmbereich (das flache 2D-Rechteck auf dem Bildschirm Ihres Geräts) konvertiert. Wenn Sie auf einer Kamera in Libgdx update() aufrufen, werden Ihre letzten Änderungen an Position, Ausrichtung, Ansichtsfenstergröße, Sichtfeld usw. angewendet.zu seinen Ansichts- und Projektionsmatrizen, so dass sie in Shadern verwendet werden können.

Sie müssen sich in 2D selten mit Material im Kameraraum beschäftigen, sodass SpriteBatch keine separaten Ansichts- und Projektionsmatrizen benötigt. Sie können zu einer einzigen Matrix kombiniert werden, die direkt vom Welt-Raum in den Bildschirm-Raum konvertiert, was bereits automatisch in der Kamera erfolgt, daher die camera.combined Matrix.

SpriteBatch verfügt über einen standardmäßigen integrierten Shader, der diese Projektionsmatrix mit allen Scheitelpunkten Ihrer Sprites multipliziert, sodass sie korrekt auf dem Flachbildschirm abgebildet werden.

Sie sollten setProjectionMatrix aufrufen, wenn Sie die Kamera bewegt oder die Größe des Bildschirms geändert haben.

Es gibt eine dritte Art von Matrix, eine Modellmatrix, die für 3D-Objekte verwendet wird. Eine Modellmatrix beschreibt die Orientierung, den Maßstab und die Position des Modells im Weltall. Es wird also im Modell mit Koordinaten multipliziert, um sie vom lokalen Raum in den Weltbereich zu verschieben.

4

Nehmen Sie zum Beispiel ein einfaches Sidescrolling-Spiel. Während sich der Spieler zur Seite bewegt, schwenkt die Kamera, um ihnen zu folgen. Das heißt, wo Objekte in der Welt sind, entspricht nicht unbedingt dem, wo sie sich auf dem Bildschirm befinden, da sich der Bildschirm und die Welt relativ zueinander bewegen.

Hier ist ein Beispiel: Sagen Sie, Ihr Bildschirm ist 100px * 100px Quadrat (aus irgendeinem Grund). Sie platzieren ein Objekt an der Position (50, 0), so dass es jetzt in der Mitte und am unteren Bildschirmrand ist. Jetzt sagen Sie, dass Sie Ihren Spieler nach rechts bewegen, und der ganze Bildschirm schwenkt, um dem Spieler zu folgen. Dies bedeutet, dass das Objekt, das Sie zuvor platziert haben, nach links auf dem Bildschirm verschoben werden sollte. Also ist es immer noch bei (50, 0) in der Welt, da es sich relativ zum Rest der Szenerie nicht wirklich bewegt hat, aber es sollte nun auf (sagen wir mal, 10, 0) auf dem Bildschirm gezeichnet werden, seit welchem ​​Teil Von der Welt hat sich der Bildschirm verändert. Dies ist der Unterschied zwischen "worldspace" (wo ein Objekt in der Welt ist) und "screenspace" (wo das Objekt auf der tatsächlichen Anzeige gezeichnet wird).

Wenn Sie versuchen, mit einer SpriteBatch zu zeichnen, geht es standardmäßig davon aus, dass die Koordinaten des Weltraums den Bildschirmkoordinaten entsprechen: Wenn Sie "draw at (50, 0)" sagen, wird das Objekt gezeichnet (50, 0) auf dem Bildschirm. Selbst wenn sich die Kamera bewegt, wird sie immer auf (50, 0) auf dem Bildschirm zeichnen. Wenn die Kamera schwenkt, folgt das Objekt und bleibt an der gleichen Stelle auf dem Bildschirm hängen.

Da Sie in der Regel, dass nicht wollen, geben Sie die SpriteBatch eine Projektionsmatrix, die eine Transformationsmatrix ist, die, wie Bildschirm nicht zu konvertieren sagt Koordinaten Koordinaten zu Worldspace, und umgekehrt. Auf diese Weise kann man, wenn man dem Batch "draw at (50, 0)" sagt, die von der Kamera erhaltene Matrix betrachten und sehen, dass (50, 0) in der Welt tatsächlich bedeutet, 10, 0) auf dem Bildschirm, und es wird Ihr Sprite an der richtigen Stelle zeichnen.