printf("Hello, world.");
_

Echolocation Concept

In this project, I explored using Unreal Engine's particle system, Niagara, to see what kinds of effects it can do. In particular, I sought to make a visualization effect reminicent of The Unfinished Swan where the player must actively interact with the world to see.

To achieve the effect, start by disabling all lighting to create a dark environment. This hides every object at once while still allowing for easy level design: Just toggle the view to Unlit, or add in temporary lights. The object cannot just be marked as not visible or hidden in game unfortunately, that would break something needed for the next step: the depth buffer. This doesn't need to be the custom depth buffer, but it could be if you wanted manipulate the placement manually or make the object transparent with materials instead of lighting.

Moving on to the particle effect, or Niagara System, first a set of small circle shaped particles are spawned relative to the viewport. The inital pattern is arbitrary but making them appear flat to the player's screen helps sell the effect that it's coming from your character. Because every object writes to the depth buffer during rendering, we can do a very cheap 'raycast' by simply finding each particle's screen UV coordinates, sampling the depth buffer and then converting that to world space coordinates. Now each particle knows the start and end point and can perform a simple move each update. We also grab the normal of the target surface, more on that later.

To replicate physical movement, each particle moves at a constant speed followed by a check to see if the move over-shot and the particle needs to backup and stop. When the particle is at rest, the color of particle is set based on the normal of the hit surface. This makes walls and surfaces much easier to see than if particles stayed the fixed color they spawn as, but could just as easily be set to the unlit color of the surface material or any other values made available to the particles with screen space textures.

Next, each particle has a set lifetime after which it will fade and disappear. The Naigara System is set up to take this time as an input at spawn time and is controlled by how long the player holds the button down, letting the player charge up a longer lasting burst if they don't mind waiting for a few seconds. Shooting many short bursts can quickly map an area but wont last, leaving the player with a choice as to how they want to approach each situation.

Finally, the material. Each particle is a simple circle that takes in a color used for emission, but it does have one extra trick: By disabling the Depth Test, the material does not cull when obstructed, letting them simply hang in space even when behind an object. This effect looks interesting with the lights on but is a bit confusing to the eye and works best, in my opinion, with the empty void of my game.