Geodesic Voxel Binding in Maya 2015
If you’re like me, your ears will perk up at any technology promising a better initial skin bind. So I decided to take a look at the new geodesic voxel binding in Maya 2015, I couldn’t find much information about it online, so I decided to do the usual and write the post I would have wanted to find when I googled. I hope it’s useful.
Background
This new way of skin binding was presented by Autodesk at SIGGRAPH 2013.
Here’s a link to the SIGGRAPH 2013 white paper: Geodesic Voxel Binding for Production Character Meshes, definitely worth checking out. I do like how Autodesk is now using the word ‘Production’ a lot more. It seems they are no longer using simple test cases to test pipelines and workflows. Above, they used our Nanosuit, from the Crysis franchise. Here’s the full video that accompanies the talk: [LINK]
How It Works
The basic idea is that it voxelizes characters into three types of voxels, skeleton, interior, and boundary. This way it tries to eliminate cross-talk. At ILM we had a binding solution in Zeno that used mesh normals and this eliminated crosstalk between manifold parts like fingers, but most of this paper focuses on skinning non-manifold meshes, meshes with intersecting parts, open holes, etc.
In Practice
Here’s the hand of the Marius bust we send out for rigging tests, notice when skinned with Closest in Hierarchy, there is some significant crosstalk:
Here’s an initial finger bind with the new algorithm, there’s still some crosstalk at 1024voxel resolution (highest possible), but it’s much better:
As someone who is very nitpicky about my skinning, *any* crosstalk at all is unacceptable, and it takes me about the same amount of time to clean the tiniest values as it does these larger ones. Here’s a closer look at some of the crosstalk from the ‘gb’ binding:
Crosstalk isn’t just bad for deformation, but these tiny little values are inefficient and sloppy, especially if you are sending it to a game engine.
Another area that requires significant cleanup is the underarm area where the serratus anterior lies, here I thought the new approach would work very well, unfortunately the binding didn’t have a noticeable difference from previous methods.
Few things are more difficult to skin than the human face. Here you can see traditional vs geodesic. I will say it’s definitely better than the old bind, but still has issues. This is one of the first initial skin binds on a closed-mouth neutral bindpose I have seen that has no cross-talk on one lip. I tweaked the falloffs doing three different binds on the traditional on the left.
Multi-Threaded?
Another thing I like is a hint at a multi-threaded future. The binding process (voxel calculation, etc) is multi-threaded. At Crytek, we even make hardware purchasing decisions based on Maya not being multi-threaded. We get animators the fastest 2 core CPUs, this allows them better interactive framerates, and still a second core for a headless mayapy to export a long linear cutscene or animation. It’s nice to see Autodesk begin to think about multi-threading tools and processes.
In Conclusion
The new Geodesic Bind algorithm from Autodesk is a step forward. There’s still no free lunch, but I will be using this as my default bind in the future. I will update this post if I run into any problems or benefits not outlined here. It would be great if there was a voxel debug view, or the ability to dynamically drive voxel resolution with an input like vertex colors a map, or polygon density.
Backwards Compatibility: New Nodes and Attrs
If you just want to use the latest Maya to try the feature, here are some gotchas. There is a new geomBind node, and some attributes on shape nodes:
// Error: file: C:/Users/chris/Desktop/TechAnimationTest/TechAnimationTest/Head_Mesh_skin.ma line 28725: The skinCluster ‘skinCluster1’ has no ‘gb’ attribute. //
// Warning: file:Â C:/Users/chris/Desktop/crytek_sdk_head_a/head_a.ma line 27464: Unrecognized node type ‘geomBind’; preserving node information during this session. //
// Error: file: C:/Users/chris/Desktop/crytek_sdk_head_a/head_a.ma line 34: The mesh ‘eyes_MSH’ has no ‘.sdt’ attribute. //
The geomBind node stores ‘the post voxel validation state performed during the geodesic voxel bind algorithm.’ and some other attributes. It has a message attr that connects to a skinCluster. The SDT attr on shapes is not related to skinning, it is a new ‘Subdivision Method’ attr for the openSubDiv support.
The above said, it seems to work fine for me if I just delete that stuff, the skin weights are fine.
I wonder if it’s because of some subtle issues with the bounding volume of the voxel grid being too large or something like that. My feeling is this should work better 🙂
Is there a way to visualize the grid or is it all a magic box?
Comment by Axel — 2014/07/07 @ 2:01 AM
Could be that it’s the usual first implementation.. :/
btw: “…so I decided to do the usual and write the post I would have wanted to find when I googled…” Very good approach!!! ;D
Comment by ëRiC — 2014/07/07 @ 4:45 PM
I love the geodesic results except that the joints HAVE to be inside the geometry. on one character with thin ears so I have to move my skinning joints intot he geometry or inflate the geometry to get the skin weights, export the weights, then undo the geometry change.
if there were some way to have a radius extend the outside surface to surviel the surface for any joints not selected or use the radius value on the joint as a “hint” it would be the best skinning methond on the planet. Thanks for this post!
Comment by Geordie — 2014/07/10 @ 12:15 AM
@Gordie – Heatmap really required this! In the early days of Ryse when we were prototyping the Marius face, I had to reskin the damn thing a lot, I had a pose that moved the joints into the face to skin then back out, baking and unbaking the skin weights.
Comment by admin — 2014/07/10 @ 1:38 AM
Doesn’t look multithreaded on Linux…
Comment by jacko — 2014/07/25 @ 8:55 AM