How can I properly weight paint a mesh that has a thickness to it?
I created a jacket and then added and applied a solidify modifier to give it some thickness. When I parent the jacket to my rig with automatic weights, the mesh’s two sides have varying amounts of weight paint.
Ideally, both sides of the jacket should be equivalent.
In the example screenshot, you can see how the inside of the sleeve is light blue whereas the outside faces are red.
When I pose the model in certain positions, the inner faces poke out of the out faces.
Is there an automatic way of correcting this? The only manual method that I know of is manually repainting the weights with “front faces only” disabled.
Here, the dark orange texture on the side is actually the inner faces poking through. The entire jacket should be yellow on the outside (except for the blue accents on the sleeves).
The best thing to have done would be to not have applied the solidify modifier. If you’re rendering in Blender, the best time to evaluate the solidify is after the armature. If you’re rendering elsewhere, the best time to evaluate the solidify modifier is after having painted weights.
Solidify includes a few nice tools now (UV offset, VG assignment for generated verts) that should make it easier to keep track of what were the solidified verts, so that you can more easily undo the solidify. If you ever have to apply a solidify, I’d think about using that. (UV offset of 1.0 makes it nice and easy to select shell verts…)
I say that because one thing you can do here is duplicate the mesh, delete the solidified verts incl. rim, and data transfer weights from your duplicate to the original on nearest face interpolated. That should give you identical weights on the inner as on the outer (which is just about what you want.)
edit: oops, no UV offset on solidify, I was thinking of array. But there is material offset and assignment to VG, which can do the same thing.
Thanks for the suggestion! I tried out the suggested workflow and it seems to work quite well!
I duplicated the mesh, selected the ring of faces created by the solidify modifier, deleted them, and then deleted the connected vertices for the “inner faces”.
I added a new solidify modifier to the duped mesh without applying it. I parented this to the armature.
I then deleted all of the vertex groups on the original mesh, selected it first and then selected the duped mesh. I then went to weight painting and selected “transfer weights” followed by Source Layers Selection > “By Name”.
I then hid/deleted the duped mesh.
This gave great results for the armature’s side. The arms were a bit trickier - probably because it’s not as smooth. However, I could easily weight paint that with the manual method with large, straight brush strokes.
Yeah, identical weights aren’t necessarily exactly what you want, just close enough.
If you’re autoweighting, something that would work a little bit bettter:
Rip the solidified surface to a new object
Reverse normals on the solidified surface, autoweight
Autoweight main surface
Re-reverse normals on solidified surface, rejoin to main surface, merge doubled verts
Basically what happens is that autoweights give more diffuse weights to distant surfaces and sharper weights to closer surfaces, but use the direction of normals to determine the weights. The way that the weights are diffuse-on-distant or sharp-on-near helps prevent clipping. The above technique is a way to trick the autoweights into giving you the weights you want.