Virtual Luxury Camping
Creating an Unreal 5-star camping experience for VR
Hi, My name is Tav Shande. I started my career in games back in 2003 working on an Unreal Engine FPS called America’s Army, since then I have worked at EA, Crytek, & Activision on titles such as DeadSpace, Crysis 2, Call of Duty: Advanced Warfare, MW3 & more. I recently created a real-time environment based on the Vipp shelter at Lake Immeln, Sweden after being inspired by the clean architectural designs and surrounding nature. The following article will cover some workflow, techniques, and thoughts that went into the creation of the scene.
Idea & Inspiration
Due to the sky rocketing rent in the bay area I became fascinated with prefab homes that could be built quickly in any location. My goal for this UE4 project was to create a tranquil VR luxury-camping experience based on the real Vipp shelter located near Lake lmmeln , Sweden.
After years of creating rubble-filled, war torn environments for several FPS-AAA titles, I was eager to create a clean, peaceful environment that aesthetically relied more on subtle lighting, clean materials, and fundamental design pillars, rather than clutter, hyper-detail, and noise. Additionally, it would be a great way to incorporate some new game-dev tools into my workflow.
After using the Occulus, HTC VIVE, and attending a couple VR workshops at Stanford I was completely sold on the possibility of VR being a powerful medium for empathy and decided to create a virtual camping experience where users could go to relax and absorb the outdoors anytime. After getting excited by the idea, it was time to make sure I had all the necessary hardware & software ready to build it.
I transitioned to mostly Mac hardware for home use which has been a challenge for creating complex 3D real time environments because of the limited graphics card options available. A simple test scene was being displayed at 9 frames a second so I decided to invest in an e-GPU to house an Nvidia Titan X and my FPS jumped dramatically to 90fps. This has been the best hardware purchase for creating 3D scenes on a Mac. As for software, at the beginning of the project I thought about using CryEngine but since there wasn’t an option for Mac yet, my choice was easy, I went with UE4. After sorting all that out it was go-time!
- Mac Pro (Late 2013)
- Bizon Box 2 eGPU (case & power supply only)
- Nvidia Titan X
- iPhone 6s and canon 5D MkII (For Photogrammetry)
- External hard drive (For backing up work)
- Substance Painter
- Substance Designer
- Bitmap to Material
- Speed Tree
- World Machine (via Parallels)
- Unreal Engine 4
Having a well-thought out plan before starting makes things a lot easier and the whole process will be smoother. Reference is a major key for stylized-realism. I didn’t need concept art since the scene is based on a well documented real-world location. Using Google, Flickr, Pinterest, and Youtube, I collected a folder with all the reference images I needed. It can be easy to gather way too much reference which can actually slow you down when creating. Pick out some key reference shots to begin working and use detail reference shots from many angles and lighting conditions if possible. Once you form a complete picture of what you’re building it’s much easier to get into your 3D content creation app and start blocking in shapes.
Since this will be a VR scene, getting the scale of all objects in the world right is a must. It has a huge impact on player immersion. I made sure my Maya grid and Unreal grid units matched exactly. This will also help later for light baking calculations. Before modeling any geometry it’s good practice to bring in a stand in model as player size reference.
Block it out, Block it In…
Starting with cubes, I begin to block out the structure into modular pieces using the real blueprints as a guide. Once I get all the parts of the shelter blocked out and assembled, I begin to refine the block into low poly shapes. Using the grid and block mesh helps to identify how all the pieces will fit together seamlessly. All the furniture and props stay as block while I begin creating game ready mesh that fits within the bounding box of the block mesh. I usually pick the most interesting or unique architectural element to start with after the block so I’m not stuck staring at boring grey cubes for too long.
While modeling the structure and scene props I made sure to make optimized geometry but gave objects higher fidelity in places the player would be more likely to reach or get close to. I decided to model each bolt on the exterior since it was such an important visual characteristic of the building and in VR faking depth with normal maps doesn’t really hold up at very close distances. I built the game low-res model first then used that geometry to make a high-res version to transfer normal maps from. I made sure to combine any geometry I could together in order to reduce the amount of individual pieces of geometry on screen for better performance and reduce the amount of unique large textures I would need. For UV’s I tried rubbing a genie’s lamp so I could wish them into instant completion but that didn’t work so I just used Maya and made sure to pack them UV’s with enough space to avoid texture bleeding at lower mips and I also offset any mirrored parts to prevent any errors in the bake. The UV layout is really important for light maps so a little care at this stage prevents rework later during lighting. Once I had the High and low-res meshes ready I exported them as triangulated FBX files grouped and named with the suffix _high and _low for normal map baking in Substance Painter.
Textures in Substance Painter
If there’s one piece of software that has totally revolutionized my workflow, it’s substance painter. 95% of all the scene’s textures were created using it instead of the traditional Photoshop workflow. A PBR shader model was used and consists of a diffuse map, normal map, and R.M.A.O. textures packed on export to save memory. A red channel for the roughness map, blue channel for metallic, and green channel for the Ambient occlusion map. Once the models and textures were finished, I sent everything to Unreal for import and creation of master materials and instances.
I created a master material and instances for 95% of the objects in the scene. This was done for any material without transparency. I created a landscape material with textures I generated in World machine and Bitmap 2 material so I could adjust tessellation and height maps. Unfortunately there was no way to enable tessellation in Unreal on a Mac in the UE4 build I used but that’s slated for a later engine update so I left in all the textures and material setup so I can flip the on switch when it’s ready.
To create the terrain I initially tried to capture real world lake Immeln height information using the website www.terrain.party and DEM maps but I wasn’t able to get the height map resolution I needed for my scene. So I started with a flat landscape in Unreal and painted the terrain features I wanted. Once I defined the playable area and location of the structure in the level, I then carved out the lake and started refining elevation changes. Once I was happy with the look, I exported the height map and brought it into World Machine where I used the QuadSpinner plug in to add erosion and natural looking details to the landscape. I also generated a base diffuse texture and normal map.
For the trees, I did research about what types of foliage grow around the lake and created bark textures in Photoshop. The trees and all other plants, including the loose branches on the ground, were created in SpeedTree and exported with a wind modifier so tree branches can sway in the wind. to save on performance all the distance trees are billboards
Before starting on the rocks, I used a canon 5D MII camera to take pictures of firewood for use in PhotoScan. While I was happy with the results, I didn’t like how much time and disk space the process took so I decided to switch cameras when creating the rocks. To speed things up, I grabbed a few small rocks from my friend’s garden that had interesting yet generic enough shapes to be reused throughout the scene without looking repetitive and used my iPhone to snap a series of pictures.
I was able to quickly generate high res rock meshes in PhotoScan. Since I wanted to be able to rotate the rocks to any orientation I imported the meshes into Autodesk’s Mesh Mixer and filled any holes then took the high and low resolution mesh into Substance painter for texture completion.
The reflections in the water were created using Unreal’s planar-reflection volume plus a simple water shader using scrolling normal maps.
Lighting the scene was the most time consuming and difficult process in the whole project but it was also very rewarding to see everything finally come together. Since the environment contains both outdoor and indoor areas with rooms that are occluded from direct light, making sure the lighting looked good in both areas was tricky. There’s a wealth of lighting knowledge in the official UE4 forums. Reading them helped greatly while troubleshooting. I used a shadow casting skylight with an HDRI texture applied in addition to some lights to support the physical lights on the building. I turned on fog to add some ambiance to the scene and depth to the tree line.
Post processing in this scene was mainly used to simulate a physical camera and return some warm tones to the mostly desaturated, cold scene. To experiment with different looks I used a free app called Afterlight to test out different filters, once I find a look I like then I go into the UE4 post-processing settings to mimic the results.
Performance & Optimization
During the course of any project, importing lots of assets can result in the accumulation of some unnecessary files. I went through the project merging all duplicate file references and deleting unused materials and textures. I also went through and reduced high lightmap resolution on geometry that didn’t need it then went through and deleted terrain that could never be seen and disabled collision for objects in places the player would never reach.
It has been lots of fun creating the Vipp shelter environment in UE4. I learned a lot about developing on a Mac with Unreal and was able to test out many different tools and workflows while creating the scene. I look forward to adding in some fun VR gameplay, audio, animals, VFX, and more soon to make it a fun virtual experience.
Unreal Engine 4 is, without a doubt, one of the best game engines available. Epic Games has been ultra transparent while updating the engine with improvements and patching any bugs quickly. Along with the superb set of tools there is a huge amount of documentation and one of the largest developer communities making any answers to development questions only one forum search away. I’ll definitely be using it for more projects in the future.
- Update - This scene is available for download now on the Unreal Marketplace. Enjoy!