White Room
White Room is surreal experience where you and a virtual companion attempt to escape from a vast and complex three dimensional maze. Be forewarned, there’s more than one puzzle to be solved.
The game was developed for a one week challenge in 2014 and was made for the Oculus DK2. I worked on the coding of the game. Voice acting was done by Nicholas Adams. Script writing and 3D modeling was done by Roman Moskvichev and Joshua Salvador. All of us took part in game design.
The main programming language I used to code the game.
The engine used.
Worked with the Rift and Unity’s Integration.
Used Git with Bitbucket for version control.
The IDE used with Unity.
Used for creating the model used in generating the maze.
Used for pseudo code and problem solving.
Used to manage all tasks for me and other members.
Integrated as the primary form of input.
3D Maze Generation
The most complicated problem I ran into with White Room was the generation of the maze itself. Not only did we only have a week but I barely had any experience in procedural generation. I had an idea of what kind I maze I wanted to make but wasn’t exactly sure how I would go about making it. I wanted to test out mesh generation but I simply didn’t have enough time to take the risk of learning it. Instead I decided to build the maze using some kind of pre-made mesh. A cube made the most sense but it was so generic that it was hard to make paths just using it. I spent most of my time in Blender playing around with shapes and the one that made the most interesting results was this Tetris-like L piece.
Using this piece I made an algorithm that would spawn another piece and randomly rotate it at set points (the orange ones in the figure above). I gradually increased the amount of pieces and I managed to make a 3D maze that looked even better than what I imagined.
Procedural Details
The maze looked cool but I wanted to add some more detail as well to add more variation and make the world feel more immersive. To do so I sketched out and tested possible spawning positions for details and came up with certain points near the edges. Other than paintings I avoided spawning objects near the center as I wanted there to be a clear path. A pillar right in the center of the path not only clutters the path but looks bad in general. After that I messed with randomization and spawning parameters to get a nice balance of performance and detail within the world.