How to fix KineFX incorrect weights in shallow space mesh?

   1564   6   2
User Avatar
Member
68 posts
Joined: 9月 2018
Offline
Hi guys,I'm having this issue for a long time. It is even a little troublesome to get the question descript correctly and completely.

Problem:
KineFX can automatically solve the weight on the first pass of rig. However, for a humanoid character, weights on parts like fingers, eyeballs usually cannot get a perfect weight result.
For example:
A.Finger rigging. The index front skeleton will get some weight on the polygons of the index finger's mid polys, as well as polygons on middle finger. That is what will happen if we use standard rigging like this.

I tried to use capture override node to set the index front bone's weight on the polygons of the index finger's front part to one,and set index front bone's weight on polys of theindex finger's mid part to zero. However, if I rotate the index root bone, the polys of index finger's middle part is almost not moving. And the index finger's mid bone is still dragging middle finger's polys. The result is that I need to use a chain of endless capture override node to correct the skinning and still cannot get a good result.

>S1.I used inversed selection to get polys of none-index finger's-front, and set it to zero.
>S2.Then I used selection to get polys of index finger's-front, and set it to one.
>S3.Repeat this step for the index finger's mid.
>S4.Then rotate the index finger's root bone. Mesh almost tears apart (might be index root not having enough weight on it or other finger's bone is affecting it). It seems if checking normalized weights does not affect the outcome

Because I need to know,say, for index finger's mid part, how many bones have weight on it, and for each bone affecting it I have to use a capture override node to correct its weight on it. But there're tens of thousands of polys in a character mesh, the list of upper-stream affecting bones of polys vary because they are at different locations. If I vagely use capture override node to correct it, I im introducing more confusing and complexity to a rigged skin.

I also tried to solve it by capture layer paint, but it sometimes became very slow and sluggish if there are more than 100k polys.


B.Another similar scenario. Eyeball Skinning. So the head's skeleton is like this: Head, L-Eyesocket and R-Eyesocket is the child of Head, L-Eye is the child of L-Eyesocket, R-Eye is the child of R-Eyesocket.
The first standard rig like this will give polygons of eyelid/nose area some weights of the L/R-Eye. Therefore, if i rotate the R-Eye, upper part of the nose and right eyelid is also rotating.
What I tried here is to use capture override node, set the weights of the polygons of eyelid/nose area of the L/R-Eye joint to zero. However, the Head still has a little weight on the polygons of eyelid/nose. So If I rotate the Head joint, polygons of eyelid/nose moves very slightly, thus tearing the face mesh apart.



This lead to a lot of wasted time. If not, I still have to paint over tight space between fingers and spend a lot of time debugging where are the hidden bones affectings this part of the finger. Lot's of frustration.

I don't know if I'm describing the entire set of problem clearly, but I do want to have a walk-around on this.


Sample Scene:
Image Not Found
Edited by goose7 - 2022年8月28日 07:41:29

Attachments:
0Pro_Standard.png (20.4 KB)
0Pro_InFro.png (768.3 KB)
KineRigSkinWeight_Problem.zip (1.7 MB)

User Avatar
Member
63 posts
Joined: 7月 2018
Online
Before we really dive into ways of fixing this after the capture, have you looked at the output of the tetembed? By default, it expands the incoming mesh and the resulting tet mesh gets overlaps, which is what usually causes the problem in the fingers.

You can dial down the mesh enlargement (all the way to 0 if necessary). You can also try a tet conform instead of the tet embed. Each of these result in slightly different weighting and can impact other parts of the capture, but I can usually avoid the annoying overlaps on the fingers you're getting there which results in less post processing of weights (or at least painting on parts of the mesh that are easier to work on).

Let me know if that works and we can move on to the eyes and other stuff.

In general, I usually remove eyes and any facial bones (other than the jaw) before they go into the bone capture lines, so that they aren't weighted. And then I do a second pass of weighting (usually manually, but it can be procedural) for the facial/eye bones.

Lastly, and I know this is not popular in houdini-land, but I still think weights should be hand painted from scratch (if possible) for hero characters. There's lots of places where I use the biharmonic setup, but for hero characters, I still start with 0 weights on everything and make a big pot of tea and start painting. Takes the good part of a day for a complex character, but at the end I KNOW I have clean weights.
madebygeoff.com
User Avatar
Member
68 posts
Joined: 9月 2018
Offline
made-by-geoff
Before we really dive into ways of fixing this after the capture, have you looked at the output of the tetembed? By default, it expands the incoming mesh and the resulting tet mesh gets overlaps, which is what usually causes the problem in the fingers.

You can dial down the mesh enlargement (all the way to 0 if necessary). You can also try a tet conform instead of the tet embed. Each of these result in slightly different weighting and can impact other parts of the capture, but I can usually avoid the annoying overlaps on the fingers you're getting there which results in less post processing of weights (or at least painting on parts of the mesh that are easier to work on).

Let me know if that works and we can move on to the eyes and other stuff.

In general, I usually remove eyes and any facial bones (other than the jaw) before they go into the bone capture lines, so that they aren't weighted. And then I do a second pass of weighting (usually manually, but it can be procedural) for the facial/eye bones.

