In case you missed it
You might find these articles interesting
Hello fellow artists, my name is Federico Andolfo and I'm 24 years old. I studied CG animation at the Istituto Europeo di Design (IED) in Milan and graduated in 2018. During the last 2 years I've been working on my portfolio and I'm currently on the hunt for a job in the gaming industry.
I was very young when I decided to follow the path of 3D art. I was so fascinated and emotionally moved by all of the video games I played throughout my childhood that I promised myself I would become a developer one day.
Back in high school, I started experimenting with Blender and Maya. It was fun and exciting to accomplish even the simplest things, but I was just 16 and everything was new to me. Then I started university which lasted for 3 years. Now here I am, still learning and practicing almost every day!
Once I graduated I did some art tests, which I eventually failed, but that's not a bad thing because it motivates you to push forward! You can look at it as a more challenging way of practicing, being limited by a specific concept or theme and setting a deadline.
Sometimes you will receive feedback on your tests, which I believe is extremely valuable because it comes from people that work in the industry. Remember to make use of it.
Kaer Morhen: References
I've always been a huge fan of The Witcher's world, from way back in 2007 when the first chapter of the game trilogy came out.
This project started when I saw the works of Benjamin Roach and Simon Barle, they both recreated famous scenes from amazing games (Darks Souls 3 and Bloodborne) using Unreal Engine. Their projects were a huge inspiration for me, so I thought I could give it a try and do the same even though I'm still a rookie.
I wanted to test myself and so I started gathering references from The Witcher 3 itself. I collected a bunch of screenshots so that I could plan all of my trim sheets (which I will discuss next) and get a sense of the room. The Witcher 3 is dynamically lit, which means I could watch the lighting change over time and see the differences between day and night. In the end, I opted for the nighttime because I wanted to emphasize the candles scattered around the room and get a more mysterious atmosphere.
The room is basically an octagon, the architectural structure repeats itself for every side.
I started modeling every wall, arc, and rooftop using Maya's grid so that every piece could match with the adjacent side. Most of the shapes were made with the use of Booleans and splines that I used as a path to model the arcs.
The first thing I had to do was to get splines from the edges of the geometry, I used the convert Polygon edges to Curve.
I created 1 spline to trace the path of the arch connecting the walls to the roof, then I centered its pivot, duplicated, and rotated it.
Make sure those 2 arcs are tangent to the other 2 splines you got from edges geometry, otherwise the next step won’t work.
Once you have a squared perimeter of splines, I used the square function. This allowed me to get a clean surface from those 4 splines while making sure that the topology was well optimized for vertex painting in the engine later.
Once I finished one side, I snapped the pivot to the world origin and imported the model in Unreal, then all I had to do was rotate by it 45 degrees for every instance, simple and effective.
Blocking out is essential to have a clear sense of space in the scene. It was useful to check that the scale was correct and also make sure that a character could walk in between the assets placed around the room. I also needed to block out the spaces for windows and the main door as soon as possible, so that I could place a basic directional light and brighten up the room a bit.
Marble Floor in Substance Designer
Once I had a basic idea of the room's size, I started testing the floor. It's an old fashion tiled marble, and it was a great opportunity to gain some experience with Substance Designer and also to experiment!
Most of the node graph revolves around creating two masks: one for the inner rhombus and one for the outer shapes.
I started with basic shapes which I transformed, merged and tiled to get my desired final mask.
All I did after that was to use grunge maps, cracks and noises which I blended every time I made a new layer. I used a gradient color on every layer to get the diffuse I wanted.
Discussing with some friends, we noticed that the marble seemed odd because all of the veins, cracks, and imperfections came from the same direction. This shouldn't be possible since all of the marble tiles that compose the floor should be individual. To break up the pattern, I also added a mask to change directions on some portions of it. Finally, I blended the 2 masks and, with some tweaks on saturation and brightness, I got the final result.
Here comes the most time-consuming phase of the whole scene: trim sheets.
Don't get me wrong, they are extremely useful, I just spent a lot of time tweaking them since a lot of assets rely on them.
When I started gathering references from The Witcher 3, I noticed that a lot of models were textured with trim sheets, and I thought I should do the same (CD Project can't be wrong, right?). I made a square plane of 10 meters so that I had a base to use as a reference for proportions which I would then use later for baking. I assigned 1 unit equal 1 meter so that when I sketched the trim texture, I already knew exactly how much space every portion should take. Here's an example.
Once I had the base shapes for my trim sheet, I moved to ZBrush where I sculpted the high poly, then I imported every mesh inside Marmoset Toolbag. Once there, I assigned a different material to each individual piece of the high poly so that I could bake an ID material map; it will come in handy for masking while working on textures later on. I also duplicated my base plane, slightly offset it, and added it among the high poly meshes. This will avoid any artifacts due to padding.
The scene uses some trims for the wooden assets and a few others for the architectural pieces. With a total of 7 trim sheets, I managed to texture 30 individual models without the need of baking every single asset.
Sometimes, I had to add more loops so that I could add seams on them to match the UVs with the trim sheet.
The remaining assets in the scene, which don’t use trim sheets, are packed in groups so that I wouldn’t need a texture set for every single model. Texture size never exceeded 2K resolution because most of them don’t take up much space on the screen, assuming the scene is meant for a third-person game.
A Bit of Storytelling
The whole scene started as a replica of the original Kaer Morhen, but no one is present in the room and I wanted to justify that. The bathtub is still full of water, and the soap is visible; someone must have taken a bath recently. With that in mind, I created a trail of puddles that starts from there and ends next to the bed where some clothes would have been placed. I used this as an excuse to add more nice reflections on the floor to make the scene more interesting. All of the puddles where made thanks to vertex painting.
Basically, the alpha lerp allowed me to set how much of the puddle is visible, while the multiplier is used to darken the area of the puddles. There is also a height blend texture which I used to scatter irregular shapes.
The same material was used to make the damaged parts of the walls. It helped me emphasize some architectural elements, especially the columns along the corners.
Lighting the Scene
I always start by placing a skylight and a directional light. I pumped up the indirect lighting intensity so that I could have a more visible GI. Still those lights alone couldn't illuminate the whole room, so I had to add other lights which can be divided into 2 main groups: fill lights and candle lights. I gave the latter an intense orangish tone so that I could get a strong contrast with the bluish directional and fill lights.
Candle lights were set to stationary; I liked the idea that you could manually shut off the candles in real-time, as you can in The Witcher 3. Fill lights were placed with a very large radius, shadow casting disabled, and I toggled off the inverse square falloff so that the intensity wouldn't decrease as the light traveled away from the origin. I always modified the color of lights using temperature, it's more precise and realistic than using the color bar itself (but If you need a more artistic look, then go wild with colors!)
Finally, I added 3 area lights coming from the windows and the door so that I could scatter a bit more light into the room and more reflections on the floor.
I have a GTX 1070 card, but I gave Ray Tracing a shot. The 1000 series was not meant to handle this technology in real-time, even though it was partially supported later (please don't be so demanding with your graphic cards, they have feelings too). My framerate sometimes dropped below 10 fps, but it worked well enough for beauty shots and the presentation video.
The difference is pretty clear, here's a comparison for ambient occlusion and reflections.
AO RTX off/on:
Reflections RTX off/on
When I was close to the end of the project, I noticed the room was too reddish, mostly because of the light bouncing off the floor. That's where Post Process was helpful. By modifying the white balance I solved most of the problem. Here are my settings:
Changing the white balance got rid of the excessive red tint, while the gain and offset on the shadows helped me brighten up some corners. Finally, I tweaked some values in Photoshop and imported it.
I wanted to make a short video to showcase the room, and I mostly used slow tracking shots to follow the vibes of the song and also make everything clearer.
Resources and Tutorials
Here I'd like to link every external resource I used in the project.
- M5 VFX Vol2. Fire and Flames - This set of Fire FX was very handy and well made!
- Water Materials - Here you can find a set of water materials, I used one of them mixed with a masked texture of soap bubbles.
- For the trim sheets setup I have to thank Tim Simpson and his tutorials, here is the first part
- Lastly, I’d like to mention Tilmann Milde and his tutorials, the way I treat textures and lighting has completely changed after I watched his videos. Now I spend so much more time using the unlit viewport to calibrate texture's colors. You can see him in action here:
Conclusion and Tips
I think that one of the most important things is to plan everything from the very beginning. That way, it'll easy to keep track of what you are doing and therefore you'll waste less time. Write it on paper, make an excel file, whatever you want, just create a pipeline and try to stick to it.
The whole project took me more or less 8 weeks. At the beginning I was scared I might abandon the project before finishing it, but when I felt discouraged all I had to do was to travel (virtually) among the streets of Novigrad and Toussaint to find inspiration again and come back to work!
It’s amazing how video games can be so artistically powerful. Will the day ever come when they are recognized as the eighth art? Time will tell.