Portalprojektion

7

Ok ok ich gebe zu, ich bin gelangweilt und spiele mit einem Portalskript wie dem auf Steam.

Ich habe folgendes herausgefunden:

  • relative Positionierung der gespiegelten Kameras
  • In Textur für das Portal rendern (die Textur ist die Ansicht von der gegenüberliegenden Kamera)
  • Poly Culling (da sich die Kamera hinter dem anderen Portal befindet, wähle ich alle Polys hinter der Vorderseite des Portals aus

Ich kann nicht herausfinden, wie die Projektion skaliert werden soll, daher ignoriere ich alles außerhalb der Rückseite des Portals. Hier ist ein Bild zu erklären.

Die Rückseite von Portal 2, die von Kamera 2 aus betrachtet wird, wird auf der Vorderseite von Portal 1 angezeigt. Mein Problem ist die Skala. Ich möchte alles um die gepunktete Linie ignorieren und die Ansicht von Kamera 2 vergrößern, damit sie perfekt zur Vorderseite von Portal 1 passt. Ein großes Problem bei dieser Skalierung ist, dass sich die Perspektive ändert, wenn Sie sich bewegen. Ich bin nicht gut in Matrixmathematik, um das herauszufinden. Hat jemand eine Idee?

Ich suche nach einer Matrix, die ich als Projektionsmatrix für cam2 festlegen kann, damit dies funktioniert.

Geben Sie hier die Bildbeschreibung ein

Brandon
quelle
1
Ich habe keine Ahnung, was in der rechten Hälfte Ihres Diagramms vor sich geht und was es mit der linken Hälfte oder Ihrem Problem zu tun hat.
Doppelgreener
1
Entschuldigung, links ist eine Draufsicht auf die Kameras. Rechts ist der Blick von cam1. Der blaue Bereich ist die rendertexture für portal1 , die den Blick für cam2 zeigt
brandon
1
Ich werde morgen eine Demo davon machen, damit ich genauer zeigen kann, was mein Problem ist. Es ist schwer, es zu vermitteln, während sich alles in der theoretischen Phase befindet :)
Brandon
Ein Blick auf den Quellcode von Pseudoformen könnte hilfreich sein. (Pseudoform ist ein Open-Source-Spiel / eine Open-Source-Engine mit Portalen - pseudoform.org/index.php?id=media )
Exilyth
Ich habe seitdem lineare Algebra genommen und alles wurde klar. Ich musste nur eine Skala auf die Projektionsmatrix für Kamera 2 (die Dummy-Kamera) anwenden. Im Nachhinein wäre es einfacher gewesen, direkt am Bildschirmpuffer zu arbeiten und die Pixel innerhalb der Grenze des Portaleingangs zu ersetzen
brandon

Antworten:

2

Betrachten Sie dies als ein reines 2D-Problem. Sie haben die beiden Renderings als 2D-Bilder und müssen sich nur überlagern, ohne Skalierung, Bewegung oder lustige Projektionswinkel. Wenn Sie nur den einfachsten Kopiervorgang ausführen, den Sie sich vorstellen können, passt er perfekt.

Ich denke, Sie möchten dies möglicherweise nahtloser tun, indem Sie das Rendering von Kamera 2 als Textur für das Rendern von Kamera 1 verwenden. Damit dies ordnungsgemäß funktioniert, muss das Rendering der Nocke 2 die Textur einer Ebene sein, die beim Rendern 1 senkrecht zum Kamerawinkel steht.

Ich hoffe, dies beantwortet Ihre Frage. Es wird sicher ein wenig schwierig sein, alles richtig zu bestellen.

aaaaaaaaaaaa
quelle
Schauen Sie sich das Bild rechts an. Genau so sieht die Ansicht von cam1 aus. Das gepunktete blaue Bit muss so skaliert werden, dass es in den gesamten blauen Bereich für Portal1 passt. Es ist also schon technisch kopiert und eingefügt. Es muss jetzt maßstab den Rest der Ansicht zu ignorieren , die von cam2 kommt
brandon
Nun, cam2 muss genau den gleichen Abstand, Winkel und die gleiche Position von der Portalebene haben wie cam1, und Sie würden mit der gleichen Auflösung rendern. Ich dachte, Sie hätten das behoben. In jedem Fall sollte das cam2-Rendering auf ein Rechteck mit einer Breite von 2 * [Abstand zur Kamera] * [Kamera-Zoom] angewendet werden, damit die Größe funktioniert. Dies sollte die richtige Größe ergeben.
aaaaaaaaaaa
0

Dieses System ist nicht erforderlich. Einfach die Hardware-Instanz des Raums (und seines Inhalts), dann übersetzen und bei Bedarf drehen, um eine Übereinstimmung zu erzielen und die GPU das Keulen durchführen zu lassen. Dies hat den großen Vorteil, dass die Welt nahtlos wird - das heißt, Sie müssen die KI nicht speziell damit oder so arbeiten lassen, da Sie die Welt effektiv erweitern, anstatt sie nur zweimal zu rendern.

DeadMG
quelle
1
Kann das nicht machen. Das führt zu allerlei Einschränkungen bei der Einrichtung der Portale und ihrer Positionen. Wie gesagt, ich habe alles außer der Projektionsmatrix implementiert. Es ist eine sehr einfache Lösung, die keine Einschränkungen wie eine zweite Instanz verursacht
brandon
1
Portal verwendet übrigens Rendertexturen. So auch Narbacular Drop, woher die Idee für das Portal kam
Brandon
1
Als jemand, der gestern buchstäblich Portal 1 mit Entwicklerkommentar durchgespielt hat, werden keine Rendertexturen verwendet :) Sie hatten Leistungsprobleme damit. Es wird einen Teil des letzten Framebuffers als Fallback-Lösung für unendliche Portale neu rendern, aber im Allgemeinen wird verschachtelte Geometrie gerendert. Überprüfen Sie den Entwicklerkommentar für die Testkammerstufen 3 und 14 und spielen Sie ein wenig mit dem Verhalten bei 14 herum - es ist visuell klar, wenn es auf die alte gerenderte Version zurückgreift.
ZorbaTHut