Nehmen Sie zum Beispiel dieses Szenario (entschuldigen Sie meine schrecklichen Zeichenfähigkeiten):
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?
Antworten:
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.
quelle
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 wie
if (!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.
quelle
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.
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.
quelle
When an object touches the portal, it starts potentially colliding with things on the other side
ja genau. Wie würde ich das mit einer Physik-Engine machen? Ich denke, das war meine Frage :)