In vielen Spielen, in denen der Spieler unter Wasser gehen kann, sieht es so aus, als ob sich die obere Hälfte des Bildschirms in der Luft befindet und die untere Hälfte des Bildschirms im Wasser. Es ist fast so, als ob das Wasser nicht existiert Spieler fliegt langsam mit Wassergeräuschen?
Gibt es einen logischen Weg, dies zu lösen? Ein Algorithmus? Es scheint, dass noch keine Lösung gefunden wurde, da dies in vielen Spielen immer noch der Fall ist. Ich möchte nicht den gleichen Fehler machen.
3d
rendering
terrain-rendering
water
LiquidFeline
quelle
quelle
Antworten:
Wie wäre es einfach, diese Situation nicht zuzulassen?
Ich weiß nicht, wie du dein Spiel machst, aber wenn du feststellst, dass die Ansicht teilweise unter Wasser ist, kannst du die Kamera zwingen, über Wasser zu sein, und nur wenn die gesamte Ansicht unter Wasser wäre, kannst du zu wechseln Unterwasseransicht.
Je nachdem, wie Sie es machen, kann es zu einer zusätzlichen Verzögerung kommen, wenn Sie mit dem Tauchen beginnen und die Szene tatsächlich unter der Oberfläche betrachten. Unter UX-Gesichtspunkten ist dies möglicherweise eine gute Sache. Sie können also gerne experimentieren.
Ich frage mich, warum die meisten Unterwasserszenen kristallklar sind. Wenn Sie Ihren Kopf jemals unter Wasser halten, werden Sie feststellen, dass Ihre Augen nicht für Unterwassersicht entwickelt wurden und daher alles verschwommen erscheint. Sie müssten eine Schutzbrille tragen, um unter Wasser klar zu sehen.
Und außerdem sehen (und hören) die Dinge unter Wasser ganz anders aus als über Wasser. Wasser absorbiert das Licht viel schneller als Luft. Je weiter das Licht fließt, desto weniger Licht gelangt in Ihre Augen. Dies bedeutet, je tiefer Sie gehen, desto blauer wirken die Dinge (rotes Licht hat weniger Energie und wird daher leichter absorbiert als blaues Licht). Tatsächlich sieht Blut in einer Entfernung von nur 12 Metern unter Wasser schwarz und nicht rot aus.
Ich habe noch kein nicht spezialisiertes Spiel gesehen, das sogar versucht, Unterwasserumgebungen in Ordnung zu bringen ...
quelle
Das Problem, auf das Sie sich beziehen, hängt mit dem Bildvolumen der Kamera zusammen, das durch das Wasserflugzeug abgeschnitten wird. Typische "Unterwassereffekte" werden über Post-Process-Effekte im Vollbildmodus erzeugt und sehen nicht richtig aus, wenn die Ansicht wie folgt beschnitten wird (dies wäre genau das Gegenteil).
Selbst wenn Sie sich die Mühe machen, den Clipping-Fall (möglicherweise schwierig) zu erkennen und den ansonsten im Vollbildmodus angezeigten Unterwassereffekt so zu scheren oder zu beschneiden, dass er nur auf die Unterwasserszene angewendet wird (eine mögliche Lösung, die Sie untersuchen könnten), haben Sie immer noch die Problem des tatsächlichen Wasserflugzeugs selbst. Der Übergang dorthin würde immer noch ein erschütterndes visuelles Artefakt sein. Sie könnten dieses Flugzeug erkennen und es stark verwischen. Dies ist wahrscheinlich die beste Annäherung, die Sie an eine reale Analogie der Ansicht durch ein teilweise untergetauchtes Kameraobjektiv erreichen können.
Alternativ können Sie verhindern, dass dies vollständig geschieht: Lassen Sie die Kamera nicht unter das Wasserflugzeug fahren, wenn sich der Spieler "über" dem Wasser befindet, oder über dem Wasserflugzeug, wenn sich der Spieler "unter" dem Wasser befindet. Dies funktioniert nur dann wirklich, wenn Sie diskrete Spielerbetriebsarten für Über- / Unterwasser haben. Dies funktioniert am besten, wenn es eine physische Taste oder eine andere eindeutige Aktion gibt, die der Spieler ausführen kann, um zwischen "Schwimmen auf der Oberfläche" und "Schwimmen unter Wasser" zu wechseln die Oberfläche."
Anstelle eines expliziten Tastendrucks zum Tauchen können Sie Vorwärtsbewegungen interpretieren, während die Kamera so weit nach unten geneigt ist, dass "Tauchen" gemeint ist. Sie können dann einen grafischen Effekt (Spritzer oder was auch immer) verwenden, um den Übergang der Kamera durch die Wasserebene zu verbergen, den sie normalerweise nicht überqueren könnte.
In Guild Wars 2 haben wir eine solche Technik angewendet.
quelle
Bei Spielen werden normalerweise bestimmte Effekte aktiviert, vor allem blauer Nebel, wenn sich die Kamera unter Wasser befindet. Um die Situation zu bewältigen, in der die nahe Ebene durch die Wasseroberfläche schneidet, können Sie den Nebel-Shader aktivieren, wenn sich die Kamera der Wasseroberfläche nähert. Fügen Sie dann dem Pixel-Shader einen Code hinzu, der den Punkt auf der nahen Ebene berechnet, der entspricht Dieses Pixel aktiviert den Nebel nur, wenn sich dieser Punkt unter der Wasseroberfläche befindet.
Wenn Nebel als Nachbearbeitung durchgeführt wird, indem ein Vollbilddurchgang gerendert wird, ist dies besonders einfach: Sie müssen lediglich die Weltraumposition jedes Scheitelpunkts des Vollbild-Quadrats oder -Dreiecks in der nahen Ebene (mit der Umkehrung) berechnen Ansicht / Projektionsmatrix) und interpolieren Sie diesen Wert bis zum Pixel-Shader. Dann können Sie die vertikale Komponente überprüfen und feststellen, ob sie sich über oder unter der Wasserfläche befindet.
Für Bonuspunkte können Sie dieselbe Technik verwenden, um eine einige Pixel dicke Textur hinzuzufügen, um den Meniskus an der Wasseroberfläche darzustellen , sodass er nicht so stark wie eine scharfe Linie aussieht.
quelle
Ich habe zwei Methoden; Einer verwendet einen Shader, der andere könnte eine GUI verwenden. Beide starten gleich:
"Vereinfacht" -
If, Object(Camera) is in 3d Space(Water bounding box/whatever you choose) trigger a shader/GUI.
Shader gibt mehr Realismus, Sie können eine Verzerrung wie diese anwenden
Nebel wie Com. Junge sagte, kann über die GUI angewendet werden. Erstellen Sie ein Foto mit teilweiser Transparenz und verwenden Sie es als GUI für die gesamte Kameraansicht. Für das von Ihnen gelieferte Foto würde ich eine braune Farbe versuchen.
Dies wurde in einem Horrorspiel namens Drea D Out verwendet. Näherte sich der Spieler einem Geist, wurde der Bildschirm neblig. Obwohl es nicht unter Wasser verwendet wurde, ergab es einen ähnlichen Effekt :)
Sie können immer beide Methoden auswählen oder einen Shader erstellen, der die Farbe ändert.
quelle