This project was a bit of a love letter to my favorite game, “Outer Wilds”, Few games have made me feel so much like that game.
One of the stand-out moments for me was landing on the planet “Giants Deep” which is an Ocean world with stormy weather and tornadoes inhabiting most of the planet’s surface!
These Tornadoes really got to me and understanding how they were made became an itch I had to scratch! Luckily for me, there is a unity creator spotlight on the game, with some basic explanations of how it works! with that, I started breaking them down and tried to recreate something similar myself!
During this project, I have learned a lot, delved into more complex blueprints and integrations than before, learned about Unreals control rigs for procedural animation, and more!
- Control Rig Displayed (Slide one)
- Tornado Randomness on Begin Play (Slide Two)
- Control Rig Node Network (Slide Three and Four)
In order to give the Tornadoes unique shapes and to have that amount of tornadoes it had to be procedural! – Considering the randomness of a Tornado Procedural is probably the best aesthetic as well.
This was done utilizing the Unreal Engines control rig tool, I created a Spline rig with 3 Main controllers that could be adjusted, The basic spline setup described in Unreal´s documentation only took into account the position of the controllers and not the scale and rotation, After some digging and experimentation I managed to get the scale working as well!
This gave me the tool to randomize each Tornadoes Controller´s Position, Scale, and Movement to create the different S, C, and tube shapes and the swinging motion.
I enjoyed working with the control rig tool and I learned a lot! It was a very fun workflow for rigging and I hope to see the system fleshed out so that It can start matching the possibilities in 3D software.
The Tornadoes had to trace the ocean surface, and the sky, and since I ended up going with the spherical presentation they had to rotate around with the Surface!
I ended up solving this problem by using Raycasts! One shooting out from the bottom controller and One shooting out from the top Controller, I then took the Distance and Added/Subtracted from each controller’s initial position and updated it accordingly.
The Normals of the surface were used to create a Forward Vector together with the “Make Rotator ZX” Node for the Z axis to keep the Tornadoes upright around the Sphere.
For the Final Presentation, I ended up using only the Bottom Tracing and instead setting a random value for the Top Positions’ height, To save time I did not implement an AI System and instead had the tornadoes rotated around the center of the planet.
I learned a lot by experimenting with this and it also taught me the power of “Kill your Darlings”
- The tornado Tracing the planet
- VertexColors + Secondary Elements = Tornado (Slide one)
- Tornado Main Texture/Normal (Slide Two)
- Splash/Swirls/Rain Textures (Slide Three)
As for the Tornadoes, they have vertex displacement that is driven by a scrolling Texture and a Scrolling normal map with a pattern that I made in Substance Designer.
In order to break this pattern up and add some feeling of randomness I utilized vertex colors where I gave a random vertex color to different segments of the tornado, which then push the vertices in different amounts in XYZ depending on the assigned color.
Combined with two additional secondary textures scrolling sideways and upwards, some fresnel, and a colored gradient it gives the effect you are seeing!
At this point, the tornadoes still looked quite solid and did not feel very much like energy flowing in a raging storm, so after a few rounds of feedback from VFX Apprentice and my class I figured out that I had to tie the tornado to the water better and some secondary elements were needed.
So I ended up adding two particle systems, with a mist-like texture one that follows the bottom controller and one that follows the top controller, Similar to how I made the clouds/sky actually.
I also added some soul coasters and planes that I tied to the rig, combined with some basic shaders it gives the feeling of wind flowing around the tornado! and as a last addition, I copied the tornado mesh, added it on top with some opacity and with a few different base parameters which really sold the effect!
I ended up combining some different methods for the water, I wanted to stay true to how “Outer Wilds” did their water, however, they did not explain it very thoroughly. The main part they mentioned is that they used 4 different height maps with 4 different maps packed into one. which fade over time and have varying detail qualities.
So after some playing around and experimenting I ended up using the Gerstner wave function, which I made as a material function, for the main waves I just used the plain Gertsner function which I took help from a Unity tutorial that I found. for the smaller waves, I used the same function but I included a texture that then over timer lerped between the RGB channels over time. As the main focus of the project wasn’t the water but it was the tornadoes I was happy enough with this, however with infinite time I would come back and improve the water shader.
A big part of what sells Tornadoes is that it reacts with the water, this I solved using Unreal engines Distance Field to have the water shader push the vertices in the direction of the normal based on a mesh which I put under the surface and tied it to each tornado bottom control point so that it seems as if the tornadoes sucks the water up! and I combined it with some splash particles at the bottom of the Tornado.
- Distance Field Showcase (Slide one)
- Gerstner Wave with texture function (Slide Two)
- Wave Textures Packed in RGBA (Slide Three)