This is my entry for this sketch, a stone skipping VR game. See a video of the splashing below, and read the thread to see some tidbits about the development. Thanks!
I decided to enter this one, though I’m a bit late in the month… Let’s see how far I can push it.
My idea is to make a stone skipping VR game, with splash effects and whatnot. Will try to not go too deep into a physics rabbit hole and opt for a more simplistic gameplay instead.
I’m starting by tweaking Unreal’s VR template, adding sockets to the hand skeletal mesh of where to hold the stones (otherwise, the hover around the hand, which feels odd). Made a stone mesh, and tried making a ‘telekinesis’ function to pick rocks from a distance (so you don’t have to bend over so much).
Didn’t work at all at first. I think I know how to fix that, but I’m ditching that for now.
Trying to perfect the pick up action… need more work on it at this point. It’s fun how broken and goofy this is
Pick up action working great, water blueprint in place - but nothing special, just regular collisions and some debug indicators.
FYI those videos so far are unedited, rough and potentially boring! Things should get more fun as I progress.
Water blueprint now detects if the hitting object is a skippable rock, and if so, calculates the reflection vector and throws it out with the same velocity. At this point I’m not interfering with the velocity at all, so you can see that it has minimal energy loss and can bounce for a looooong time. Kinda fun though!
I’m also drawing the rock’s trajectory and printing the hit angle. To get the angle, I’m getting the dot product between the hit vector and the water surface vector, and getting the arc cosine of that.
I’m glad I’m not recording any audio because I kick a piece of furniture at 0:12. Gotta do something about that!
Cleaned up the debug indicators a bit, now they’re more readable.
Added a feature to spawn rocks by pressing a button on the oculus controller, so I don’t have to walk all the way to the counter or bend over to grab them while testing. Prevents me from kicking furniture so it’s a good quality of life improvement! I’m also destroying the rocks after a certain time from the last bounce has been elapsed.
Bouncing mechanics are still wacky, addressing that next.
Switched to forward rendering, performance looks a teeny bit better but I’m not doing any proper profiling yet - just want to keep things playable, without having to do any premature optimization.
Now doing a first attempt at modulating the bounce based on velocity and angle. Read some articles, there are some papers on the science behind this, this is an interesting take:
Right now I’m just evaluating the attack angle, which is the angle between the velocity vector and the normal of the water surface. 20º is the ideal, and then I have a falloff of about 20º. The farthest you are from the ideal 20º, the less velocity I apply to the bounce, and below a certain velocity threshold, the bounce fails.
It’s a rather naive approach, and it makes it very easy to skip them, so there’s not much challenge at the moment. I’d like to revisit that later, but it’s good for now! Moving on…
This test also showed me how fun it is to punch the stones around, or bounce them off walls, which I didn’t envision at first. Prototyping is fun!
Gathering some reference outside! There’s a nice calm lake I can throw some rocks on to get videos of the ripples. Bonus duckies
Collecting more reference, now with actual skipping, on the ocean! Will start on the actual splashes next.
First pass at the effects! The water material has up to 8 ripples that get triggered on impact, plus a particle system that gets moved to the impact point and activated, and that one has some smaller ripples too. Those can have some artefacts, still need to fix that up.
I used this VR sculpting tool called medium to make the splash mesh, I feel it’s a good placeholder but I’ll need something more elaborate than this.
Edit: forgot to mention, but after this step, I tried leveraging motion blur to get the splash looking a bit more dynamic even though it’s a single frame. Failed, no matter what I tried, motion blur seems to be forced off when playing in VR.
Did a pass at the stones, now they get assigned a Seed parameter on the construction script, and the material randomizes their shape and color.
As of now, I’m only using the noise functions to drive this, so they don’t have any interesting detail closer up. I plan on bringing in some texturing later, but this is good for now, I believe.
If you’re curious on how to achieve the random shape, check this out:
This is how the mesh looks like:
From the simulation above, doing 2 tests - one with an animated mesh (16 frames) and one with a single frame, just animated via cascade. You can see clearly which one is which:
Prototyping a vertex shader ripple to replace the previous system.
Here’s the mesh used:
Here’s my finished video for the sketch! The game is playable in VR, those splashes and ripples you’re seeing are being triggered by the game logic itself. Pretty fun project, which I intend on develop further!
Nice!! This turned out really well - from the splashes to the overlapping ripples you really nailed your idea, great work!
This is wonderful!
I love the material on the splashes too, they really remind me of the water splashes in Mario Odyssey, which are some of my favourite!