And again: Opengl "Wasser" Problem

Hey Leute.
Hab eben mal versucht etwas hässliges naja… “wasser” zu rendern.
Undzwar wie folgt:

ich habe eine periodenzahl, also anzahl bögen pro reihe
nun berechne ich periodenzahl² zufällige zufallsamplituden.
die schiebe ich in den shader, und passe dort auch die y
koordinate der einzelnen punkte an. ich benutze triangle strips,
also periodenzahl strips mit jeweils periodenzahl perioden * 180 punkten…
das ganze ist etwas langsam… weil ich keine index buffer verwende. die
verstehe ich irgendwie nicht. (schon, aber bekomms nicht hin sie anzuwenden…)

Nun. Für die y animation, also dass die wasser wellen sich nach oben und unten bewegen
hab ich folgendes gemacht (das kommt nach dem was gleich kommt): vertex.y *= cos(radians((1.0f / amplitude) * animationStep))
also je größer die amplitude, desto langsamer nach oben und unten bewegen…
so sieht das “wasser” aber ziemlich blöd aus, weil es sich ja noch zu den seiten bewegen soll.
dazu dachte ich, verschiebe ich einfach die phasen, also (x * animationStep), dass versuchte ich, und zwar so:

y anpassung ohne phasen verschiebung: nvin.y = amplitude * sin(radians(nvin.x)) * sin(radians(nvin.z));
y anpassung mit phasen verschiebung: nvin.y = amplitude * sin(radians(nvin.x) * 0.001 * animationStep) * sin(radians(nvin.z) * 0.001 * animationStep);

also. das erste, ohne verschiebung, ist ja eigentlich klar, ich bilde quasi wellen in dem ich sin(x) * sin(z) nehme, (hier noch mit radians() weil ich ja
von 0 - 180 hochzähle, um 180 punkte pro periode zu haben und nicht pi * irgendwas) und das ganze mal die amplitude der jeweiligen periode.
Mit phasenverschiebung, dachte ich, nehm ich einfach das jeweilige x und z mal animationStep, (mal 0.001 weil sonst zu schnell), aber das ergebnis ist…
nicht wie erwartet.

die sinus funktion ist doch so: a * sin(bx) a ist für die höhe, amplitude, und b quasi die verschiebung also phase…
aber das klappt so irgendwie nicht. jemand ne spontane idee was falsch sein könnte?

Danke fürs lesen!

Die jar schildert das problem. (bewegen wasd und maus, enter halten für render vorgang MIT phasenverschiebung…)

*** Edit ***

ou. verschiebung war ja nicht b, sondern bx + c
naja das problem lösen tuts aber trozdem nicht. und zwar funktioniert es jetzt
zwar … glaube ich… so halb, aber die sinus cosinus wellen schneiden sich jetzt nicht mehr perfekt…
obwohl sie es doch eigentlich sollten?? ergebnis in der 2.ten jar… wobei man hier
die veränderung durch die verschiebung erst nach n paar sekunden wirlklich erkennen kann, so ca 20

Ist da nicht einfach ein gedanken Fehler in deiner Berechnung?
ich meine du musst einfach eine Stehendewelle als Ausgang nehmen, die durch die Berechnung z.B. von einem Start Punkt P0 mit hilfe von Sinus(x) beschrieben wird berechnen, wobei x in diesem Fall der Abstand des berechneten Punktes P von P0 ist. Wenn sich nun die Welle zeitlich abhängig bewegen soll, so muss das ganze ja nurnoch verschoben werden. also währe dass sinus(P-P0+t) wobei sich t in der Größenordnung deiner Periodenlänge bewegen muss und mit Skalierungswewerten s die geschwindigkeit der Welle berechnent werden könnte. Also etwa so sin(p-P0+(t*s))

Wie ich gerade gesehen habe nimmst du als Ausgangspunkt dein x = 0 damit müsste das ganye dann in etwa so sein sin(x+(t*s))

Eine Überlagerung von einer zweiten welle wäre nun einfach durch Adition der y werte jede punktes gegeben.

Wenn ich gerade einen kompletten Blödsinn geschrieben habe tut es mir leid.

*** Edit ***

