Dont Look at Medusa

· 782 words · 4 minute read

Dont’t Look at Medusa is an experimetl VR – Game made in the Unreal Engine 5, focusing around the Mythology of Medusa and exploration of VR Gameplay possibilities.

Background 🔗

We had several intentions for the project. On the one hand, we wanted to shed light on Medusa’s
story, as it emerged during the research that there are different
versions about her.
On the other hand, we wanted to experiment with the controls within VR, especially
with the movement and viewing direction of the head, and what interactions and tasks within the VR world could be fun.

The Team 🔗

  • World Design – Nina Dierksen
  • Character Modelling and Animation – Jacqueline Grüner
  • Programming – Markus Meier & Haochen

Due to time limitations and techincal difficulties wer ewe unable to deliever a playable prototype.

Object Interaction 🔗

Click to expand

With the idea in mind that the player may want to or should carry several items, I have integrated an inventory system. Objects with the Grabable Component can be stowed behind the back. If there is already an item in the inventory, these are exchanged. The system does not work properly as it is dependent on the Grabable Component. So if there is an item in the inventory and the player tries to retrieve it with an empty hand, it will not be activated.

Some items have to be searched for by the player or are deliberately hidden from the player. To help draw the player’s attention, these items trigger vibrations in the controller as soon as they are within reach. The intensity depends on the distance. This means that even an invisible object can be found.

A note from a fallen warrior can be found in a hidden room. This contains a little spice for the story as well as instructions on how to make a sleeping potion. The note is a widget with a parchment-like background and a text element. A font that looks like handwriting has a different effect than actual handwriting, but this makes it easier to create a localization for different languages.

The sleeping potion is designed as a throwing potion. On the one hand, this is easier to implement, and on the other, it is fun to throw things into VR. The bottle is a clay vessel, so no visual changes need to be made when the contents change.

Instead of creating a child for each ingredient, it is a blueprint that sets its mesh in runtime based on an enum representing the ingredient. Preparing the sleeping potion consists of simple collision checks in which the enum is called. When all the ingredients have been added, a particle system signals that the potion is ready. If the bottle is thrown or falls, a check is made to ensure that all the ingredients are present and that the speed has exceeded the limit. Only then does it burst and produce a pink cloud of smoke.

Reflective Shield 🔗

Click to expand

To avoid looking Medusa in the eye, the player should be able to orient himself with a shield that reflects the surroundings. This proved to be one of the most complex problems.

The first method was to use a SceneCapture2D or SceneCaptureCube to project the environment as a texture. In principle, the SceneCaptureCube method works, but at the expense of performance, as the scene, including the viewport, has to be rendered a total of 7 times per screen. We then had to turn our attention to optimization. The biggest costs arise when calculating highlights and shadows. If the viewport calculates these but the shield skips them, we still couldn’t achieve more than 20 fps.

Through further research I found Planar Reflections. These work much better and take the surface texture into account, but their workflow is designed for fixed angles. However, I was able to work around this as long as the original angle of the shield and the planar reflection matched. In addition, this method allows me to make invisible objects visible in the shield and vice versa.

Dying 🔗

Click to expand
If the player makes eye contact with Medusa, he dies. On a technical level, this means that the player’s position is reset to the starting point. In addition, a character mesh with a stone surface in a random pose is placed at the point where the player died. Since dying is closely linked to the work of Haochen and we cannot work on a file at the same time, the function is written in a component.
The mesh and the poses are external materials from Mixamo.