0
$\begingroup$

I have a face mesh with several lip bones (upper/lower left/right + corners) all parented to a head bone. There used to be eyelids and nose bones which I deleted because I thought it would help Automatic Weight paint accuracy (clearly it didn't). The upper right /lip/ bone's weights are highlighted in the below image and the bone itself is very small and around where the red weights are. Why did AW paint vertices so far away, e.g. clear into the lower AND upper eyelids??? Is there some way to limit how far away from the bone AW paints?

The only related question I could find mentions needing to fix origins and apply rotations/scales/etc. That didn't help my issue, and I'm not sure where origins should ideally be placed. I don't know how to use the Vertex Proximity modifier.

File:

enter image description here

$\endgroup$
5
  • $\begingroup$ Sorry, at first I thought you were saying that the distant vertices were getting painted while you were manually weight painting. Now I think you're saying something about the binding process, specifically with automatic weights. But then, I'm confused, because it wouldn't normally be an issue that "distant" vertices are being influenced after binding a mesh to an armature because ALL vertices will be influenced after binding a mesh to an armature. So when exactly does this issue take place? When binding or when painting? $\endgroup$ – R-800 Mar 18 at 7:26
  • $\begingroup$ I'm unfamiliar with the term "binding". In Object mode, I selected the mesh, then the armature, and hit Ctrl+P -> Armature Deform -> With Auto Weights. $\endgroup$ – Nintendraw Mar 18 at 8:49
  • $\begingroup$ Also, Idk if this version of the file has it, but for some reason, even though the mesh is symmetric, the auto-weights didn't paint the same vertices the same way for mirror bones. On my current copy, the left corner lip bone is weighted to many more vertices than the right. (This makes "mirroring" (replicate location and pattern of) weights even harder--this isn't something I know how to do in Blender already (my attempts seem to flip the weighting), and currently I want to keep the right corner and left upper/lower lip.) $\endgroup$ – Nintendraw Mar 18 at 8:54
  • $\begingroup$ ... Disregard second comment. For some reason, Blender decided to actually cooperate with me on how I read to mirror (weight) vertex groups today??? $\endgroup$ – Nintendraw Mar 18 at 9:03
  • 1
    $\begingroup$ Binding just means what you described: attaching the mesh to the armature. It's interesting to me that you were having this problem where your weights wouldn't paint exactly symmetrically on both sides because I'm having this exact same issue right now and have no idea why. Glad your version of the problem worked itself out, but sorry it resolved itself mysteriously. I would really like to know why this seeming refusal of Blender to weight paint completely symmetrically is happening. $\endgroup$ – R-800 Mar 18 at 13:12
1
$\begingroup$

Autoweights doesn't know which bones are more important and which bones are less important. When it looks at your left cheek, it sees the line described by your head bone ("頭") and it sees the line described by your upper lip bone ("中上唇.L") and it sees that the cheek vertex is closer to the lip bone. So it gets more weight to the lip bone than to the head bone.

It's best to combine auto weights with manual weight painting when autoweights don't give you what you want. That's a fact of life; you're probably not going to get great facial bone weights from autoweights alone. However, there are things you can do to improve the weights autoweights give you.

The first thing to realize is that the entire line of the bone, head to tail, creates the structure used to generate autoweights. If the bone is longer, its weights will extend further. Your facial bones look placed only on the basis of the head, so consider making the bone tail closer to the bone heads.

The second thing to realize is that bones that are close to the mesh surface will get tight, sharp weights that don't spread far. Again, this is the entire line of the bone, not just the head. If you place a nose bone, from tip of nose to forehead, right on the mesh, it will affect a small part of the mesh. If you take that bone and move it deeper into the head, it will affect a larger part of the mesh.

Fourth is to realize that holes matter. Autoweights are contained by the mesh, and can bleed out around edges and holes-- like the side of your face or your eyes. Autoweights work best on manifold meshes. And the directions of your normals matter for the autoweights you'll get.

Finally, a lot of people use "helper bones" to help them create weights. These are bones that are never intended for manipulation, and are placed only to extend the weights of other bones. Here's an example, where I've created a loop of bones around your lips, bones which are ultimately parented to your head bone:

enter image description here

