Toolkit 3D - In-Engine 3D Character Modelling Process
Toolkit 3D - In-Engine 3D Character Modelling Process
This blog will include the timelapse, and timestamps referring to said timelapse with explanations. I normally take screenshots as I work, and annotate those, but I feel that I want to try a different method of documenting my process since screenshots can be disruptive.
Firstly, as a refresher, my final design for my character is below. Normally, I would bring this into the 3D software so I could have the reference there, but I opted not to do this. I find references in ZBrush to be disruptive more than anything towards my workflow, and I prefer working with the reference in another monitor whilst sculpting, rather than it being in the software.
Here is the timelapse, which I will reference when giving a timestamp and explaining my process.
STEP 1: CREATING THE MESH
The Body
For this model, I wanted to push myself out of my comfort zone a lot more than last project. Last time, I heavily relied on Blender, only really using ZBrush for specific, finer details. In an effort to become better with this program, I halted with my original plan of using Blender for the blockout, and instead opted for ZSpheres. From the start of the video to 0:24, my process of creating the general form using Zspheres can be seen. I normally don't really like using them, but they were really efficient and I got better as I used them, understanding them more. After this, I apply adaptive skin onto the mesh and immediately go to ZRemesher it to give it a higher poly count and make it easier to sculpt. Now it was ready for sculpting.
From 0:32 to 1:14, I use a combination of the clay buildup, move and smooth brushes to add more detail to the body. I tried to keep this as light as I could, and that is because the character wears multiple layers of clothes. When I felt I had got the anatomy of the body right, and that it would work for the clothes, I moved onto creating the shape of the head.
From 1:14 to 1:29, I use the same brushes to add the form of the face, neck and head overall. I regularly used a combination of dynamesh and ZRemesher together when I felt I either needed more polys to sculpt, or if the topology was becoming hard to work with.
At 1:30 I use IMM Primitives with symmetry turned on to add capsules on both side of the head. With everything else masked automatically, I move these into place. I then use ZRemesher to give them much more polys, and begin to sculpt them into the ears. I use my regular brushes for the inside of the ears, and then TrimDynamic to sharpen the edges of the ear. I then merge these ears down to the body, and use Dynamesh to fix them to the body and allow me to sculpt the ear into the head.
From 2:06, I begin working on the face again. I add more to the jawline, fix some lines present on the head by smoothing them, and then carve the eye sockets with clay buildup. After I am happy with this, I use IMM again, this time insulting spheres symmetrically into the head. Once they are slotted correctly, I use my regular brushes to sculpt around the eye socket and make look more seated and natural.
I experimented with masking and extracting to create eyelashes, but I eventually decided against this, and instead chose to texture these on. This was just preference.
The Hair
After making some tweaks to the head, at 3:10 I select the CurveTube brush. I intended to use this for the hair strands. At first, it took some getting used to, but I eventually set my mind on a specific workflow - I use CurbeTube to create a hair strand, and then immediately go to the subtool menu and split it into its own. Once I do this, I use Dynamesh, and then begin moving the strand into position. After this, I use a combination of the move, smooth, inflate, pinch and flatten brushes to get the ideal form for that strand. Two extra things important to note - I made the move brush size much bigger to be able to move entire sections of the strand with ease, and I also turned off symmetry for the hair until I got to the back of the hair. This was my entire workflow up until 6:50.
The Clothes
At 6:51, I started by turning the symmetry tool back on, and immediately masking the arms and torso of the character. As seen in my character design, they have an undershirt, which I intended to do first. With the undershirt section masked, I go to the Extract menu in Subtool and begin changing the settings. I wanted a tight fitting undershirt, which I was able to get by doing this. With the Extract done, I finalize it, and immediately mask the area where the coat will go. I do the same process here of extracting it.
With the extractions complete, at 7:06 I swap to the DamStandard brush, and immediately begin creating the folds and creases in the characters clothes. For the undershirt, I did this with symmetry on. Depending on how jagged I wanted the crease to be, I would smooth it down. For the coat, I used move to droop the sleeves down some more, before utilising the same workflow with the DamStandard brush to create the folds and creases. I also created the opening of the coat down the middle with this same brush. I definitely appreciated this brush a lot at this stage in my workflow.
At 8:16, with the top done, I mask the legs and pelvis, and use the same extraction method. I wanted these to appear much baggier, so I used the move and inflate tools to achieve that look. I then began adding creases and folds the same way as before. Even though a waist coat was going to cover most of the legs, I still added detail in order to make this character game ready, as they would most likely be moving around a lot. I kept using Dynamesh and ZRemesher at this stage to make the subtools easier to sculpt on.
Happy with the legs, I moved onto the belt, extracting it the same way as before, and using the same workflow and brushes to add the detail in. This time I was much more restrained with the DamStandard brush though, since it is a belt and the material wouldn't fold like that. When I am done with this, I make some final tweaks to the clothes, and use the Weave brush to add a little detail to the brush. I didn't really mind if this was lost in the Dynameshing later though, since I was planning to use unlit shaders to achieve my art style, with a focus on my cartoon style shading.
At 9:33, I attempt to try and make a waistcoat out of a plane from the IMM basic brush. This was definitely possible, but I feel the end result would be worse than what I did.
At 9:53, I start to use Blender within my workflow, this time only taking up a small minority of the workflow time though. I start with a cylinder, creating the form I needed. After that, I duplicated the cylinder, and used a Boolean difference modifier to create the opening of the waist coat.
At 10:06, I import this back into ZBrush, positioning it properly. I then Dynamesh and ZRemesh to give me more polys to work with. I use the move tool to make something that actually resembled the characters waist coat rather than a cone. I smooth it down, and then use DamStandard to create the folds and creases. After this, I go back to the move brush and make it droopier at the back, as well as just giving it a wavier look overall. I did experiment with some of the cloth brushes to give it some more movement too, the main one to highlight being ClothSlide.
At 10:57, I go back into Blender to create a blockout of the cape, This droops over one shoulder, so I simply used a cube and extruded it in different directions to get the shape. I then import this into ZBrush, and move it into place on the shoulder. I Dynamesh it and ZRemesh it, and then use a combination of ClothMove and Move to create the softer, droopier shape. After that, I use DamStandard again for sharper folds and creases. To give the cape the really wavy look, I use ClothMove and ClothPull, but use a large ClothWind brush too.
The Ponytail
I left the ponytail until after the clothes, So I could be sure it didn't clip into the clothes. At 11:51, I select the CurveTube brush again. Immediately turning off symmetry, I create a giant tube down the back of the character originating at the top of the hair. After dynameshing it, I use the Move, Inflate and Pinch brushes to create the form of it. I then use flatten to make it thinner and more of a giant strand rather than a tube. I then use CurveTube the exact same way as before, creating smaller strands originating from the large ponytail, dynameshing them and giving them more form with the regular brushes. At this point, I did not merge them together. I added more strands and some small tweaks to the hair until 13:40.
The Hands
At 13:56, I begin modelling the hands. I go back to the body subtool, and use the flatten brush to create the hand shape, along with the inflate brush to create the area where the pollicis muscles reside and where the thumb joins to the hand.
At 14:17 I create a folder for all the hair strands to organise my subtools more, since there is going to be even more when I create the fingers. After I have done this, I press insert in the subtool menu, and begin to use Zspheres to create the fingers and thumb of the hand. I create all individual joints like this, and tweak the positioning of the Zspheres a lot until they look right. I wanted my character to have oversized hands, so I was happy with making the fingers big to match the hand. To speed the finger creation workflow up, I would duplicate the finger and move the joins to avoid me starting again each time I needed to create another finger from the Zspheres. After this, I begin using the move tool with symmetry turned on still to move the body mesh into position where the fingers line up properly. I also sculpt the palm of the hand, and give the knuckles general shape.
At 15:02, I begin to use adaptive skin on each of the fingers of the hand, making sure the density is right to start sculpting with. I also duplicate all the fingers, and move them to the other side of the body using the mirror button. I would've done this with symmetry, but that only works for anything coming from a Zsphere, not the first Zsphere itself. Once I am happy with the fingers, I use Dynamesh to join the fingers to the body. I make sure to increase the resolution so the fingers don't try to join to each other.
At 15:57, I begin using ClayBuildup, Smooth and Move to fix the hands and make it look like one uniform mesh now. I also use Move to push the fingers back and make them shorter, and I do this all in one go by making the brush size bigger.
The Feet and Shoes
At 16:42, I begin using Flatten, Move and Smooth to create the base of the feet. These don't need to be detailed, as shoes will quickly be covering them. I then mask the feet, and extract with a higher thickness than I used for the clothes to make the base for the shoes.
At 17:19, I use flatten to add more dimensions to the shoes. In retrospect, I wish I had used polygroups here, since It would have been much easier to move regions of the shoes around and create a better shoe shape overall. I use pinch to add more hard edges to the shoe. I then extract the top and bottom of the shoes to create the top rim and the soles of the shoe. I smooth these down and flatten them down more, being mindful to not clip into the base of the shoe underneath. I didn't really feel this worked for the soles, so I went back and instead opted to insert a cube and work with that for the sole instead, since it already has hard edges and an easy underside to work with. I move this into place with the transpose tools, Dynamesh it, and then immediately begin using the Move brush to push it into position again. I also go back to the body and use DamStandard to create socks on the ankles. I also add a few more details to the shoes with the aforementioned brushes.
Final Details
At 18:18, I use IMM Basic to insert a plane. I use the transpose tools to size this properly and move it into position. I wanted this to be the lanyard coming from the belt, and I had a really good idea to do it without going into an even higher polycount. I made it really long, and then used the Move brush to move it into place on the belt, opting to Dynamesh it when the topology got hard to work with. To create the smaller part, I just duplicated the original, resized it, and then used the Move brush to make it look different.
At 18:44, I went back into Blender to begin making the vials. I started with a cylinder, making it longer, and used loop cut to create a ring at the top, which I then extruded to create the cap of the vial. I also used bevel at the bottom of the vial to create the curve. I then duplicated this vial three times. Instead of doing this, I should've used the array modifier in Blender to make my workflow more efficient, since it would've done that process for me quicker and more accurately.
Importing the vials back into ZBrush, I import one vial, and end up just duplicating it here. I position it properly, before selecting the front of belt where the buckle should be, and importing that into Blender. I then use a cube to create the buckle with a combination of extrusions and Booleans to cut out the interior. I then brought this back into ZBrush and positioned it correctly.
So, there is a very noticeable problem here that is actually going to be a reoccurring problem, and one I only realise later. You may have noticed that when I imported the belt buckle, the cape disappeared.
I was using a combination of the plugins GoB for Blender, which allowed me to export to ZBrush, and GoZ for Zbrush, which allowed me to export to Blender. Something I didn't realise was that if something is called the same name as the thing you are importing into ZBrush, it WILL overwrite it with no prompt or warning. This happened multiple times. When it happened with the cape I luckily had it saved, but I wasn't so fortunate with the vials, which meant I had to restart it. A valuable lesson here was to always name my subtools!
Anyway, at 19:21 I begin using a combination of my regular brushes to create a part of the belt the vials can sit within.
Going back to Blender, I begin creating a flower pin for the head, using simple extrusions and moving the faces to fit. After bringing it back into ZBrush, I move it into position and tweak with it.
(At this point I was looking for where both my cape and vials had gone. Suffice to say, I have learned my lesson the hard way.)
Bringing the Polycount Down
At 20:17, I was really happy with the model, so I began to go through each individual subtool and use ZRemesher to bring the polycount down without it noticeably affecting the mesh too much. This wasn't really interesting, and didn't have much input other than me clicking a button. I wanted to keep doing this so it meant that it was easier to work with the model later.
A problem I ran into here was that when I merged the hair, it wouldn't let me Dynamesh it. Rather than try to fix the issue, I separated the strands and Dynameshed them that way. In turn, I actually did find another issue, that being some of the strands having twisted polygons. For these, I simply remade them. I think doing this was not good in terms of technical skill, but definitely was beneficial for the speed of my workflow.
I also deleted parts of the body and undershirt you couldn't see to drastically cut down on the overall polycount.
Eventually, I finished, and exported my model for Blender for the next steps.
STEP 2: TEXTURING
To start off with, most of my model was going to have simple colour blocks for their UVs. This means I could focus much less on the UV map as I would have to otherwise. For the areas that mattered, I used a combination of project from view and the other UV tools within Blender to create my UV maps. I drew my textures by hand on Clip Studio Paint, and imported them into Blender to be used within the materials assigned to my mesh.
Due to my subtools being separated here, my workflow boiled down to isolating one, importing the texture map, creating a material with the emission shader and the texture assigned, and then mapping the UV by projecting it from view. After the UV had been fully mapped, I would export the UV layout, and draw underneath it, before bringing it back into Blender and updating the texture. This workflow ensures the textures fit exactly, even if it is more time consuming. Also, on that same note, if a model could have the mirror modifier applied to it to make the UV process even easier (E.G. the head) then I would do it.
(I should also mention the moments where nothing is happening is me drawing the textures. I forgot to record that window.)
This was the workflow I used between 22:18 and 29:21. I also kept the hair one solid colour as I wanted to give it a simplified, cartoony look, so I didn't UV map that with the intent to shade it.
STEP 3: RIGGING
Within Blender, there are a variety of ways to rig. The way I opted for uses the addon Rigify, which helps applying it to a model. Because my character is a humanoid, this speeds up my workflow a lot.
At 29:23, I import a human meta-rig. Because, I don't intend on using the facial muscles, I immediately go into edit mode and delete them. I then align my model and the rig on the axis, sizing them correctly to each other. I then turn X-Ray mode on, also turning symmetry on, before going into edit mode and moving the bones and joints to the correct place. Orthographic view was a huge help here.
After lining everything up properly, including the fingers and the feet bones, I parented the rig to the model group. I then applied the rig with automatic weights. It's important to note I ONLY used automatic weights as a base and was not going into this relying on them, since they were more likely than not going to be wrong, due to my character having a waistcoat and a large ponytail.
After applying the rig, things were worse than I expected, the arms bent awfully, and the weight painting on the waist coat and cape seemed to be assigned to everything for some reason? It was very evident I was going to have to make several tweaks to the model and to the rig, before even getting to the weight painting part. The worst part about this was the hand rig worked perfectly, and the fingers and joints bent well, which I'm proud of, but I didn't even end up using the rigged hands in the final version due to the rig I ended up using.
After moving some bones around within the rig, I eventually went into weight painting mode, and began to paint the head with the assigned head bone. I painted it fully red as for some reason it didn't automatically assign anything to the hair. After this, it worked. At this point, I had forgotten to work on deleting the inner faces of the model, as that was probably contributing to the barely functioning rig.
I deleted some hidden faces on the shoulders of the character, but the rig seemed to still barely be working. Because of this, I started from scratch.
31:43, I picked a basic rig this time, that doesn't start with any bones for the hands or the face. I did the same thing as last time, aligning the rig with the model and positioning all the bones properly. As soon as I did this, I assigned it with automatic weights, and then immediately got to weight painting.
Honestly in hindsight, it might've been easier to work with no weights being automatically assigned. This is because the automatic torso weights were terrible, and I had to basically overhaul the entire weight paints because of it. As seen in the timelapse, every time I would complete a portion of weight painting, I would immediately smooth the gradient out properly so that it moved fluidly. I would also go into pose mode and test the joints out that way. This was the workflow I used for the entirety of rigging, as well as cleaning up the mess on the torso left by automatic weights.
After the model had been rigged, I deleted a lot of inside faces, making the overall topology better, as well as moved onto baking the textures.
For baking, I duplicated my model, created a new material with Principled BSDF applied, and made an empty image texture. I then baked into combined, ending with the final result. This took a little bit of trial and error with the baking types within Blender.
Unreal Renders
Here are my Unreal Engine Renders from when I imported the rigged and posed model into it. A turnaround can be found at the end of the YouTube video too.
Final Thoughts
Now that I am finished with this project, I can safely say this has been one of the biggest challenges from University so far for me. I am only barely comfortable with hard surface modelling with Maya or Blender, and sculpting is like a completely different subject when compared to hard surface modelling. That being said, I am really happy I pushed myself out of my comfort zone, taking strides in creating my ideal workflow with sculpting, making sure the ZBrush to Blender workflow has a good ratio (This time mostly being ZBrush), and speeding my workflow up too. I spent the most time on this project BY FAR when compared to the others, due to my own confidence in ZBrush within the greater 3D pipeline. I cannot count how many times I failed to make a good start on the sculpt and scrapped the progress. This combined with the fact that a lot of what you do in ZBrush is final (For example merging subtools), and not undoable. I also wish I had attempted retopology in a better way, maybe by using the decimate modifier within ZBrush before moving to Blender.
Overall, I feel much more confident now, and feel like despite my problems and troubles I have had, I have succeeded in making a game-ready character that I am happy with. Next year, and over the summer, I plan to practice ZBrush more as well as sculpting as a whole.
My model can also be found here: https://skfb.ly/pwLDG






Comments
Post a Comment