Polygon2D Skeleton Deformation

Godot Version

4.2

Question

I’m struggling with correctly subdividing and assigning bone weights to Polygon2D. Per the docs, you add internal vertices where you want it to bend, and then “experiment” (2D skeletons — Godot Engine (stable) documentation in English).

I’ve been doing this in a couple projects now and I’m finding it requires a lot of trial and error to get usable results. I really appreciate that this feature is available in Godot, but the open issues with the Polygon2D UX makes it very slow to iterate with. It would save a lot of time if I had a better idea how to set it up from the beginning. Things like: how the engine decides which polygons to deform when bones are rotated, where I should be assigning different bone weights for what result, when vertices should be influenced by multiple bones and when by just one, and when to use non-triangle shapes.

For example, I’m currently working on an elbow in a humanoid creature. I was initially using cutout animation for the arm, but I get residual visible pieces and gaps when it bends past 90 degrees, so I think deformation with Polygon2D is the better option. But I keep getting unwanted deformations of the upper and lower arm, not just the elbow.

I know mesh deformation with skeletons isn’t specific to Godot, so any general beginner’s reference for skeleton mesh deformation would probably be helpful for me, even if it’s for another program. But I’m not finding what I need with Google/Youtube searches.

Can anyone point me in the right direction? Thank you!

Edit: I have an imperfect but good enough setup for the elbow through trial and error, so I’m not looking for a solution to that specific problem. What I’m trying to figure out is what factors the engine is considering when propagating bone transforms (particularly rotation), so I can set it up better from the beginning and not rely so much on trial and error (since every change in the Polygon2D editor requires redoing other parts of the setup).

1 Like

I tried to mark this a solved, but I think it might be too late to edit it? (Edit: No, it worked!) In any case, I posted my findings from trial and error in this post here, and would still appreciate any additional tips and tricks over on that post.