See how that ring of bones helps to contain the lip weights? The bones act as blockers, that prevent the lip bone weights from spreading past them. Because these will never be manipulated, and are children of the head bone, it will act exactly the same as if those bones were part of the head bone. (Although for some exports, it would be wise to eventually collapse all of these weights onto the official head bone-- something that is possible in Blender, but certainly not as easy to do as it could be.)

$\endgroup$
4
  • $\begingroup$ Thanks for the long explanation! As I told R-800, my 3D experience comes from MikuMikuDance, a JP program with far less sophisticated tools and different common/preferred mesh rules (and a different terminology) than Blender. I had no idea bones could be used to "block" other bones' auto-weights from moving past them! Now the Rigify meta-armature makes more sense. For future reference, how could I collapse the extra non-deforming bones together? (How it could be made more efficient is probably too big for comments, but I'm curious now.) $\endgroup$ – Nintendraw Mar 18 at 22:21
  • $\begingroup$ I wish I could mark both of you as answers. I marked you because of a more general explanation of better auto-weight workflow. $\endgroup$ – Nintendraw Mar 18 at 22:27
  • $\begingroup$ @Nintendraw A MMD model is not an autoweighted model (2 or 4 deforming groups maximum in MMD.) The weights are hand painted/assigned. As for dropping weights from these "helper" bones, I think that would be appropriate to ask in a different question. $\endgroup$ – Nathan Mar 18 at 22:32
  • $\begingroup$ Of course. Maybe it's a little expected auto-weights would behave differently for models meant for a manual-paint program. Okay! $\endgroup$ – Nintendraw Mar 18 at 22:34
1
$\begingroup$

I finally have a theory. I believe you may be gettting a bone heat weighting error. That happens when you try to bind a mesh to an armature when the mesh is made out of too many different or intersecting parts, and Blender can't figure out how to weight the vertices. I was able to fix this by breaking up all the parts first in Edit Mode with p for the Separate menu, and then Separate by Loose Parts. Then I selected the face mesh and Shift + selected the head mesh, and joined them with Ctrl + j. Then I went into Edit Mode for this new head object and cleaned up this mesh so that the two newly joined mesh parts would be sure to have their verticies merged (Mesh > Cleanup > Merge By Distance). After that, I was able to do the normal binding operation by selecting this new version of the head mesh in Object Mode, Shift + selecting the armature, then Ctrl + p to parent it, and choose Automatic Weights. There were no issues with distant vertices getting bound to the armature.

I recommend that the entire mesh to be bound to the armature is a single, continuous mesh with no other, distinctly separate objects having been prior joined to it. Just as importantly, you should make sure that no other mesh parts are physically colliding or intersecting the mesh anywhere. When they intersect, or are joined together, and then you try to start a binding operation, this issue arises. Your model has eye objects intersecting with one another, and also intersecting with your face. Your face and head have intersecting geometry around the lobe of the ears also. This isn't clean modeling and you don't want it.

When you clean up your model so that all parts are separate (not joined together) and not intersecting one another (not colliding), you will be able to bind those mesh parts to the armature without any problems.

$\endgroup$
2
  • $\begingroup$ Thanks for your answer! tbh, this is an interesting case in point about different programs' functioning. I animate in a JP program called MikuMikuDance (hence the bone names were in JP), and the mesh separations I used are typical for this program where automatic rigging doesn't exist (unless for something like a dress/coat hem via "skirt plugin"); vertices can only be weighted to two bones; and camera manipulation + selection tools are less sophisticated than Blender. (Plus, the physics engine kinda stinks, and it's usually easier to separate/hide the clipping mesh than to fix weights.) $\endgroup$ – Nintendraw Mar 18 at 21:56
  • $\begingroup$ At risk of ranting at you, manual-only rigging is one reason why MMDers might use predictable 20-50-80-100% weights. Incidentally, MMDers might also split meshes so they can assign a really simple texture image, e.g. my sclerae area onto a solid white/subtle gradient image. Single-image, all-encompassing (e.g. ALL the clothes of a given outfit) texture files are uncommon here; it surprised me that for my two-tone athletic coat, I could assign my selected vertices to the other color/material WITHOUT splitting it off first. $\endgroup$ – Nintendraw Mar 18 at 22:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.