Like many others, I was impressed with the Squid Game series when it came out. I liked its aesthetics, the combination of an innocent, toylike and at the same time frightening atmosphere and how the author makes the viewer feel uncomfortable because of non-standard size objects. Therefore, the idea of the project came to me immediately.
I like the aesthetics of the female body. We didn’t see female guards in the series as that would be illogical. Therefore, I decided to combine my two passions in the SQUID GIRL fan-art project and show you how a girl guard would look in a parallel universe of the game.
To create a project, I used Autodesk Maya, Marvelous Designer, RealityCapture, Substance Painter, Unreal Engine 5, Photoshop, Blender, ZBrush and Adobe Premiere Pro.
References and Inspiration
Collecting references is one of the main stages in the creation of any project, which the result directly depends on. In this case, it was much easier for me to do this since I was based on the existing character and indoor interior in the series. To begin with, I collected references for the character.
Fortunately, the details of the hero’s uniform are clearly visible on the most popular freeze frames. Next, I took screenshots of the scenes in which the details of the room and corridor are visible and got to work.
Sculpting in ZBrush
I decided to use Zbrush as little as possible since the main high poly parts were simulated and scanned. As planned, the character should have slightly exaggerated forms to make the figure clearly visible under clothing and still realistic. Therefore, the main point of using ZBrush was to correct the figure of the avatar for Marvelous Designer.
Note that the polygon count of the avatar should be larger than the polygon count of the cloth in Marvelous Designer. Otherwise, after the simulation, the avatar mesh will be imprinted on your fabric. I used an avatar with a polygon count of 10 million, and the final polygon count of the high poly jumpsuit was about 4 million.
At this point, I created a low poly mask in Maya, which is needed as part of the avatar to fix the hood.
Simulation in Marvelous Designer
Working on the uniform at Marvelous Designer was a key part of the character creation.
One of the main rules that I use when simulating clothes is that patterns don’t have to be the same as they would be in real life. The purpose of a uniform in life is to maximize the comfort of a person and fit clothing with a minimum number of defects.
In 3D, our goal is to create painterly imperfections, in particular the balance of drooping and tension of the fabric to form beautiful folds. Therefore, patterns in life and in Marvelous Designer will have a different shapes.
I start my work with a realistic form of patterns. If you haven’t any idea of what shape a particular part should be, you can google reference patterns of similar clothes and try to repeat them.
Step one is to make the main parts, without the details. Particle Distance (fabric resolution) I set to 20 while working, this is enough to start, and your video card won’t be overloaded. Do a test simulation to make sure the dimensions are correct. Then I started adding detail. I added cuffs on the arms and legs, a belt, a hood, pockets, etc. The base is ready.
Step two is to adjust the characteristics of the fabric.
I used three types of fabric:
The main fabric (Polyester_Taffeta), stiffer fabric for the pockets and neckline (Leather_Cowhide), and a separate fabric for the cuffs (Denim_Stretch).
In real life, all parts would use a rough fabric like a tarpaulin, but in simulation, we can use any other preset if it looks good.
Now we have a finished form. The last step is to change the shape of the patterns until you get the perfect folds. Don’t be afraid to bend lines and don’t forget to save before each simulation. As you can see in the screenshot below, the patterns have a lot of unreasonably curved lines.
For example, I shortened the distance between the bottom edge of the zipper and the side pocket on my pants to give the illusion that the pockets are full. To create folds at the seams, the sides of the patterns sewn together have different lengths and bends.
At this point, you can lower the Particle Distance to 10 or 5. Note that as you increase the resolution, the shape of the folds will change slightly. Therefore, it is better to refine the model at the final resolution if your computer allows.
The high poly gloves were created using the same pipeline. I worked on the model in such way that I did not have to make edits in Zbrush. Therefore, I made the last simulation with Particle Distance 5. Then I exported the triangulated fabric to OBJ as a Single object.
The bed in the room was also created in Marvelous Designer. I made a low poly prototype of the pillow and sheet in the correct size in Maya, and immediately created a UV for it. The cuts on the UVs should be where you want the seams to be in Marvelous. Next, I exported the bed avatar and bed linen prototype as a garment in Marvelous for simulation.
This is one of the convenient ways to work in the program, as for me. Thus, you automatically create patterns according to your UV shells and seams. To fill the pillow with air, I set the pressure to 2. When the bed was ready, I returned it to Maya. UV created initially remains in its original form.
Photogrammetry in RealityCapture
3D scanning was used to create shoes. I had a perfect example of rough boots with signs of use, so photogrammetry was the best option. In the series, the characters wear low footwear that looks like shoes or sneakers. But high boots can emphasize the shape of the leg and make the look more militarized, which I wanted to achieve.
In general, to scan such things, it is better to use studio lighting and rotate the object relative to the ring light source fixed around the camera. In this case, the shadows do not fall into the frame, and the scanned albedo is cleaner. But this possibility is not always available. I took photos of shoes outdoor. The main criteria for scanning outdoors are cloudy weather, with diffused light, without direct sunlight, which can create hard shadows.
Another problem that can be encountered when scanning outdoors is that slightly glossy surfaces such as leather reflect light. Thus, the toe of the boot as a result is much lighter than the shaft. This needs to be fixed manually in Substance Painter. In classic PBR, this could be a problem. In this case, it was planned that the light would fall only from the top, so this scan option was suitable.
I used a Nikon D5600 camera and a tripod. Photos were taken in two rows in a circle. I usually take photos in three rows, approximately 45 degrees from above, 45 degrees from below and at the level of the object, as well as a few photos from above if possible. Since in this case we are dealing with reflections, when you take photos from below, the reflection of the sky shifts significantly to the side. This may result in RealityCapture not recognizing the photos, as the albedo at different heights will be different. Therefore, I decided to abandon the bottom row of photos.
Retopology, Modeling, UVing
I did the retopology in Maya using the Quad Draw tool. It was important for me that the geometry repeats the shape of the folds, and their volume can be seen on the silhouette, so the process was carried out manually and took a lot of time. The retopology of the boots was done in the same way. When the low poly was ready, I started the UVs.
I used three separate materials for fabric, mask, and shoes. A separate UV was created for each. When unwrapping the fabric, it is necessary to make the most solid shells. It’s better to leave a slight stretch on the UV than to make a cut. This way we can avoid artifacts. I made UV cuts mainly along the seams so that when texturing there were no problems with the fabric texture.
At the same time with the character creation, I worked on an interior low poly. The corridor and room in the series references look very simple and geometric, so the low poly turned out to be simple. The pillow is made with high poly retopology.
I made several UV sets for small objects, doors, lamps, etc. I decided to make a separate texture for the walls, ceiling, and floor in the room, not a tile texture, so that I could bake the bevels and add more detail at the texturing stage. I also made separate UVs for the walls, ceiling, and floor of the corridor, and unwrapped them on a tiled texture.
I did the high poly baking in Maya: jumpsuit, separately hood, gloves, and boots. Below you can see the final settings of the bake. For the first pass I baked on Sampling Quality Low (2×2) with a texture size of 2K. This is done to check whether everything is baked correctly and whether the value of Search Envelope and Filter Size suits us. So, you will not make a mistake and save a lot of time. When I checked everything, I started the final baking on Sampling Quality Low (8×8) with a texture size of 4K.
For example, for basic fabric baking, I set Filter Size 2. For baking small, sharp, and deep folds or seams, I set Filter Size 5-7. Otherwise, noticeable pixels appeared on the texture.
The same with the Search Envelope parameter. The main parts were baked with a value of 1 since the low poly matches the high poly quite well. But the deepest folds, the highpoly of which is further away from the lowpoly, were baked with a value of 5. When everything was baked, I collected everything into one texture in Photoshop.
For bevel baking, I used the Bevel Baking plugin in Blender. This is a very easy tool that bakes smooth bevels on hard edges without creating a high poly. I have used it on hard surface parts such as the mask, buckles, boot soles, as well as on the thickness of the cuffs, belt loops, neckline, and hood. Next, I connected the texture of the sole of the boot with the normal baked from the high poly in Photoshop.
For baking chamfers on interior elements, I also used Blender. Since the textures of the corridor only tile along one axis, I baked the tiled chamfers to the corners of the corridor as well.
After that, I finalized the normal map in Substance Painter using the height channel. This is how I added room numbers, keyholes, vents, bolts, etc. For realism, I added the texture of crumpled metal on the doors and metal surfaces, dents on the white furniture, the unevenness of the concrete floor, etc.
The bed normal was baked in Maya from a highpoly created by Marvelous Designer. The seam on the pillow was added later using the height map.
Texturing in Substance Painter
Texturing is one of the most interesting and important stages. It is possible to both emphasize your model and spoil it.
The first thing to do is to load your prepared normal map and bake the auxiliary maps: World space normal, Curvature, Position and Ambient Occlusion. For the last one, I set the value of Secondary Rays to 256 and Ignore Backface set to Always, to avoid black artifacts in places where one geometry enters another.
The first stage of texturing is the assignment of base materials. The fabric for the work uniform must be resistant to wear and external factors. Therefore, it had a rough normal, for example, like a tarpaulin. So, I picked up a suitable tile of fabric based on its texture. Then I created a color correction layer with a Passthrough blend mode and a little transparency to leave the unevenness of the original albedo.
The seams were drawn by hand using the height channel. There are 2 types of seams – external and internal (which eventually begin to be seen). I used different Spacing values for each. Next, I added a zipper. The belt buckle is painted metal, so I added some paint chipping on the edges. The belt was made in a similar way to the jumpsuit but from a coarser fabric. I also added rubber material to the gloves.
The next step is adding detailing to the base materials. For example, I made the effect of burnt fabric on the surfaces turned to the top, rubbing on the protruding parts of the jumpsuit, because often the folds gather in the same places.
I added dirt in the recesses and darkening for a volume effect. According to the idea, the overalls should not be heavily worn and physically damaged. So, I added general dirt, especially in deep places and closer to the floor where it gets dirty more easily.
It is worth remembering that all the detailing that is present on the albedo must be supported on the Roughness, and vice versa, with rare exceptions.
The mask has been textured using the same pipeline. I used scratched plastic material as a base. I added a pattern of paint worn off in some places so that there was a feeling of uneven drawing. I also added holes using the height channel. The scan was made in advance in such way that the hole pattern lay flat, in the right direction and without distortion.
For boots, the texture was already partially ready after the scan. I evened out the tones, muted too bright highlights, made color correction.
To create the Roughness map, I used an inverted Base Color map, with leveling and some manual adjustments. The deep parts turned out to be more matte, and the protruding ones were polished. Thus, the details present in the color were also supported on Roughness. After that I textured the sole and zipper and added some damage and dirt.
The same time I textured the interior. I wanted to make it more used than in the series. So, I added more scratches and dust to the surface of the floor, made the metal worn. I made the walls in the room darker with time and added painted chipboard panels on the walls.
For the material of the mirror, I set roughness 0 (black) and metallic 1 (white). The base color of the mirror is light gray with a green tint, as in real life the mirror actually has a green color. I also added fresh and dried water drops to the mirror and washbasin.
On the watch, the albedo is made very light green to give the illusion of a slight glow. The room numbers are made using the alpha channel, so I removed them when baking the doors AO.
As I said, the textures of the corridor are tiled along one axis. So, I added ambient occlusion shading on the albedo along the corners.
Working on the animation of an anthropomorphic character was a new experience for me. I started work with a rig. For this, I used Advanced Skeleton, a rigging tool in Maya. Its advantage is that you don’t have to have a plugin installed to open your character. The skeleton created with the plugin will work without it. This is different from other tools known to me. If you figure it out, the plugin is quite user-friendly.
For my character, I used the Biped preset. Unlike BipedGame, it creates three bones between the joints of the hands, in the hip, lower back and chest. In this way, more natural joint action, pronation and supination of the arms and legs can be obtained without distortion.
The controllers were also created using the plugin, they allow you to control both global and small body movements in sufficient detail.
Since the character is quite polygonal, the automatic skin turned out to be good. For the skin, I used the Bind method – Closest in hierarchy. So, the influence on parts of the body close to each other did not intersect. I decided to set Max Influences on 4.
Next, I hand-tweaked difficult parts of the skin, such as the hood, armpits and shoulder blades, as well as the elbow and knee joints, so that they did not appear rubbery. To make changes, I put the character in different poses and fixed bugs in them. When the skin was ready, I started posing.
Posing and Animation
I made some static poses for rendering on a gray background and in an interior. In different poses, I tried to convey a different mood of the character. I exported the static poses from Maya without the skeleton.
I also created some simple animations. Two of them are tiled. The first is a 40-fps idle with two breaths. The second is a walk (2 steps, 12 frames each). To make it realistic, I used the reference of a relaxed walking of a person frame by frame. Also, separately, I made an animation near the mirror, where the character puts her hands on the washbasin and looks at herself.
Unreal Engine 5 scene
Setting up the scene in Unreal Engine 5 started with importing objects. For interior parts, I used the usual export from Maya in FBX format. Unlike OBJ, it supports more than one material assigned to an object and correct positioning in the coordinate system.
To export the character in a static pose, I also used FBX. But to export the animated character, I used the Game Exporter tool in Maya. To do this, you need to select all the components of your character (mesh, skeleton, and controllers) in the outliner and run the exporter. If you haven’t a button on the File menu, you should enable the plugin in the Plug-in Manager. You can see the export and import settings for the engine in the screenshot below.
I brought the scene to Unreal and created the materials. To create the glowing lamp material, I used the MM_Material_EM preset.
I planned to do without additional lights and use the material as a light source. But as it turned out in Unreal 5, such lighting is very dim. When the brightness of the Emissive color was increased, there was still not enough light, and a lot of artifacts appeared.
Therefore, I adjusted the brightness control using Multiply, made this value a parameter and set it to 5. With this value, the lamps themselves looked quite true. And then I added a Point Light beside each lamp.
A separate task was to adjust the mirror. For the mirror to show the correct reflections, I created a Planar Reflection component around the mirror’s geometry in such a way that it does not cling to the frame, but only to the reflective surface itself.
The Reflection Method also played an important role. Globally in the whole scene, I used the Lumen method. But with this method the reflections in the mirror turned out dark and blurry. So, I created a separate PostProcessVolume for the room and used the Screen Space method. Global Illumination Method remained Lumen.
For rendering, I used one main camera and one additional. I used the second one for hard-to-reach frames with a Focal Length of 12. You can see the settings on the screenshot below.
For each screenshot and video, I created a separate sequence. Then I added a camera to them and animated them using keys. Sequences for static frames were created for several frames.
I rendered the video using the standard Movie Scene Capture in AVI format at 30 fps without compression. I used Movie Render Queue to render screenshots. This is a great way to render at a higher quality than the High-Resolution Screenshot.
I used the Custom Playback Range parameter to select from which to which frame I want to take a screenshot. For this, a sequence was created for several frames for static images. Since the camera may shake slightly in the zero frames of the sequence, to ensure maximum image clarity, I set the value from 1 to 2 frames.
Next, I added Anti-Aliasing with 16 samples to smooth out the edges. I also used the High Resolution setting with 4 tiles. This means that the engine will render 4 parts of the frame separately, and then combine them into one. Note that the Exposure method must be set to Manual to use this setting.
I set an Overlap Ratio of 0.1 for all frames. But since this was not enough for the mirror, and artifacts appeared, I set it to 0.5.
In the end, I combined the rendered videos into one in Adobe Premiere Pro and added sound.
I can highlight the main points of work on the project:
- The jumpsuit of the Squid guards and gloves are completely simulated in Marvelous Designer. Also the bed. Boots were created using 3D scanning in RealityCapture. These were some of the most exciting stages of working on the project.
- While retopology of the character became the longest, but necessary step. The remaining parts of the costume and the interior of the corridor and bedroom are modelled in Maya.
- All textures were created and finalized in Substance Painter.
- I used Maya for rigging, skinning and animation. For such character, I did it for the first time, so there are still many subtleties of the process to be figured out.
- The project was assembled in Unreal Engine 5. The lighting was set up here. A separate task was to set up a correctly working mirror in Unreal Engine 5 for a plot idea.
In conclusion, I want to add that all your most crazy ideas are feasible as long as you burn with them. Combine your passion with the technology you want to learn and you have an absolutely win-win mix.
And of course, don’t forget about time. You can improve your work indefinitely, so make an estimate and follow it. I learned a lot while working on the project and I hope this article was useful to you.
Thank you for reading 🙂