Wie kann ich dafür sorgen, dass 3D-Gelände wie Animal Crossing wegfällt?

15

Animal Crossing hat eine einzigartige Art, die Weltkarte zu scrollen: Wenn sich der Charakter nach unten bewegt, rollt die Welt oben herum und herum, als wäre sie an einer Pappröhre befestigt:

Animal Crossing ist die Zylinderwelt

Dieses Video zeigt, wie es sich bewegt.

Wie kann ich diesen Effekt erzeugen?

Chris
quelle
1
Sieht für mich nicht nach einem Effekt aus, sondern nach einer sehr einfachen 3D-Welt, der die Kamera gerade folgt.
James
Wenn Sie das Spiel hacken, kann dies zu einem Kollisionsfehler führen, durch den Sie in den Ozean laufen können, in dem die Welt untergeht. Sie können Teile der Welt sehen, die in der Leere hinter dem Rand der Welt "zurückgebogen" sind. Video hier .
Anko

Antworten:

6

Ich habe ein bisschen experimentiert, nachdem ich Deathspank gespielt habe, was einen ähnlichen Effekt hat. Obwohl ich mich nie genug damit befasst habe, um zu sehen, ob es so optimiert werden kann, dass es super gut funktioniert, besteht eine Möglichkeit darin, die Elemente in Ihrem Vertex-Shader nur basierend auf der Tiefe zu ändern. Eine Funktion, die cos (Tiefe) einer Modifikation der Y-Achse zuordnet, funktioniert. Sie können es so einstellen, dass die Welt nicht nur in der Ferne abfällt, sondern sich auch näher als eine Tiefe befindet, wodurch sich die Welt besonders rund anfühlt. Sie können dasselbe für den Wert der X-Achse tun, um ihn sphärischer erscheinen zu lassen. Ich bin mir nicht sicher, ob solche Spiele so funktionieren. Meine Experimente lieferten unbefriedigende Ergebnisse, aber ich habe nicht viel mit den Verhältnissen gespielt, daher war es möglicherweise so einfach, die Falloff-Rate zu ändern, um sie zu verbessern.

Sean Middleditch
quelle
+1, weil ich es so machen würde. Möglicherweise möchten Sie jedoch klarstellen, was Sie unter "Tiefe" verstehen. Es kann sich um die Entfernung zur Kamera oder um die Entfernung zum Charakter handeln. Ich denke, es wäre gut, mit beiden zu experimentieren.
DaleyPaley
Tut mir leid, dass ich zu spät zur Party komme - etwa 6 Jahre zu spät -, aber im Fall von AC wird die "Tiefe" basierend auf der Entfernung von der Kamera berechnet ... aber da die Kameraposition auf der Position des Charakters basiert, ist alles irgendwie in Verbindung gebracht.
Lvictorino
5

Es scheint, als würde eine "flache Welt" erstellt und auf Zylinderkoordinaten abgebildet . Im Wesentlichen die Welt auf einen Zylinder wickeln. Ich habe etwas Ähnliches mit einer flachen Welt gemacht, aber ich habe es auf eine Kugel gewickelt:

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Die Art und Weise, wie ich es für eine Kugel gemacht habe, ist ähnlich wie für einen Zylinder. Wählen Sie einen geeigneten Radius (ρ oder "rho" in Zylinderkoordinaten) für Ihre Welt. Nehmen Sie für jeden Scheitelpunkt die XZ-Koordinaten Ihrer Welt (vorausgesetzt, Y ist die Höhe) und wandeln Sie sie dann mit XZ und Radius plus Y in Zylinderkoordinaten um. Wenn Sie das Y nicht hinzufügen, erhalten Sie einen flachen Zylinder. Konvertiere dann zurück in kartesische Koordinaten, um im Spiel zu zeichnen.

MichaelHouse
quelle
3
Ebenfalls zu erwähnen ist, dass die Y-Dimension der Welt bei Animal Crossing viel größer ist als der Umfang des Zylinders (nur durch Augenzwinkern, da die Horizontlinie sehr eng ist). Daher wird ein Teil der Weltkarte nur auf die Bereiche zugeschnitten, die dem Charakter am nächsten liegen, und dieser zugeschnittene Bereich wird um den gesamten Zylinder gewickelt. Es ist vergleichbar mit dem Zuschneiden einer 2D-Kachelkarte auf nur die sichtbaren Teile.
ChrisC
Hervorragender Punkt. Ich stelle mir vor, dass dies auch verwendet werden könnte, um den Speicherbedarf gering zu halten, indem die Welt nach Bedarf geladen / entladen wird.
MichaelHouse
5

Sie möchten von einer planaren Welt zu einer zylindrischen Welt wechseln.

Eine Drehung um die x-Achse (in homogenen Koordinaten) sieht folgendermaßen aus:

     | 1   0   0   0 |
Rx = | 0  ca  -sa  0 |
     | 0  sa   ca  0 |
     | 0   0    0  1 |

Wo:

ca = cos(angle) and sa = sin(angle)

Sehen Sie sich das Bild an, um den Winkel zu berechnen. Das pi / 2 bricht ab und Sie bleiben mit:

angle = offset_from_character.z - radius

Schauen Sie sich auch das Bild an. Der Winkel des projizierten Punktes ist abhängig vom horizontalen Abstand zum Zeichen, der Abstand zur Kugel ist abhängig von der Vertikalen.

new_position = character_position - vec3(0,radius,0) + Rx * vec3(0,radius+_old_position.y,0)

Stellen Sie sicher, dass Sie Dinge aussortieren, die über dem Horizont liegen, da sich sonst die ganze Welt dreht.

Haftungsausschluss: Ich habe das noch nicht getestet und bin kein Mathematikexperte, aber die Antwort lautet ungefähr so. Bitte korrigiert mich jemand, wenn ich falsch liege.

sphärische Welt

DaleyPaley
quelle