PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wasser programmieren


rotalever
2006-09-10, 20:22:43
Ich bin auf der Suche nach einem guten Tutorial/Anleitung, wie man Wasserwellen in 3D programmiert (das Umsetzen würde ich in OpenGL vornehmen). Vor allem meine ich so diese kleinen "mini-wellen", die durch den Wind entstehen, aber dann auch vielleicht so Effekte, dass zusätzliche Wellen durch drauffallende Regentropfen oder so entstehen.
So direkt fällt mir nämlich nicht ein wie, ich das machen könnte und vernünftige Tutorials hab ich auch noch nicht gefunden.

rotalever

Monger
2006-09-10, 20:32:41
Ich kann dir leider kein Tutorial anbieten, aber so wie man das auch derzeit in Spielen macht, verändert man nicht etwa die Oberfläche, sondern verändert per Shader den Brechungsindex.

Vereinfacht ausgedrückt ist das Wasser ein Spiegel: Einfallswinkel gleich Ausfallswinkel. Wenn jetzt eine Welle auf dich zukommt, ändern sich natürlich Einfalls und Ausfallswinkel, und du siehst an der selben Stelle die Reflexion von einem anderen Punkt.

Bei Spielen lässt man oftmals die Oberfläche in Ruhe, und programmiert stattdessen einen Shader, wo der Ausfallswinkel an eine Sinus-Funktion gekoppelt ist. Man macht also keine Wellen, sondern man imitiert das Reflexionsverhalten von Wellen.
Das kannst du natürlich beliebig verfeinern. Damit das Wasser nicht allzu ölig wirkt, muss es auch ein Stück weit transparent sein, aber darüber solltest du dir erst Gedanken machen, wenn du erstmal soweit bist! ;)

rotalever
2006-09-10, 20:46:33
Man verändert nur den Brechungsindex? Das ist allerdings eine interessante Überlegung, Problem ist nur das ich davon außer dass ich weiß was es ungefähr bedeutet keine Ahnung hab... Muss mich wohl mal in die Richtung kundig machen. Funktioniert das denn schneller als mit der Berechnung eines Meshes (Grid/Heightmap, whatever...)?
Vor allem: bis zu welchem Grad bleiben Wellen denn dann noch "realistisch", sprich wie hoch können sie werden. Wenn es ein paar "centimeter" sind, sollte es reichen.
Die Tranzparenz zu implementieren wäre dann wohl auch nicht mehr wirklich schwer.

Monger
2006-09-10, 21:11:22
Man verändert nur den Brechungsindex? Das ist allerdings eine interessante Überlegung, Problem ist nur das ich davon außer dass ich weiß was es ungefähr bedeutet keine Ahnung hab... Muss mich wohl mal in die Richtung kundig machen. Funktioniert das denn schneller als mit der Berechnung eines Meshes (Grid/Heightmap, whatever...)?

Ich hab von OpenGL keine Ahnung, aber ich hab mir sagen lassen, dass dynamisch veränderliche Meshes extrem teuer sind. Vorallem: du willst ja schön runde Wellen. Deine Triangulation so klein zu machen dass ein Dreieck kleiner als ein Pixel ist, ist nicht gerade effizient, und führt zu Problemen. Per Pixel Lighting über einen Shader ist dagegen relativ effizient (vorallem weil du den wahrscheinlich sowieso brauchst).


Vor allem: bis zu welchem Grad bleiben Wellen denn dann noch "realistisch", sprich wie hoch können sie werden. Wenn es ein paar "centimeter" sind, sollte es reichen.

Nicht extrem hoch, auf jeden Fall. Das kommt darauf an, wie flach du übers Wasser hinweg sehen kannst. Wenn du mal darauf achtest, hast du bei allen aktuellen Spielen (z.B. Oblivion) genau diesen Effekt, wenn du so weit ins Wasser hineinsteigst, dass deine "Augen" gerade so über den Wasserspiegel hinweg sehen können.

Das echte Problem an der Geschichte ist imho, dass reale Wellen sich nunmal nicht sinusförmig ausbreiten. Die brechen sich, überlagern sich, verwirbeln zu Schaumkronen...

Glaub nicht, dass das irgendwas simples wäre! Deshalb wäre mir an deiner Stelle das Problem mit den niedrigen Wellen erstmal schurzpiepegal. Du kannst froh sein, wenn dein Wasser zum Schluss tatsächlich eine gewisse Ähnlichkeit mit Wasser hat. So manche kommerzielle Produkte haben das nicht gerade bravurös gelöst...

rotalever
2006-09-10, 21:16:09
Naja, das Problem mit den Schaumkronen etc. werde ich wohl nicht haben, da so realistisches Wasser wohl etwas mehr Berechnung erfordert. Allerdings, hat mich das Stichwort Brechungsindex -> refractive glaube ich auf ein paar interessante Tutorials gelenkt... Mal schauen was draus wird.

Simon
2006-09-11, 09:17:56
Gamedev.net hat was, wie immer (http://www.gamedev.net/reference/articles/article2138.asp) :D
Oder: Real-time water rendering - introducing the projected grid concept (http://graphics.cs.lth.se/theses/projects/projgrid/)

rotalever
2006-09-11, 14:46:39
Gamedev.net hat was, wie immer (http://www.gamedev.net/reference/articles/article2138.asp) :D
Das hatte ich gestern schon mal überflogen, allerdings fand ich es nicht soo ergibig. Vielleicht sollte ich es noch mal genauer anschauen...
Oder:Real-time water rendering - introducing the projected grid concept (http://graphics.cs.lth.se/theses/projects/projgrid/)
Sieht interessant aus, muss ich mir mal näher anschauen, wobei hier wieder scheinbar ein Mesh erzeugt wird. Danke für den Link!

edit: Ich glaub der gamedev artikel gibt doch noch was mehr her... Hätte ihn nicht nur überfliegen sollen.

Nasenbaer
2006-09-14, 01:09:56
Hier gibts dazu auch was: http://www.naturewizard.com/

Tutoials 2 und 3 befassen sich damit. Vielleicht hilft das auch noch etwas :)

rotalever
2006-09-14, 21:12:31
Sieht auch interessant aus, muss ich mir nächste woche mal näher anschauen, da ich im Moment nicht soo viel Zeit habe...
Eine Spiegelung hab ich immerhin schon jetzt fehlen nur noch die Wellen.