Wie implementiere ich die Kollisionserkennung von Portalen?

12

Nehmen Sie zum Beispiel dieses Szenario (entschuldigen Sie meine schrecklichen Zeichenfähigkeiten): Bild

Dies basiert auf "Portal", wo der Stickman durch das blaue Portal (das mit dem roten Portal verbunden ist) geht, aber es gibt eine Wand, die ihn auf dem roten Portal aufhält. Daher kann er das Portal nicht vollständig durchlaufen.

Meine Frage ist also: Wie mache ich die Physik / Kollisionserkennung mit ihnen? Schneide ich den Player in Scheiben? Gibt es eine Möglichkeit, sie zu verknüpfen? Gibt es Physik-Engines, die dies unterstützen? Wenn nicht, wie würde ich eine machen?

MiJyn
quelle
Soweit ich weiß, erklären sie einige Dinge im Entwicklerkommentar von Portal 1.
Archy
@Byte56, danke, ich habe meinen Beitrag aktualisiert. Ich denke, dies sollte es
klarer machen
1
Ich denke, die Situation, die Sie beschreiben, ist im Portal sehr ungewöhnlich (falls es jemals passiert), da die Portale nicht frei schwebend platziert sind. Sie werden an Wänden und nur an bestimmten Wänden platziert. Ich erinnere mich nicht an eine Situation, in der ich ein Portal platzieren konnte, es aber aufgrund eines Hindernisses am anderen Ende des Portals nicht passieren konnte. Ich stelle mir vor, Sie könnten für die Übergangszeit eine temporäre Kopie des Players an beiden Standorten erstellen.
MichaelHouse
2
@Byte56: Du musst dich nicht sehr gut erinnern. Ich erinnere mich, dass dies in Portal 1 geschehen ist. Ich scheine mich an einen Quetschbereich zu erinnern, in dem man ein Portal benutzen könnte, um nicht zu sterben. Kollisionen mit Dingen in der Nähe von Portalen sind weit verbreitet und werden vom Motor problemlos verarbeitet.
Nicol Bolas

Antworten:

7

Das Portal- Spiel hat einen schönen Weg, um dieses Problem zu lösen:

Der Spieler schaut durch das Quellportal (blau) und sieht, wie er aus dem Zielportal herausragt (orange). Der Spieler wird in das Zielportal kopiert und sieht, wie er durch das Portal tritt. Das Spiel rendert das Bild, das Sie sehen, wenn Sie durch das Quellportal schauen, indem Sie eine zweite Kamera verwenden und die Textur rendern.

Die Kopie des Spielers am Zielort funktioniert jedoch nicht interagiert mit der Physik. Es ist nur zum Rendern da. Stattdessen erstellen sie virtuelle Kollisionsobjekte auf der anderen Seite des Quellportals und lassen den Player stattdessen damit kollidieren. Dies hält die Physik einfach.

Sie benötigen diese virtuellen Objekte nur so weit, wie der Spieler sie erreichen kann, ohne das Portal vollständig zu durchlaufen. Sobald der Spieler das Portal vollständig durchläuft, kehrt sich die Situation um.

Ein Bild zur Veranschaulichung : Das blaue Portal ist das Quellportal, das orangefarbene Portal das Zielportal. Die gestrichelte weiße Box ist das virtuelle Kollisionsobjekt, während die reale Box das gerenderte Objekt ist. Der Spieler (mit dem roten Punkt) interagiert nur mit den Objekten direkt um ihn herum. Die Objekte im orangefarbenen Portal werden vollständig ignoriert.

Bildbeschreibung hier eingeben

Daniel AA Pelsmaeker
quelle
4
" Verwendung einer zweiten Kamera und Render-to-Texture " Der Kommentar der Entwickler zu Portal 1 besagte ausdrücklich, dass sie Render-to-Texture nicht verwenden, da dies für ihre Anforderungen nicht gut funktionierte (insbesondere beim Betrachten von Portalen aus anderen Portalen ). Stattdessen transformieren sie im Grunde genommen eine Version der Welt auf die andere Seite des Portals und rendern sie einfach erneut.
Nicol Bolas
Wow, das beantwortet fast alles! Ich frage mich nur, ob es funktioniert, wenn das Portal ein Loch mit Objekten darin ist.
MiJyn
6