Lastly, and I know this is not popular in houdini-land, but I still think weights should be hand painted from scratch (if possible) for hero characters. There's lots of places where I use the biharmonic setup, but for hero characters, I still start with 0 weights on everything and make a big pot of tea and start painting. Takes the good part of a day for a complex character, but at the end I KNOW I have clean weights.



Hello, thanks for your advice.
I do reduced mesh enlargement all the way down to 0.2, and that improves the situation on fingers.


What I felt I'm possibly missing is a tool similar to the "adjust envelope of bone" so that I can pre reduce the influence volume of lines(bones)




But I agree, indeed I should consider a clean weight for initializing finger rigging.



For the eyes, I seperate them from body, so I still use capture line and capture biharmonic chain to rig it to the entire skeleton and then use override to fix them. Seems working.
>2nd edition<
However, I don't know why capture layer paint cannot find any region from the output of the bonecapturebiharmonic node (of both blasted eye and body). It pops out warning:Bone capture-Painting with null region.The capture region drop down menu shows zero options.
However, if I use ROP FBX Character output and input to bring back to the scene again, then the capture layer paint node can see the regions..I just..cannot understand why this happens. Confusing softwares..

Rightnow, I'm mostly using
https://www.youtube.com/watch?v=mcDm_irEKb0 [www.youtube.com]
<KineFX for Games | Luiz Kruel | Houdini 18.5 HIVE>
this for kinefx capture pipeline. I felt that I'm missing detailed explanation on those "bone capture xxxxxxx" nodes...
Edited by goose7 - 2022年8月31日 14:33:26

Attachments:
Q3.png (953.9 KB)
q4.png (1022.0 KB)
Q5.png (1.1 MB)

User Avatar
Member
63 posts
Joined: 7月 2018
Online
KineFX, while promising, is still a bit of a work in progress. Most of the tools are there, but it's still a bit counter-intuitive and because it's so newish (added to the fact that Houdini just isn't used a lot for character rigging and animation) there's still not a ton of documentation.

When you reduced the tetembed down to 0.2 and looked at the resulting mesh, were you still getting overlapping geo in the fingers? If you were, it is going to create problems. You can try a few other things:

-- reduce it down further. I've had meshes work at 0.0.
-- try a tetconform instead.
-- try a proximity capture instead of biharmonic (at least for the hands)
-- there's probably also a way to manipulate the bone capture lines to do something similar to adjusting the capture envelope, but I'm not sure off the top of my head. I'd have to poke around.
-- You can always go in and adjust the t-pose mesh so there's a little more space between the middle and ring finger before you do the capture.
-- Or, as I mentioned, remove the fingers from the bone capture lines SOP or try using a capture correct SOP to weight them to 0 and hand paint the fingers.

If you want to post a reduced .hip file, I'll try to take a look this weekend if I have some spare time.
madebygeoff.com
User Avatar
Member
68 posts
Joined: 9月 2018
Offline
made-by-geoff
KineFX, while promising, is still a bit of a work in progress. Most of the tools are there, but it's still a bit counter-intuitive and because it's so newish (added to the fact that Houdini just isn't used a lot for character rigging and animation) there's still not a ton of documentation.

When you reduced the tetembed down to 0.2 and looked at the resulting mesh, were you still getting overlapping geo in the fingers? If you were, it is going to create problems. You can try a few other things:

-- reduce it down further. I've had meshes work at 0.0.
-- try a tetconform instead.
-- try a proximity capture instead of biharmonic (at least for the hands)
-- there's probably also a way to manipulate the bone capture lines to do something similar to adjusting the capture envelope, but I'm not sure off the top of my head. I'd have to poke around.
-- You can always go in and adjust the t-pose mesh so there's a little more space between the middle and ring finger before you do the capture.
-- Or, as I mentioned, remove the fingers from the bone capture lines SOP or try using a capture correct SOP to weight them to 0 and hand paint the fingers.

If you want to post a reduced .hip file, I'll try to take a look this weekend if I have some spare time.

Hi, thanks for the assit.
I've done more tests and comes out with a "can do" solution. Here's what I got in my pipeline:
Since the fingers do have its vertices very close to each other, even reducing tetembed to 0 will not completely solve the overlapping.

I just let the overlapping happen, and then use visibility node to hide all non-right hand meshes, and use paint node, interactive node to manually paint and normalize weights in real time.After I finish one hand, mirror it.

I was thinking about using groups to mask out verticies out of the fingers I am working on. However I found there is probably a memory leak bug which could cause RAM being fully occupied and CTD.
The correction phase is boring, but it is much tolerable than directly painting with the entire character mesh displayed. Backface culling failures always happens and finger weights will be painted to the leg vertices on the otherside of the body.

I'm not deleting fingers in capture nodes, because it actually breaks vertices and introduces other procedures like fusing and re-organizing point number/id
User Avatar
Member
134 posts
Joined: 12月 2006
Offline
Hi, So I just split the hands out and did a simple attrib transfer from the bone lines. I added tips to the fingers, that also helps with the capture. no weight painting
Edited by willh - 2022年11月9日 12:44:10

Attachments:
procedural_weights.jpg (225.5 KB)
KineSkin_Problem_fix.hiplc (4.9 MB)

User Avatar
Member
313 posts
Joined: 10月 2016
Offline
This is a great example of preventing issues rather than fixing issues all the time. More of that please.
Interested in character concepts, modeling, rigging, and animation. Related tool dev with Py and VEX.
  • Quick Links