Diesen satz verstehe ich eigentlich auch nicht, da die Amplitute eigentlich nichst mit der Ausbreitungsgeschwindigkeit zu tun hat, sondern nur mit der Auslenkung.
Also jehöher die Amplitute um so größer wird dein y da ja sin() immer nur einen Wert zwischen 1 und -1 ergibt.

Also die tatsächliche Formel wäre jetzt in etwa

vertex.y = amplitude * sin(vertex.x + (t*s))

also… die erleuchtung das ich da bullshit gemacht habe,

…ka was ich mir dabei gedacht habe… ist mir heute in der schule gekommen…

aber du hast recht, so könnts gehen, probier es nachher aus.
du meinst dann sicher auch, amplitude * sin(vertex.x + (t*s)) * cos(vertex.z + (t * s)) ?
ich glaube das stimmt… danke danke.

*** Edit ***

„Eine Überlagerung von einer zweiten welle wäre nun einfach durch Adition der y werte jede punktes gegeben.“

das versteh ich leider nicht… könntest du das genauer erklären?

Ok, meine interpretation wenn du eine Welle hast die sich in X-Richtung Ausbreitet und eine Welle die sich in z-Richtung ausbreitet, dann wäre deren Überlagerung einfach
vertex.y = amplitude * [sin(vertex.x + (t * s)) + cos(vertex.z+(ts))] wenn du jeweils eine andere Amplitude für deine wellen willst, ändert sich die Formel einfach auf
vertex.y = amplitude1 * sin(vertex.x + (t * s)) +amplitude2
cos(vertex.z+(t*s))

Die Erklärung kommt daher, dass wenn sin(x) an einer stelle genau 1 ist und and er gleichen stelle aber die cosinus welle -1 dann müssen sich diese wellen ja gegenseitig aufheben, da ja die eine Welle nach oben will die andere aber nach unten. und das geht nur mit der Addition. wenn du das ganze aber multiplizierst so wie in deinm vorschlag käme in diesem fall eine negative Auslenkung zustande. 1* -1 = -1. Auch deutlich wird es wenn beide Wellen am selben Ort ein Maimum aufweisen käme bei dir nur ein einfaches Maximum heraus aber nicht ein überlageres. 1* 1 = 1 vs. 1+1 = 2.

Hoffe habs dir etwas klarer gemacht.

Wie sieht denn dein aktuelles Ergebnis aus? kannst du wieder ein bsp. hereinstellen?

Hm ja, hab das ganze hier wieder hochgeladen.
Das Problem ist jetzt wie du sagst diese überlagerung… ich versuch das heute zu fixen
aber… irgendwie bin ich irrittiert davon, wie das im shader funktionieren soll
weil… keine ahnung, ich versuchs heute mal irgendwie

ach ja: in der ecke von der nicht vollständigen “box” sind immer ein paar punkte die extrem weit
hoch kommen… ka warum… aber naja

link, da 2,05 mb ja schon zu viel sind -.-
http://www.file-upload.net/download-9412620/ArturWaterTest.jar.html

Naja die Wellen bewegung scheint ja schon mal zu funktionieren, wobei ich dir vl noch mal den Rat geben wuerde, die Überlagerung fallen zu lassen und nur einmal eine Welle anzusehen. z.B. kommt mir die Ausbreitungsgeschwindigkeit zu nieder vor. Weiters wuerde ich vl die Amplitude verkleinern.

dann kannst du sehen ob in dieser Berechnung ein Fehler liegt und wie sich das ganze im shader verhält.

wenn dann alles passt kannst du dir die überlagerung nocheinmal ansehen

Ausbreitungsgeschwindigkeit hat ja nix
Mit dem fehler zu tun… oder was meinst du?

Die amplituden sind nur so hoch gesetzt damit man die ueberlagerungen sieht

In den einzelheiten hab ich eigentlich alles durchgecheckt, das sollte alles stimmen

Wie hoch ist den die amplitude an den Stellen mit Extrem hoher Auslenkung? Vielleicht sind das auch nur 3 Wellen die sich überlagern

Da hast du recht, dass die Ausbreitungsgeschwindigkeit nichts mit dem Fehler zu tun hat. Mir ging es eher darum, dass wenn du nur eine Welle verwendest und dort alle Parameter korrekt einstellst, dann muss anschlieszend auch das Ergebnis mit der Ueberlagerung passen.

Aber wenn du sagst, dass die Einzelheiten passen, dann hab ich auch keine Idee.