Skinner
Skin export / import tools for Autodesk Maya
Install / Use
/learn @AKEric/SkinnerREADME
Table Of Contents
Overview
Skinner is a tool for Autodesk Maya designed to make "exporting and importing skin weights on polygonal mesh fast, easy, and full featured". Having both a consumer-facing UI and scriptable API, it can be fully integrated into a professional production pipeline regardless of industry.
At high level, the Skinner tool works by exporting & importing SkinChunk data, discussed below.
Donate For Usage
As of Feb 2023, Skinner has been open sourced. But the developer would still appreicate any donations you'd like to provide!
Two options:
- https://paypal.me/akpavey
- https://www.buymeacoffee.com/akeric
Suggested donation rate:
- Student / Hobbyist / Indy dev : Free! (but if you want to donate, I won't turn you down)
- Any other production : $25 a user.
Disclaimers
By using/installing Skinner you're accepting all repsonsibilities for its usage, and release me from all liability: See the License.
I have a full time job, this is a side project: I will attempt to address all issues outside of work hours to the best of my abilities.
Export Features
- Can export based on any combination of mesh/joint/vert/transform selection : It’s all converted into per-mesh
SkinChunkinstances for storage. - Can export as many mesh/verts (as
SkinChunkdata) to a single.sknrfile as needed. - Exports both the current worldspace positions/normals for the provided SkinChunk verts, and (as of 1.1.0) the pre-deformed positions/normals (via intermediatObject query). This allows the export to be done without needing to set the asset to the bindpose.
- Can ‘set to bindpose’ before export, or not. Generally not needed, but optional.
Import Features
- Can import from multiple
.sknrfiles at the same time & merge the data: If there is same-namedSkinChunkdata in multiple.sknrfiles, the ones saved 'most recently' win the merge. - Can import onto any combination of mesh/joints/vert/transform selection. They’re all converted into mesh:vert chunks for import.
- Robust logic tree when importing: If the tool can't load in weights based on 1:1 'vert count/vert order' (100% matching topology), it will 'fall back' to an algorithm of your choice to do the work, referred to as the ‘Fallback Skinning Method’ (FSM): It can either be ‘Closest Neighbors’ (a custom algorithm designed for this system, discussed below) or a more basic ‘Closest Point’. Via the API (discussed below), you can even add your own custom 'closest point' function these call on.
- Options to build missing influences (joints), parenting them into existing hierarchies with parent-matched names, or build the joint hierarchy from scratch preserving the original transformational values / attrs / rotate order.
- Can either set to bindpose & unbind pre-existing skinning first, or append to the current skinning (in any pose) on import (see next bullet).
- Option to 'Import Using Pre-Deformed Shape Positions: This allows for skinning to be loaded onto an asset that is in some deformed pose, without needing to set it to bindpose first. But there is an option to 'Set To Bindpose' if desired, but generally isn't needed.
- Can import weights applying a ‘vert normal filter’ that aids in keeping ‘stretching’ verts at bay if there was overlapping mesh during export.
- High level import logic path, regardless if you’re importing onto multiple mesh, or some vertex selection:
- Does a leaf mesh name match a
SkinChunkname?- Yes
- Does the
SkinChunkonly have a single influence joint?- Yes : Skin to that one joint 100%
- No
- Does it have the same vert count/order as the mesh?
- Yes : Import by 1:1 vert IDs
- No : Use that
SkinChunk’s point cloud and import by the ‘FSM’.
- Does it have the same vert count/order as the mesh?
- Does the
- No
- Can a single
SkinChunkbe found with the same vert count/order as the mesh? (presuming this option is set)- Yes : Import by 1:1 vert IDs.
- No : Generate the
UberChunk, using its point cloud, import by the ‘FSM’.
- Can a single
- Yes
- Does a leaf mesh name match a
Other Features
- Supports duplicate mesh names in the Maya scene during import (the tool converts everything to long/absolute paths for import purposes).
- Supports duplicate mesh names in the Maya scene during export, but a
.sknrfile can't store data for mesh with duplicate names (but you could store different.sknrfiles for each). - Supports Maya’s linear, dual-quat, and weight-blended 'Skinning Methods': What state its in during export will be the state applied during import.
- Not so much a feature, but an FYI: Skinner only suppots skinCluster node's who's 'Normalize Weights' value is set to 'Interactive' (1): It does not support 'None' (0), or 'Post' (2). If Skinner encounters such a non-conforming skinCluster, it'll prompt the user to 'auto-convert' it to 'interactive' before the operation is done (v1.0.14). If the user cancels, no work is done. Basically:
skinCluster.normalizeWeights = 1. - Not UV dependent (other skin tools on the market operate on UVs).
- Full featured backend API (fully docstringed with Py3 type hint notation) ready to be plugged into your pipeline code.
- Verbose and robust results printed to the Script Editor / returned by the API for your own pipeline’s consumption.
- Full integration into your teams version control software.
- Introspection/printing of data in the custom
.sknrfile format (binary pickled Python data). - Automated debug test suite you can run to confirm everything is working.
- Speed : Based on testing/profilling against Maya’s Deformer Weights system, while it appears to export at roughly the same speed, it can be up to 5-10x faster on import, and provides substantially more options / ease of use.
- Verbose docstrings for all classes, methods, and functions, to be used with Pythons help function.
Usage Examples
- Integrate into a rebuildable asset pipeline:
- After skinning is performed on your 'SkeletalMesh'/'DeformedMesh' scene, export that Skinner data to disk.
- Update mesh poly counts, names, etc in your ‘StaticMesh’ scene.
- Via your pipeline code, When you regenerate your SkekeletalMesh from the StaticMesh, the Skinner tool handles all the mesh name changes, etc, loading weights onto matching mesh names where it can, and interpolating weights for new mesh / renamed mesh.
- You have good arm skinning in sceneA, and want to copy it to only a section of an arm in sceneB:
- In sceneA, select just the verts you want to copy the skinning data on (could be on multiple mesh), and ‘export temp’.
- In sceneB, select just the verts you want to copy the skinning data on (could be multiple mesh), and ‘import temp’.
- You want to copy skinning off sceneA to sceneB, but you know that sceneA has many joints that sceneB doesn’t:
- That’s ok, just make sure you have ‘build missing influences’ checked during import, and the missing joints will be created/parented into the hierarchy for you.
- You’re copying skinning from one pair of ‘skinny jeans’ to a pair of ‘MC-hammer pants’: After you do, you transform the hip joints, and there are many ‘stretching verts’ between the legs, where the parachute-pants overlap. No problem, reimport with the ‘Vert Normal Filter’ enabled to resolve this.
- You want to copy the weights between two mesh, that are the same topology, but different names, no problem: Make sure “Load by vert count/order” is checked, and it’ll transfer the weights 1:1.
- You can generate a ‘weight depot’ on a server: Update your Skinner export pipeline code to export a
.sknrfile per mesh to the server, with the filename *<leafMeshName>_<vertCount>.sknrduring export. You’ve authored custom wrapper import code that for each mesh, see if it can find a name match in the.sknrfiles : If it does, load that data. If it doesn’t, find all the vertCount matches : For those matches, check and see if the vert order matches, and if so, load that data, regardless of name mismatch. - Something it doesn’t do? Let me know for improvement.
Why this tool
Having built holistic art -> engine pipelines for multiple studios (Visceral/EA, Sledgehammer Games/Activision, 31st Union/2K), part of which include fully procedural rigging solutions and rebuildable static mesh -> skeletal/deformed mesh pipeilnes, one of the biggest areas that is missing in that rebuildable-asset pipeline-subset is a solid/repeat
