Mind Diver is a first-person detective game where you swim into a young woman’s memories to locate her missing boyfriend. The player must listen to snippets of memories and literally fill in the missing parts to understand what happened.
I worked on the demo version of Mind Diver, which was later expanded into the full version available now.
Photogrammetry pipeline
The game’s levels consist of 3D scanned geometry captured in various places in Copenhagen. These raw photogrammetry scans can be hard to work with since they often have extremely high poly counts, messy topology, confusing materials, and inconsistent scales. I was responsible for setting up a pipeline to automatically process imported 3D scans and make them usable for our 3D artists. This was largely accomplished by writing Blender plugins in Python to normalize and decimate topology in batches as well as extract embedded textures into the filesystem. As part of this process, I also manually masked off and rescaled many of these imports to be consistent with each other. We kept edits nondestructive as far into the process as possible.
Character controller configuration
At the time I joined the project, Mind Diver was using a premade physics-based character controller which behaved very differently depending on whether the player was using a controller or mouse and keyboard.
- Configuring drag to make walking/swimming and camera rotation feel consistent between keyboard and controller input
- Properly dampen movement speed when transitioning from swimming to walking to avoid “shooting” the player through scenes
- Construct input device and context dependent movement vectors to swim, move on slopes, etc. at consistent speeds
Applying decals to 3D scans


Several puzzles required 3D scanned meshes to display graphics (such as the above coffee stain) that weren’t possible to add at capture time and which must be added in Unity. For these meshes, I added a secondary UV map and created a shader which allowed us to plug in decal textures that would show seamlessly on top of the photogrammetry textures.
