Ich implementiere derzeit ein Spiel mit einem Top-Down-Blick auf den Ozean. Ich benutze folgende, ein wenig abstrakte Textur:
Die eigentliche Textur ist transparent, ich habe der Klarheit halber die grünliche Farbe hinzugefügt.
Das Problem, das ich jetzt habe, ist, dass ich nicht weiß, wie ich diese Textur animieren soll, damit das Wasser schön aussieht. Ich versuchte , die Textur mit einer Sinuswelle zu bewegen: texture.y += sin(angle)
. Natürlich bewegt sich jetzt die gesamte Textur, was irgendwie unrealistisch aussieht. Als nächstes habe ich versucht, eine weitere Ebene hinzuzufügen und einen Parallaxeeffekt zu implementieren. Damit würden sich auch Reflexionen unter der Wasseroberfläche bewegen, allerdings viel langsamer. Es sieht ein bisschen besser aus, aber immer noch nicht ... nett genug.
Ich denke, die am besten aussehende Animation wäre, wenn sich die einzelnen Zellen ausdehnen und zusammenziehen würden, wie ein Netz oder ein Stück Stoff. Stellen Sie sich vor, jemand würde an einem Scheitelpunkt dieser Zellen leicht ziehen und die benachbarte Zelle würde sich ausdehnen und die Zelle, zu der ich ziehe (oder die ich drücke), würde sich zusammenziehen. Ein bisschen wie ein Federnnetz (?). Aber ich habe keine Ahnung, wie ich so etwas implementieren soll:
- Was ist das Mathe-Modell dafür? Etwas mit Federn, wo Kräfte drücken / ziehen?
- Und wenn ja, wie ordne ich dieses Modell der angegebenen Textur zu? Alle Kurven behalten und was nicht ...
(Ich bin auch offen für verschiedene Ideen / Antworten, wie man die gegebene Textur animiert. Hier geht es nicht um Realismus, sondern nur um ein paar gut aussehende Bewegungen, die wie Wasser aussehen ...)
Lösung von DMGregory
Ich habe in diesem Beitrag ein libgdx-Beispiel gepostet: 2D-Wasseranimation ist gezackt und nicht glatt (siehe Antwort zur Texturfilterung)
_Noise
ist [ein Textur-Sampler, der aus] der oben genannten kleinen blöden zufälligen Textur.v2f i
sind die interpolierten Daten aus dem Vertex - Shader. Wir verwenden sie hauptsächlich, um die Texturkoordinaten für das Pixel zu ermitteln, das wir zeichneni.uv
. Und im Übrigen liegen Sie genau richtig.Dies wird als ätzender Effekt bezeichnet, und das Erzeugen dieser Effekte zur Laufzeit ist ziemlich zeitaufwendig. Daher wird dies traditionell mit vorgerenderten Einzelbildanimationen durchgeführt. Es gibt Tools, die ätzende Animationsrahmen für Sie erstellen , wie z. B. Caustics Generator , der eine kostenlose Version für nichtkommerzielle Zwecke enthält. Es gibt auch einige vorgefertigte, die Sie für deutlich günstigere Preise als die von mir erwähnte Pro-Version des Tools kaufen können.
Beachten Sie, dass ätzende Effekte in der Regel auch ein Effekt sind, der als leichter Keks auf einem Unterwassergelände oder auf der Unterwasseroberfläche angewendet wird. Das heißt, es auf die Oberfläche des Wassers zu legen, während man hineinschaut, ist normalerweise nicht so, wie Wasser aussieht.
quelle
Dies sieht aus wie eine Textur, die Sie aus einem Voronoi-Diagramm generieren könnten, z.
Sie können kleine, sanfte Anpassungen am Diagramm vornehmen, indem Sie die Punkte verschieben. Das erneute Zeichnen des Graphen in jedem Frame ist sehr teuer. Daher möchten Sie die Animation wahrscheinlich vorab rendern.
quelle
Es gibt eine Oldschool-Methode, die eine untere Texturebene und zwei halbtransparente Texturen für die Reflexion darüber umfasst.
Wenn Sie den ganzen Weg gehen möchten und das Wasser nicht voller geklonter Wellen oder samischblauer Suppen aussehen soll, sind Flowmaps das richtige Ziel.
https://steamcdn-a.akamaihd.net/apps/valve/2010/siggraph2010_vlachos_waterflow.pdf
quelle