In the production pipeline, how to handle the problem that skinCluster deformations at large distances from origin?

by yaoyansi posted 261 days ago | 3 comments

Hi all,

The problem that skinCluster deformations at large distances from origin seems to be a common problem. It had been reported officially here, attributed to losing numerical precision.

There are many discussions on this problem on the websites, such as:

1.here

2.here

It seems that those discussions and solutions, if I didn't miss any others, can be classified into two categories:

1)by using blendshape and

2)by connecting joint.worldInverseMatrix to multMatrix.matrixIn.

My questions are:

  1. Are these two methods robust enough to be used in the production pipeline? Do they have good performance? For example, for the first method, a new skeleton will be cloned from the original one. Will this method ruin the performance of Maya in the production? For the second method, one multMatrix node is created for each joint. Will these multMatrix nodes ruin the performance of Maya in the production?

  2. If the above two methods are not good enough to be applied to the production, how do you handle this problem in your production pipeline?

Cheers

Yao

by niels posted 259 days ago

​ ​While I think all mentioned methods would work, I've never heard of any production using one of them. (This might of course just be my limited experience.) These situations usually come up only once in a while and accounting for them in every single rig by wasting (a little) performance is often not worth it. The only solution I've actually seen in production is "trying to keep things close to the origin". Let me explain: The easiest situation would be if a more or less stationary character just "happens" to be 1 million units from the origin. That can easily be remedied by translating character, set and camera to the origin. No performance impact on the scene. You might need to keep track of your offset in case it matters later. Things get a little harder if a character moves 1 million units in one shot. In that case all you really care about is the motion of the character relative to the camera. Example: The camera follows the character at the same speed. That means the character appears motionless and could as well stay in the origin. Usually the situation is a little more complicated so you would use the inverse motion of the camera, subtract that from the motion of the character and the set and then keep the camera in the origin. That should keep things pretty close to the origin. And best of all: You don't even need to do this in the animation scene (unless the results jitter so much that animation isn't possible anymore). If all you want is eliminating the precision issues for rendering and motion blur, you could use this technique while caching your scene for rendering keeping your animation scene lighter and faster.

But if I had to pick from the solutions above I would also go for using the inverse matrix on the transform and not applying another blendShape deformer.

Hope that helps and please let me know if I got anything wrong.

by vshotarov posted 260 days ago

That's a really good question!

I would personally go for the multMatrix solution any day. It just makes a lot more sense in my head to keep the skinCluster local and then use a simple transform to offset it to the large distance, rather than relying on a deformer.

Also, I think that in terms of performance this should be more efficient than the blendShape, but it's just a speculation. I suppose that if you have a huge amount of joints then the difference might be negligible, though.

The reason I think so, is because I believe that having a blendShape will create another step in the deformation order, which means waiting around, while the joint matrices can be evaluated at the same time.

Another solution I have heard of is using a tool that recalculates the origin of the scene, but I would imagine that managing something like that can be quite complex depending on what solutions there are there for describing the environment.

I'm really interested to see if people have any other tips/solutions!

by macky posted 254 days ago

We used a matrix mult for a fairly large production recently at Animal. It worked just fine as a solution considering the deadlines/restrictions we were under at the time. Problem is you should do this as part of your rig prep for delivery, as the localization of the skinCluster using this approach interferes with the native tools in Maya (Paint weights etc) and you'll run into all kinds of fun trying to touch up skins etc after you have localized.