I recently wanted something similar to Blenders maintain volume skinning. I liked the method described in Real-time Skeletal Skinning with Optimized Centers of Rotation by Disney and implemented it in Unity. I’ll abbreviate it as CoR (Centers of Rotation). It’s similar to dual quaternion skinning but without bulging artifacts.
IMPORTANT: Disney research owns the patent for this technique so only use it for research or technical work on a non-commercial basis. I’m not related to Disney in any way. The code has a MIT license.
Normally I’d just add more volume bones on the elbows, knees and twist bones. Then control them with scripts or the new constraint components. Controlling it with scripts reduces the animation size, it can work with humanoid characters and prevents ragdoll or IK issues. The main thing I like about maintain volume skinning is that I can get better results with less work.
This was also my first time trying compute shaders. They’re a lot easier than I was expecting and reduced the preprocessing step from 10 minutes down to about 0.2 seconds. I’m also using a compute shader for skinning based on Unity Internal-Skinning.compute.
The algorithms performance seems to be similar to standard linear skinning. Unfortunately I can’t get standard linear skinning close to the native implementation even using the Internal-Skinning.compute shader. The bottleneck seems to be getting data from the compute shader. It would probably be faster to just skin it in a material shader (similar to some instanced skinned meshes examples). But then I’d have to modify each material shader.
The sample character is from a modified version of sintel-lite . I only roughly skinned it so it’s not as good as the original. The code from skellington also helped me validate the output.
If it could be used commercial I’d upload it to the asset store as a free asset. I might try contacting Disney’s research lawyers again in a few weeks. Someone from Unity would probably have better luck at contacting them. It would be great if this type of skinning was available as a native skinning method (maybe as an optional package).
To use:
Add SkinnedCor component to a skinned mesh.
Click “Create CoR Asset” button
Extra: set a hd mesh (might help with low res mesh, I don’t use it)
Extra: set weight map image black = linear skinning, white = cor skinning e.g linear skinning on face
Click “Compute Shader Pre Process” (need to click again if the mesh changes)
Run the game, move the “CoR Weight” slider to see the differences between linear (0) and cor skinning (1).
Download: CoR.unitypackage