[HN Gopher] FFT-based ocean-wave rendering, implemented in Godot
       ___________________________________________________________________
        
       FFT-based ocean-wave rendering, implemented in Godot
        
       Author : RafelMri
       Score  : 616 points
       Date   : 2024-09-28 06:51 UTC (16 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | eps wrote:
       | Don't have any substantial comments, but I must say that the
       | result is really impressive. Just wow.
        
       | kroolik wrote:
       | That's some National Geographic clip. Now, show us the demo!
        
       | Mattish wrote:
       | 2 of the linked references have full implementations of very
       | similar things, with some shared references.
       | 
       | Is there something here which godot is enabling which wasn't
       | previously possible? It seems to be entirely GPU compute workload
       | with particles which are available as part of all mature
       | rendering engines
        
         | arminiusreturns wrote:
         | Godot itself is open source, which I think has brought a strong
         | community of people to it. My mega-big-ultra project I've been
         | working on since 2013 would be nowhere near as close to where
         | it is now (close to launching crowdfunding/alpha) if I hadn't
         | transitioned to Godot! (I was fighting the UE4 system from the
         | days when it was $20/mo, we linux people really got dealt dirty
         | by Tim Sweeny, with lots of empty promises for linux support)
        
       | tsurba wrote:
       | Shadertoy also has nice ones
       | https://www.shadertoy.com/view/Ms2SD1
        
       | chhs wrote:
       | Looks incredible!
        
       | viraptor wrote:
       | Different approaches, but if someone's interested in waves/ocean
       | simulation, Acerola published some awesome (as always) videos on
       | this topic. https://youtu.be/PH9q0HNBjT4 and
       | https://youtu.be/yPfagLeUa7k (edit: just realised one is linked
       | in the references, just under the real name rather than nick)
        
       | rkagerer wrote:
       | The sample video is really impressive, it's worth a peek.
        
       | jesperwe wrote:
       | 20 years ago I could spend months tweaking ocean surface in
       | renders and not get even close to that. Amazing how good this
       | is!!
       | 
       | Although the demo clip feels a bit exaggerated (saying this
       | having over 50k Nm open water ocean sailing in my logbook). Waves
       | that sharp and high would need the wind blowing a lot stronger.
       | But I am sure that is just a parameter adjustment away!
       | 
       | Since it is in Godot I assume the rendering is real time? Does it
       | need a monster GPU?
        
         | ryanjshaw wrote:
         | There's 2 demo clips, the second one shows quite a number of
         | parameters you can adjust.
        
           | pixelatedindex wrote:
           | I think the point is that these parameters you adjust are
           | being rendered near real-time, whereas back in their days
           | you'll have to enter these values, and add custom tweaking
           | because the hardware just wasn't powerful enough to do the
           | things we can do now at many times the speed. Not to mention
           | the vast improvement in mileage for your time.
        
             | dylan604 wrote:
             | yeah, the "in real time" is what kills me. the old joke of
             | blue bar races, rendering, buffering, and any of the other
             | things us gray beards had to put up with is just
             | unimaginable to the whippersnappers of today.
        
         | pjmlp wrote:
         | Back when I graduated, doing particle engines, with marching
         | cubes and stuff like that, was a graduation thesis project.
         | 
         | Nowadays it is a check box on a game engine, one of many.
         | 
         | People don't imagine how good they have it with modern engines.
         | 
         | Not to take any value out of this work, this is a great
         | achievement and kudos to the author, only making the point how
         | good we have nowadays.
        
           | kevindamm wrote:
           | Back when I graduated I was still holding my breath for the
           | patent expiration on marching cubes, GPUs were still being
           | made for PCI and even ISA slots, you could find some game
           | engines but you would have a better time writing one
           | specialized for the type of game or graphics you were
           | targeting.
           | 
           | Things really have improved a lot.
        
             | pjmlp wrote:
             | I guess we might have a similar age, first computer Timex
             | 2068. :)
        
               | kevindamm wrote:
               | sounds like it, my first computer was an Atari 800 XL
               | that shared the family TV as its monitor (and fortunately
               | there was an RF switch to toggle between it and the
               | antenna so we worked out a kind of timesharing system)
        
               | pjmlp wrote:
               | Sounds familiar. :)
        
         | matsemann wrote:
         | > _I could spend months tweaking ocean_
         | 
         | I have a game project. But I always get nerd sniped by cool
         | game stuff, and want to implement them myself. My progress so
         | far could probably have been achieved in a 48h gamejam if I
         | just used/bought existing assets. Instead I have also spent
         | weekends playing with water shaders and getting them to look
         | how I want.
         | 
         | But my game is a puzzle game. I don't need water, except that I
         | now have a cool splash screen..
        
           | efdee wrote:
           | You might be taking "splash screen" a bit too literal.
        
         | sails wrote:
         | Agree, based on the clips, it looks a bit random.
         | 
         | I think it is looks to be very good, and probably the best I've
         | seen having given it a cursory search recently to see what was
         | possible.
         | 
         | In terms of what I'd like to see, open ocean waves generally
         | have more rhythm, I'd be very interested to see a simulation of
         | 15 knots of wind blowing over 1km for a few hours and see if
         | that matches what I observe, which would be relatively
         | organised wave trains (sets) that build and disperse.
        
         | aithrowawaycomm wrote:
         | This is not a criticism, just an observation: it looks like
         | what I imagine an ocean of hot corn syrup would look like
         | (after dyeing it blue). The viscosity seems right; possibly the
         | surface tension is not what ocean water would have (a colloid
         | of salty H2O and biomaterial, which is common in real-world
         | experience but quite ugly for computational fluid dynamics).
         | 
         | Also note that the ocean spray here is a post-hoc effect, but
         | for a real ocean the spray dulls the sharpness of the waves in
         | a way that will be (vaguely) apparent visually.
         | 
         | Of course there's almost no "physics" in this elegant, simple,
         | and highly effective model, so I want to emphasize that
         | suggesting directions to poke around and try things should not
         | be construed as an armchair criticism.
        
           | hackable_sand wrote:
           | This is literally a criticism.
        
             | aithrowawaycomm wrote:
             | A) It would be a criticism if I thought these effects could
             | be plausibly rendered with a similar FFT algorithm, but
             | that seems unlikely to me. I think these results are
             | "highly effective" given the toolset, which is not
             | attempting to emulate the actual physics.
             | 
             | B) This project is not an all-out attempt to make lifelike
             | water, it is described as an _experiment_. I am making an
             | observation about the result of the experiment, not
             | criticizing the project for failing to meet standards it
             | wasn 't holding itself to.
        
             | CognitiveLens wrote:
             | This not a criticism, but the comment you are replying to
             | is a critique, not a criticism.
        
         | lloeki wrote:
         | > 20 years ago I could spend months tweaking ocean surface in
         | renders and not get even close to that.
         | 
         | There are tons of videos now about that making the whole thing
         | (somewhat) more approachable, but there are still a lot of
         | pitfalls!
         | 
         | One of my favourites on the subject:
         | https://m.youtube.com/watch?v=yPfagLeUa7k
         | 
         | This one is nice too: https://m.youtube.com/watch?v=kGEqaX4Y4bQ
        
         | CyberDildonics wrote:
         | _20 years ago I could spend months tweaking ocean surface in
         | renders and not get even close to that._
         | 
         | I'm not sure what you mean here, because this is made directly
         | from research that was done 20 years ago and it looks the same,
         | it's just being done in real time.
        
       | Archelaos wrote:
       | The demo looks unrealistic. The waves never break. Increasinlgy
       | steeper slops with pointy peaks travel from left to right until
       | they just sink down towards the left.
        
         | AlunAlun wrote:
         | This is explicitly a simulation of ocean waves, and ocean waves
         | do not break.
        
           | Archelaos wrote:
           | Okay. That makes sense. What about the steep elevation?
           | Shouldn't it be smoother at the top?
        
             | UniverseHacker wrote:
             | As someone who has done offshore sailing... the waves also
             | look unnaturally steep/tall/pointy to me. It's very cool,
             | but needs some tweaking still.
        
       | tomcam wrote:
       | I spent years living on the beach. When you live on the beach,
       | you watch the ocean for hours at a time because it's mesmerizing
       | and feels sensational. I wouldn't guess for a second this was a
       | render.
        
         | saxelsen wrote:
         | Have you actually looked at waves and how they move, though? If
         | you've spent years living on the beach you'd be able to spot in
         | a heartbeat that the formation of foam and movement of the wave
         | is not natural.
        
       | ReptileMan wrote:
       | That looks wet. And honestly it is the best compliment I can
       | give.
        
       | bnegreve wrote:
       | It is very impressive, and better than anything I've seen before
       | but think something is bit off with the swell. If I had to
       | explain I would say that high frequency waves don't travel on top
       | of low frequency waves the way they do in the video.
        
       | cheschire wrote:
       | While I appreciate ever more realistic water bodies, the part
       | that game makers really struggle with is where the water
       | encounters an obstacle.
       | 
       | I did not see any mention of this in the description. Conceivably
       | though, this is not a huge conceptual leap right? A game maker
       | would simply need to add logic to impact the frequencies near
       | objects, no?
        
         | magicalhippo wrote:
         | The referenced paper "Simulating Ocean Water" talks about this
         | in section 5. Indeed the FFT approach makes this difficult,
         | where a different approach[1] for waves reflecting off
         | obstacles.
         | 
         | That approach uses convolution, however you can perform
         | convolution using FFTs[2], so perhaps there's some nice way to
         | combine the two approaches.
         | 
         | edit: I just skimmed the papers, and it seems[1] does indeed
         | mention combining the FFT approach with the convolution
         | approach in the section on Ambient Waves.
         | 
         | [1]:
         | https://people.computing.clemson.edu/~jtessen/reports/papers...
         | 
         | [2]: https://phys.uri.edu/nigh/NumRec/bookfpdf/f13-1.pdf
        
         | thom wrote:
         | To an extent you can get away with just sampling the output of
         | the water shader to work out the water's effective height at
         | any given point. Big changes in height, or buoyancy for non-
         | static objects, indicate bigger angles hitting the waves and
         | you can fake some splashes with particles while the wave itself
         | just gets occluded. Apply forces at just three or four points
         | and you can make a boat rock pretty believably on top of this
         | kind of water.
        
       | lukko wrote:
       | Oh my - this is great!
       | 
       | Does it mention what the density of the mesh is, or is it a flat
       | plane with no displacement?
       | 
       | Also, I wonder if there's a way to optimise the foam particles in
       | some way. It does seem very wasteful to generate them across the
       | whole plane, when most are culled. I wonder if the particle
       | emission / creation could be linked to foam density?
        
         | nkrisc wrote:
         | I didn't see a mention of the mesh density, but peeking at the
         | main scene file (I assume the one seen in the video), this
         | appears to be the mesh used:
         | https://github.com/2Retr0/GodotOceanWaves/blob/main/assets/w...
        
           | lukko wrote:
           | ah amazing, thanks - looks like 330k vertices
        
       | HL33tibCe7 wrote:
       | This is beautiful, I'd love to have this as a lockscreen or even
       | a screen panel on a wall somewhere
        
       | kamranjon wrote:
       | The other two Godot repos by this person are very interesting as
       | well. I love the level of detail they add to explaining their
       | repos. This one is particularly interesting:
       | https://github.com/2Retr0/GodotGaussianSplatting
       | 
       | Wonder if they are a student, they seem to cite other work
       | frequently and have a strong grasp on recently published
       | materials.
        
         | codetrotter wrote:
         | > Wonder if they are a student
         | 
         | Seems like they might be.
         | 
         | One of their repos has this title and description:
         | 
         | > ENGR96A-coursework
         | 
         | > Relevant coursework for ENGR 96A Introduction to Engineering
         | Design F23
         | 
         | And F23, judging by the dates of the commits in that repo means
         | Fall 2023.
         | 
         | Of course, it could be that this and other UCLA courses
         | referenced in the repos are open for everyone. So maybe you
         | don't have to be enrolled as a traditional student at UCLA to
         | take them.
        
       | fcatalan wrote:
       | Things like this brought me into computers, but along the way I
       | fell for the easy and boring life of glueing libraries, endpoints
       | and corporate bullshit that leads to burnout. Perhaps some day...
        
         | kevindamm wrote:
         | Someday could be today...
        
           | maaaaattttt wrote:
           | There are only two good moments to plant a tree: 20 years ago
           | and today.
        
             | Aeolun wrote:
             | Isn't it like: the best time to plant a tree is 20 years
             | ago. The next best time is today.
        
               | epaga wrote:
               | Though I never understood why 19 years ago wouldn't be
               | the second best...
        
               | rbetts wrote:
               | That would make today the worst day to plant a tree?
        
               | phn wrote:
               | The worst so far, and the best when compared to all of
               | your remaining days.
        
               | plasticchris wrote:
               | Because the statement is meant to motivate the reader.
        
               | airstrike wrote:
               | Because you didn't think of it then.
               | 
               | You thought of it 20 years ago and didn't do it, and
               | you're considering it again now.
               | 
               | Instead of telling yourself it is too late to do it now,
               | just go for it, so that in 20 years more you will be
               | happy you planted this tree.
        
               | lukan wrote:
               | Also some people like their children and grandchildren to
               | enjoy some fruit trees.
               | 
               | (Even if they are just "family" in the broader sense and
               | not their own)
        
               | maaaaattttt wrote:
               | Yes that's it, thank you. I'll admit I was too lazy to
               | look the exact one up.
        
           | Trasmatta wrote:
           | My problem is I'm so burnt out from the aforementioned stuff
           | I don't have the motivation or energy for the cool stuff
           | anymore. I feel like I need a year long sabbatical first, but
           | reality says otherwise.
        
             | otteromkram wrote:
             | Sounds like you just need more coffee :-D
        
               | Trasmatta wrote:
               | More coffee, maybe a pizza party. That'll fix me right
               | up.
        
             | zackmorris wrote:
             | Same here, this has been the central crisis of my working
             | adult life for 25 years. Unfortunately it never gets
             | better. And I've taken 6 months to 1 year off for severe
             | burnout with physical symptoms like adrenal fatigue twice
             | now.
             | 
             | My feeling is that this problem is intractable alone. We
             | need groups working towards liberation, and societal change
             | to support healthy work/life balance.
             | 
             | What that looks like in practice is that wealthy people,
             | especially those who won the internet lottery, should start
             | giving something back. At the most basic level, that's
             | paying one's taxes. Beyond that, they should start setting
             | aside ego-based goals and start accepting requests outside
             | of their attention so that the most pressing problems
             | facing humanity can finally get solved.
             | 
             | Give a billionaire $1 billion and a year later they'll turn
             | it into $2 billion. Give one of us $1 billion and a year
             | later a form of cancer will be cured. That's why they have
             | the money and we don't, and why it takes so long for things
             | to get better, if they ever do.
        
         | lukko wrote:
         | I think make the move gradually - find the stuff you were
         | excited in originally, that you would love to learn more about
         | and eventually do. Spend maybe a few hours a week diving into
         | it - then gradually increase and move away from your current
         | job.
         | 
         | Go for it - we're all rooting for you!
        
       | aetherspawn wrote:
       | I think the downside of this approach is you can't ie split the
       | waves with a ship.
        
         | coldcode wrote:
         | Yeah I wondered how that could be done, otherwise this would
         | only be good for backgrounds.
        
       | wslh wrote:
       | Great! I've shared this with every physicist I know who's not
       | directly involved in animations.
       | 
       | Quick question from my swimming class yesterday: We know that
       | professional swimmers use a range of technologies, both old and
       | new, in their training. Is there currently a model that fully
       | simulates the physics of swimming across different styles? If
       | not, this seems like a great project idea!
        
       | convivialdingo wrote:
       | Fourier was measuring tidal waves when he came up with wave
       | frequency transforms - so in a way this is almost a full circle.
       | 
       | Very impressed!
        
       | pmarreck wrote:
       | How do I get this masterpiece running locally to play with? I
       | don't even know what Godot is (but I've used makefiles and such)
        
         | jimmySixDOF wrote:
         | If you have a Quest VR device Godot just released an editor
         | with live scene updates I am bookmarking this to try see what
         | it looks like in there.
        
         | eaglefield wrote:
         | The github repository is a godot project. Godot is a game
         | engine. The quickest way is to download godot. Clone the
         | repository and open the folder as a project in godot.
        
         | krapp wrote:
         | Godot is an open source game framework:
         | https://godotengine.org/
         | 
         | You would presumably need to download the Godot framework and
         | open it in the framework.
        
         | nkrisc wrote:
         | 1. Download Godot: https://godotengine.org/download/windows/
         | (this project uses an addon for GUI that requires C# so you'll
         | need the C# version of Godot 4.3)
         | 
         | 2. Clone the repository
         | 
         | 3. Open Godot and import the project by navigating to the
         | directory containing the project.godot file.
         | 
         | Then open the project and away you go.
        
       | julosflb wrote:
       | Very neat! I'm hydrodynamics by background and I wondered a long
       | time ago why this kind of approach was not used as I always found
       | ocean waves to look awful in movies. Once you describe ocean sea
       | state in frequency domain, it is quite easy to give to floating
       | objects like ships realistic motions using what we called RAO in
       | this field (linear operator). You can also model sea disturbance
       | (diffracted and radiated waves) caused by an object in a similar
       | fashion.
        
       | Eddy_Viscosity2 wrote:
       | This is great, but this approach will break down a bit for REALLY
       | big waves as they become non-linear. Water waves are not
       | sinusoidal, but are close enough for small and medium wave
       | heights that these methods work really well. The big big waves
       | are not only much farther from sinusoidal but the waves start
       | interacting with each in a non-linear way that can't be captured
       | by the linear superposition approach used here.
       | 
       | So for most sea states, this is fantastic. But if you want to do
       | the 'perfect storm' wave or something like that, you need to use
       | a different approach for realism.
        
       | bobim wrote:
       | I would like a Silent Hunter III remake with this.
        
       | lambdaone wrote:
       | This is astoundingly good work; even though, as other commenters
       | have said, it could still be improved on, the fact that it
       | achieves such a level of realism with such a simple and elegant
       | framework is truly impressive.
        
       | jkmegtu wrote:
       | Free fire
        
       | shireboy wrote:
       | Nice, but may need to adjust the limits:
       | https://news.ycombinator.com/item?id=41631177
        
       | bee_rider wrote:
       | It looks really good.
       | 
       | Out of curiosity, I'm sure everybody has heard of the FFT. They
       | are quite general and used all over the place, and I imagine
       | they'd be the first thing somebody would reach for if they had to
       | describe waves.
       | 
       | But I'd never heard of Gerstner waves. This leads me to believe
       | that Gerstner waves are a more specialized thing. Since lots of
       | work has already gone into rendering water, I tend to assume the
       | method with a name I've never heard of was only reached for after
       | very clever people rejected Fourier transforms for some reason.
       | 
       | But, the results look better than most of what I see elsewhere.
       | Has something changed to enable the more conventional solution?
        
       | btbuildem wrote:
       | It's interesting how hard this problem is. We've been trying for
       | decades, and we're still in the uncanny valley with it.
       | 
       | If you freeze-frame this, the peaking waves look like snow-capped
       | mountains. It feels unrealistic because for water to have
       | features this sharp, it would have to be quite windy -- and the
       | wind would never be blowing straight up. Here, the sharp features
       | would need to be directional.
       | 
       | The simulation has the swell nature of the waves down pretty well
       | though. There isn't as much horizontal movement, as more up-and-
       | down, which is what you'd expect to see in open water.
        
         | zamalek wrote:
         | > uncanny valley
         | 
         | I've been playing Nightingale and, oh boy, is the ocean water
         | something special there. To be clear, they _don 't_ tackle
         | spray and such by keeping the waves calm, which has allowed
         | them to focus on other things. Whatever it is they are doing to
         | simulate light transmission is working. The light shining
         | through the waves at sunrise or sunset looks great and really
         | sells the effect for me.
         | 
         | It could maybe be accused of being a bit painterly, but it
         | doesn't look wrong.
        
       | arminiusreturns wrote:
       | This is awesome to see! Much more progress than I have made on my
       | gplv3 version for my system. (the original intention was to
       | replicate Blackwake style ship combat)
       | 
       | For what it's worth, the real difficulty in gameplay is getting
       | physics objects to interact with the waves properly.
        
       | kelseyfrog wrote:
       | Any other resources on empirically derived rendering/animation
       | methods?
       | 
       | A lot of hobbyist gamedevs can think of tutorials where we "slap
       | noise" on various things. While a good temporary use, there's an
       | pedagogical gap between beginner and advanced methods.
       | 
       | Another that comes to mind is vegetation animation. Like ocean
       | waves, we often see animators throw a few octaves of sin/cos on
       | plants to simulate wind, but because it doesn't spectrally match
       | what we see in the real world, it looks off.
        
       | bschmidt1 wrote:
       | Looks awesome. Is it from a fixed perspective only? If not should
       | show the camera rotation in the video demos so it's clear how it
       | could be used.
       | 
       | Would be curious to see how it looks from different angles etc.
       | as the light changes.
        
       | nox101 wrote:
       | Reminds me of Sea of Thieves
       | 
       | https://youtu.be/aGogFt4bhTM?t=12
        
       ___________________________________________________________________
       (page generated 2024-09-28 23:00 UTC)