Wellensimulation
Übersicht

![]() |
NoobodyBetreff: Wellensimulation |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vor einiger Zeit bin ich über einen kleinen, aber feinen Artikel über Echtzeit - Simulation von Wasserwellen am Computer gestossen - den habe ich natürlich gleich umgesetzt.
Vom Code gibt es zwei Versionen: Eine Edition mit Arrays und eine mit Banks. Die mit Arrays ist natürlich schneller, jedoch hielt ich die Bank - Version komfortabler, falls es mal jemand in ein Spiel einbauen möchte, wo es unter Umständen auch mehrere Wasserflächen geben soll. Arrayversion: BlitzBasic: [AUSKLAPPEN] Global WATERSIZE = 256 Bankversion: BlitzBasic: [AUSKLAPPEN] Const WATERSIZE = 256 Die Bedienung ist relativ einfach - mit gedrückter linker Maustaste erzeugt man Wellen, mit der rechten Maustaste kann man Hindernisse setzen. Die benötigte Rechen- und Renderzeit wird oben links angezeigt. Eine 3D - Umsetzung wäre eigentlich kein Problem - man müsste die Werte der Wasserfläche einfach als Höhenwert und nicht als Farbe interpretieren. Eine enstprechende Version in 3D schreibe ich vielleicht auch noch, bis anhin war ich einfach zu faul dazu ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
- Zuletzt bearbeitet von Noobody am So, Apr 19, 2009 19:17, insgesamt einmal bearbeitet
![]() |
coolo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wahnsinn! Ich bin imer mehr beeindruckt was du da alles vorstellst. Ich hoffe da kommt noch mehr.
(vllt. machst du mal ne vernünftige Schatten Engine für BB?) |
||
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project! "Eigenzitate sind nur was für Deppen" -Eigenzitat |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Total geiler Effekt ![]() Jedoch wären ein paar Code kommentare ganz nett, raff da fast nix .. |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey, das ist echt super!
Ich hab mich eben mal drangesetzt und versucht deinen Code zu verstehen... Ich kriegs nicht hin, zumindest nicht komplett. Wenn du irgendwann mal eine 3D-Version machen würdest, würde es sicher viele Leute freuen, da das gut Arbeit abnehmen kann. Bei den Kommentaren kann ich nur zustimmen, es wäre zumindest gut, um mal ein wenig mehr zu verstehen. ![]() |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiß es ist nicht einfach, aber so ganz Echtzeit is das nicht ![]() 70ms pro Frame allein für ein 256² Wasser ist zwar zum Rumspielen ganz ok, aber für ein Spiel? System: P4 3.4GHz HT ATI X700 SE mit 256MB 1GB RAM Windows XP SP3 mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eingeproggt hat Folgendes geschrieben: Ich weiß es ist nicht einfach, aber so ganz Echtzeit is das nicht
![]() 70ms pro Frame allein für ein 256² Wasser ist zwar zum Rumspielen ganz ok, aber für ein Spiel? Das stimmt, hatte ich nicht bedacht... Für ein Spiel wäre es dann sinnvoll, wenn man immer 2, 3 oder 4 pixel abarbeitet anstatt einen... Das wäre dann zumindest ein wenig schneller, wenn man nicht so eine unglaubliche Genauigkeit haben muss... Ansonsten lässt sich in einem Spiel evtl. noch das Wasser in verschiedene kleinere Bereiche unterteilen, die nur bei Bedarf (also wenn der Spieler gerade draufsieht) abgearbeitet werden... Ich denke, da lässt sich in Spielen noch etwas Performance rausholen, wenn man es ein wenig (*hust*) anpasst. |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du hast aber den Debugger hoffentlich abgeschaltet? Sonst ist es kein Wunder, dass es so langsam läuft ![]() Andererseits ist es wirklich rechenaufwändig - ich habe hierzu ein paar Lösungsansätze ausprobiert. Eine Möglichkeit wäre, das Wasser in einzelne Teilbereiche aufzuteilen und pro Frame ein anderes zu aktualisieren. Funktioniert relativ gut, jedoch bewegt sich das Wasser dann ein wenig langsamer. In 3D benötigt man ausserdem viel kleinere Auflösungen, weil ja die 3D - Wasseroberfläche nicht so detailliert sein muss wie das 2D - Bild (ich mach mal das ganze in 3D, damit es ersichtlich wird). In meinem BCC - Beitrag habe ich ja auch dasselbe Wasser benutzt, dort habe ich einfach einen Pixel auf einen 3x3-Block gestreckt (und es lief noch einigermassen - zumindest auf meinem Laptop ![]() Alles in allem bleibt es aber rechenintensiv. Ich könnte mal probieren, das ganze in C zu schreiben und eine DLL draus zu machen, das dürfte noch einiges schneller sein. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Meister hat Folgendes geschrieben: Du hast aber den Debugger hoffentlich abgeschaltet? Sonst ist es kein Wunder, dass es so langsam läuft
*hüstel* Ohne Debugger hab ich ~15ms, schon viel besser ![]() |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
und selbst banks auf meinem Laptop bringen immerhin schnelle <30 ms bei gedrückter Maustaste und ca 20 Hindernissen | ||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm das beispiel mit den Arrays lies eine einzige welle ca 50mal hin und her gehen, woei dieselbe welle im bank dinges nur 1 abgeprallt ist. bug? | ||
Warbseite |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kein Bug, ein Feature!
In der Tat ist bei der Bank - Version die Globale 'Damping#' (=Dämpfung, innere Reibung des Wassers) auf 0.02, während es bei der Arrayversion auf 0.002 gesetzt ist. Damit haben die Wellen dort eine geringere Dämpfung und gehen daher auch länger hin und her als bei der Bank - Version. Scheint wohl noch ein kleiner Tippfehler zu sein, aber ist ja nicht wirklich schlimm. Diesen Faktor kann man übrigens beliebig verändern, um verschieden träge Flüssigkeiten zu simulieren. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
*Doppelpost*
So, ich hab das ganze mal in 3D umgesetzt. Da ich auf externe Dateien verzichten wollte, habe ich flugs mal meine DiamondSquare - Funktion aus dem Codearchiv verwendet, um das Terrain während Laufzeit zu generieren. Source ist im Moment nicht der sauberste, aber er funktioniert. Das ganze funktioniert auf dem Prinzip, dass im Hintergrund eine viel grössere Wasserfläche berechnet wird, als schlussendlich dargestellt wird. Damit dauert die Berechnung zwar ein wenig länger, dafür sieht es viel besser aus (ist die berechnete Fläche gleich klein wie die dargestellte, sieht es... Nun ja.). Da das Terrain dynamisch generiert wird, kann es vorkommen, dass die Karte fast komplett von Land bedeckt ist oder dass die Kamera im Berg steckt usw. In solchen Fällen das Programm einfach kurz neustarten, dann kommt ein anderes Terrain heraus. Der BlitzBasic: [AUSKLAPPEN] Graphics3D 800, 600, 0, 2 Ich hab sogar einen Screenshot gemacht ![]() ![]() Kamera mit WASD bewegen, mit Maus herumschauen und mit Mausklick Wasserwellen erzeugen. |
||
- Zuletzt bearbeitet von Noobody am So, Apr 19, 2009 19:17, insgesamt einmal bearbeitet
![]() |
coolo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das schaut ja mal echt kuhl aus!
Das einzige, ist das das Wasser an den "Rändern" etwas arg zittert, aber ich glaube das kann man verbessern indem man die imaginäre Map vergrößert. |
||
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project! "Eigenzitate sind nur was für Deppen" -Eigenzitat |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wäre villeicht schön in 2D wie auch in 3D wenn die wellen nicht unendlich das wasser bewegen würden sonder auch ausklingen könnten... Sonst siehts aber seeehr geil aus, nur wie kann ich von Schwarz weiß in Blau/schwart umschalten (also wie wasser) ?
mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
ToeB hat Folgendes geschrieben: Wäre villeicht schön in 2D wie auch in 3D wenn die wellen nicht unendlich das wasser bewegen würden sonder auch ausklingen könnten
Dazu musst du nur die Globale 'Damping#' auf einen höheren Wert stellen. ToeB hat Folgendes geschrieben: Sonst siehts aber seeehr geil aus, nur wie kann ich von Schwarz weiß in Blau/schwart umschalten (also wie wasser) ?
Wie genau meinst du das? Wenn du das Terrain blau-schwarz einfärben willst, dann musst du nur in RenderHeightmap die folgende Zeile Code: [AUSKLAPPEN] WritePixelFast X, Y, $FF000000 + Ratio*$010101 abändern in Code: [AUSKLAPPEN] WritePixelFast X, Y, $FF000000 + Ratio
|
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kleine Information: Der Forenuser Barratator hat das ganze nochmal hübsch mit Skybox und Cubemapping umgesetzt.
Hier das Youtube Video. Sieht schon mal um einiges besser aus als meine Version in schlichtem Blau ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
barratator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kleine Erklärung zum Video:
Das Video war jetzt nicht wirklich in Realtime...Das ganze hat ca. 5 Minuten gedauert, weil ich jeden Frame mit SaveBuffer abgespeichert habe, um später die bestmögliche Qualität zu erreichen ![]() An dieser Stelle möchte ich Noobody auch nochmal für den Code danken und ihn motivieren, dass er es erweitern soll ![]() Gruß Bastian |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group