Hello Everyone!
First off, I’d like to say it was great to meet you all at GDC, even Rob, who wants to get rid of my job :D:
I’ve been running up against a whole slew of slowdowns skinning. We have model changes every few days, and I am wondering if there is a fast and accurate way to transfer weights in 3ds Max, so i don’t have to spend 3 days weighting again (i am not the fastest skinner yet :P), every model change.
I’ve tried using skin weights utility, but i end up having to run through a ton of hand skinning regardless…
The skinWrap modifier offers the most control. You can skin a mesh to a mesh and even convert that skinning to a skin modifier that uses the same bones.
Save/load weights (in the skin modifier) is helpful for meshes with identical topology but different vertex IDs. It also can cope with slighty different topology when “use vertex ID” is turned off.
The skin utilities do almost the same, but I prefer 2. because it doesn’t have to use IDs.
+1 for skinwrap. Play with the settings to get reults that work for you, as well. I think I’ve found that doing it based on Faces, not Verts, works better.
Simply put, we cannot believe that Google is incapable of doing wrong. Indeed its claim to do no evil has a Shakespearian air of protesting too wow powerleveling loudly.
Just to correct, the Skin Utilities are not based on IDs but on positions. ID’s can only be used with Save/Load weights.
The time you run into problems with Skin Utilities is when you are missing some bones that were there in the original model, and not on the one you import the weights onto. That can be fixed if you remove certain bones from Target/Source bones list.
Personally I also prefer skinwrap, but I did find skin utilities to work fine just as well. I would say though that Skin Wrap is still better as it gives some more control over your transfer.
Write a routine yourself. Unfortunately no built in solution is thoroughly customizable for this sort of thing. It isn’t too difficult, having done it and similar things numerous times. you’re basically going to look, for each new vert, for a vert on the old mesh close enough, and use that skinning. If its too far, interpolate by shooting a ray. If you haven’t done aqnything with voxels or barycentric coords, I can give you more details.
[ol]
[li]Most of the work involves using voxels and ray casting. Read up on it at CGTalk, there is too much to it to go into here. Basically, you need to know how to cast a ray, and get the closest vert to a point.
[/li][li]For each vert in your mesh, you look at the target mesh, and grab the closest vert.
[/li][li]If the closest vert is within a certain distance threshold, you want to get the skin weights and apply them to your new vert directly.
[/li][li]If not, you want to cast a ray to the closest point on the mesh.
[/li][li]This will hit a face and return barycentric coordinates for the face hit.
[/li][li]You can use those bary coords to interpolate between the weighting of the three verts on that face.
[/li][li]Again, CGTalk has some great posts about bary coords, I think the MXS has a ton of info as well, enough to figure out what to do.
[/li][/ol]
You can customize the hell out of that basic idea. The routine is entirely custom, so you can do whatever you want with it, that’s why we write it.
So there’s a goo deal there, but it is incredibly versatile- if you haven’t use voxels before, you’ll start to use them everywhere. If you haven’t used bary coords, there are tons of uses as well. If you’re not familiar with scripting skin, you can use that knowledge for all sorts of tools, and use the same code for all sorts of utilities.
What you can do is create a proxy mesh. A mesh with minimum edge loops, this mesh you can skin on the same rig that you have. Since its a very low poly, it shudn’t waste much of ur time. Then whenever u have a new mesh, even if they change the proportion or add something on it, you just have to merge that mesh of urs. tweak the proxy mesh to fit in the model as close as possible( jus like a normal/AO cage), then load the skin on the proxy mesh. And skin wrap on ur model.
Now if u have lots of armors or something that is rigid and is a separate mesh, script that process. Say for instance, leg guard has only lower leg bone, you can add a user defined property as leg = true, or helmet can have head = true. So ur script can check for any user defined property and accordingly add that bone to skin modifier which was added by ur script.
I was working on a script and a work-flow similar to this, but switching jobs and projects kept me busy. I’ll probably start a new topic here once I’ll start working on it again