So würde ich es versuchen.

Während Sie sich in einem Portal befinden, befinden sich zwei Kopien des Players in der Physik-Engine. Jede Kopie ignoriert alle Kollisionen, die sich auf der gegenüberliegenden Seite des Portals befinden. Anschließend kombinieren Sie die Ergebnisse und wenden die Simulationsergebnisse auf beide Modelle an.

Idealerweise würden Sie die Schwerkraft für jede Hälfte des Spielers separat anwenden, aber Sie könnten möglicherweise davonkommen, wenn Sie sie nur für die Seite des Portals anwenden, auf der sich der Massenschwerpunkt des Spielers befindet.

Um diese Kollisionen zu ignorieren, müssen Sie ein geeignetes Volume einrichten und testen, ob sich ein Punkt darin befindet. Ein Zylinder (möglicherweise vertikal gestreckt) scheint eine gute Option zu sein. Der Test ist dann so etwas wieif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();

Ich glaube, die meisten Physik-Engines haben ein System zum Filtern, mit dem ein Objekt kollidieren kann. Daher sollte es möglich sein, eine Standard-Physik-Engine zu verwenden. Zum Beispiel http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering

Um die Ergebnisse zu kombinieren, wäre es wahrscheinlich die einfachste Möglichkeit, eine Art unflexible Beschränkung zwischen den beiden hinzuzufügen und die Physik-Engine damit umgehen zu lassen.

Adam
quelle
Hmm, okay, wie würde ich das machen? Ich verstehe den Teil über das Kopieren des Players, aber davon abgesehen bin ich ahnungslos. Wie würde ich die Kollisionen von der Gegenseite ignorieren? Wie würde ich die Ergebnisse überhaupt kombinieren?
MiJyn
Ich habe in einigen Details bearbeitet.
Adam
danke, ich werde darüber nachdenken und später antworten, sobald ich das
klarstellen
Vielen Dank, Ihre Antwort und die Antwort von Virtlink meine Frage :) Nun zu entscheiden, welche die "richtige Antwort" zu setzen ...
MiJyn
4

Wie würde ich berechnen, wie weit der Spieler sinkt?

Warum würdest du wollen? Sie müssen nicht berechnen, wie weit ein Spieler "runter" geht. Sie werden herausfinden, wie weit es nach unten geht, während das Objekt die Simulation durchläuft.

Wie würde ich überhaupt die Portale verbinden?

Ein Portal ist aus einer rein spielinternen Perspektive kaum mehr als ein ausgeklügelter Teleporter, der mit Kollisionen herumwirbelt, um kollidierbare Objekte in nicht kollidierbare zu verwandeln. Wenn ein Objekt das Portal berührt, beginnt es möglicherweise mit Dingen auf der anderen Seite zu kollidieren. Wenn das Objekt "weit genug" durch das Portal läuft, teleportieren Sie es effektiv zum anderen und ändern sofort seine Position und Ausrichtung.

Die Physik verläuft einfach wie gewohnt.

Nicol Bolas
quelle
When an object touches the portal, it starts potentially colliding with things on the other sideja genau. Wie würde ich das mit einer Physik-Engine machen? Ich denke, das war meine Frage :)
MiJyn
@MiJyn: Du schreibst eine Physik-Engine, die das kann. Valve musste die Source-Engine im Wesentlichen brechen , damit Portal tatsächlich funktionierte. Das kann natürlich keine kommerzielle oder Open-Source-Physik-Engine. Es gibt einen Grund, warum es trotz der Popularität von Portal keine Dutzenden von Portal-Klonen auf dem Markt gibt.
Nicol Bolas
interessant, weil es viele andere spiele gibt, die eine sehr ähnliche mechanik haben (siehe auch den tardis mod für minecraft). Ich bin sicher , dass es muss eine gewisse Art und Weise es leicht zu tun.
MiJyn